group_mixer 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a835a59f09e9161725341af2f34130dbb5e86b33
4
- data.tar.gz: e0af0ea15926b2af38a53f11507f3140d26f6029
3
+ metadata.gz: f7caf9618c7138a93c346abf2bf6e49f0e29485a
4
+ data.tar.gz: 4f81a0ada0d4213a8b274b57311ed7ce6e30ddd9
5
5
  SHA512:
6
- metadata.gz: c4fae5e6e48c9257ef761af1b43420c038106237989b915209982915e921dcf165abc40d75f4333cf1717dd1322970a755b5ec57c92c570e5b913bbf149d2db9
7
- data.tar.gz: 9b03616081b1c3740229d9edc7575617eed74f67faec392f6163da0ee0ba264043e410860a8e31610e7dd61706be8ba2e695cbc18412ee8656a264fab0cd45fd
6
+ metadata.gz: 742eb41f5830c2a210c6b6255f635b1da4009ffb4679085a646c62337b989028b5d07104406bc61f0ff32de691360b398bf231fadf3e3873e5907411f48074d1
7
+ data.tar.gz: 7694cf9b56fd426d64a2512ba04ed5fa61b1c71ea6b9ee11e206a039736c6edc78b11e8d053b1e0c8c8667804ef2637f60ed2232472b44b5fab0220286a301e6
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- group_mixer (0.1.1)
4
+ group_mixer (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/lib/group_mixer.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "group_mixer/version"
2
2
  require "group_mixer/mixer"
3
+ require "group_mixer/weighted_group"
3
4
 
4
5
  module GroupMixer
5
6
  def self.by_group_size(people, past_set, group_size)
@@ -1,70 +1,73 @@
1
1
  require "group_mixer/group"
2
+ require "group_mixer/weighted_group"
2
3
 
3
- class Mixer
4
- MAX_AMOUNT = 2 ** ([42].pack('i').size * 16 - 2) - 1
4
+ module GroupMixer
5
+ class Mixer
6
+ MAX_AMOUNT = 2 ** ([42].pack('i').size * 16 - 2) - 1
5
7
 
6
- def initialize(people, past_set, group_size)
7
- @people = people
8
- @past_set = past_set
9
- min_member_size, max_group_size = people.size.divmod group_size
10
- @groups = make_groups(group_size, max_group_size, min_member_size)
11
- end
8
+ def initialize(people, past_set, group_size)
9
+ @people = people
10
+ @past_groups = past_set.map { |s| s.is_a?(WeightedGroup) ? s : WeightedGroup.new(s) }
11
+ min_member_size, max_group_size = people.size.divmod group_size
12
+ @groups = make_groups(group_size, max_group_size, min_member_size)
13
+ end
12
14
 
13
- def execute
14
- links = make_heuristic_from_past(@people, @past_set)
15
- link_amount_hash = make_link_amount_hash(@people, links)
15
+ def execute
16
+ links = make_heuristic_from_past(@people, @past_groups)
17
+ link_amount_hash = make_link_amount_hash(@people, links)
16
18
 
17
- link_amount_hash.sort { |a, b| b[1]<=>a[1] }.each do |person, amount|
18
- select_group(@groups, person, links).add person
19
- end
19
+ link_amount_hash.sort { |a, b| b[1]<=>a[1] }.each do |person, amount|
20
+ select_group(@groups, person, links).add person
21
+ end
20
22
 
21
- @groups.map(&:members)
22
- end
23
+ @groups.map(&:members)
24
+ end
23
25
 
24
- private
26
+ private
25
27
 
26
- def make_groups(group_size, max_group_size, min_member_size)
27
- max_group_size.times.map { |n| GroupMixer::Group.new(min_member_size + 1) } +
28
- (group_size - max_group_size).times.map { |n| GroupMixer::Group.new(min_member_size) }
29
- end
28
+ def make_groups(group_size, max_group_size, min_member_size)
29
+ max_group_size.times.map { |n| Group.new(min_member_size + 1) } +
30
+ (group_size - max_group_size).times.map { |n| Group.new(min_member_size) }
31
+ end
30
32
 
31
- def make_heuristic_from_past(people, past_set)
32
- past_pheromone = Hash.new(0)
33
- past_set.each do |past|
34
- past.combination(2).each do |pair|
35
- if people.include?(pair[0]) && people.include?(pair[1])
36
- past_pheromone[Set.new(pair)] += 1
33
+ def make_heuristic_from_past(people, past_set)
34
+ past_pheromone = Hash.new(0)
35
+ past_set.each do |past|
36
+ past.members.to_a.combination(2).each do |pair|
37
+ if people.include?(pair[0]) && people.include?(pair[1])
38
+ past_pheromone[Set.new(pair)] += past.weight
39
+ end
37
40
  end
38
41
  end
42
+ past_pheromone
39
43
  end
40
- past_pheromone
41
- end
42
44
 
43
- def make_link_amount_hash(people, links)
44
- people.each_with_object(Hash.new) do |person, hash|
45
- hash[person] = links.select { |pair, value| pair.member? person }
46
- .map { |pair, value| value }
47
- .inject(0) { |sum, value| sum += value }
45
+ def make_link_amount_hash(people, links)
46
+ people.each_with_object(Hash.new) do |person, hash|
47
+ hash[person] = links.select { |pair, value| pair.member? person }
48
+ .map { |pair, value| value }
49
+ .inject(0) { |sum, value| sum += value }
50
+ end
48
51
  end
49
- end
50
52
 
51
- def select_group(groups, person, links)
52
- group_relevance = get_group_relevance(groups, person, links)
53
- min_relevence = group_relevance.min{ |x, y| x[1] <=> y[1] }[1]
54
- min_relevence_groups = group_relevance.select { |g, v| v == min_relevence }.keys
55
- max_relevence_group_size = min_relevence_groups.max{ |x, y|
56
- x.members.size <=> y.members.size
57
- }.members.size
58
- min_relevence_groups.select { |g| g.members.size == max_relevence_group_size }.sample
59
- end
53
+ def select_group(groups, person, links)
54
+ group_relevance = get_group_relevance(groups, person, links)
55
+ min_relevence = group_relevance.min{ |x, y| x[1] <=> y[1] }[1]
56
+ min_relevence_groups = group_relevance.select { |g, v| v == min_relevence }.keys
57
+ max_relevence_group_size = min_relevence_groups.max{ |x, y|
58
+ x.members.size <=> y.members.size
59
+ }.members.size
60
+ min_relevence_groups.select { |g| g.members.size == max_relevence_group_size }.sample
61
+ end
60
62
 
61
- def get_group_relevance(groups, person, links)
62
- groups.each_with_object(Hash.new) { |g, hash|
63
- if g.full?
64
- hash[g] = MAX_AMOUNT
65
- else
66
- hash[g] = g.inject(0) { |sum, m| sum += links[Set[m, person]].to_i }
67
- end
68
- }
63
+ def get_group_relevance(groups, person, links)
64
+ groups.each_with_object(Hash.new) { |g, hash|
65
+ if g.full?
66
+ hash[g] = MAX_AMOUNT
67
+ else
68
+ hash[g] = g.inject(0) { |sum, m| sum += links[Set[m, person]].to_i }
69
+ end
70
+ }
71
+ end
69
72
  end
70
73
  end
@@ -1,3 +1,3 @@
1
1
  module GroupMixer
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -0,0 +1,16 @@
1
+ require 'set'
2
+
3
+ module GroupMixer
4
+ class WeightedGroup
5
+ include Enumerable
6
+ extend Forwardable
7
+
8
+ def initialize(members=[], weight=1)
9
+ @members = Set.new(members)
10
+ @weight = weight
11
+ end
12
+
13
+ def_delegators :@members, :size, :each
14
+ attr_reader :members, :weight
15
+ end
16
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: group_mixer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - iwtn
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-11-29 00:00:00.000000000 Z
11
+ date: 2017-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -75,6 +75,7 @@ files:
75
75
  - lib/group_mixer/group.rb
76
76
  - lib/group_mixer/mixer.rb
77
77
  - lib/group_mixer/version.rb
78
+ - lib/group_mixer/weighted_group.rb
78
79
  homepage: https://github.com/iwtn/group_mixer
79
80
  licenses:
80
81
  - MIT