group_mixer 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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