class GroupMixer::Mixer
Constants
- MAX_AMOUNT
Public Class Methods
new(people, past_set, groups, is_separate_reminders)
click to toggle source
# File lib/group_mixer/mixer.rb, line 8 def initialize(people, past_set, groups, is_separate_reminders) @people = people.shuffle @groups = groups @past_groups = past_set.to_a.map { |s| s.is_a?(WeightedGroup) ? s : WeightedGroup.new(s) } end
Public Instance Methods
execute()
click to toggle source
# File lib/group_mixer/mixer.rb, line 14 def execute links = make_heuristic_from_past(@people, @past_groups) link_amount_hash = make_link_amount_hash(@people, links) link_amount_hash.sort { |a, b| b[1]<=>a[1] }.each do |person, amount| select_group(@groups, person, links).add person end @groups.map(&:members) end
Private Instance Methods
group_relevance(groups, person, links)
click to toggle source
# File lib/group_mixer/mixer.rb, line 53 def group_relevance(groups, person, links) groups.each_with_object(Hash.new) { |g, hash| hash[g] = g.full? ? MAX_AMOUNT : g.inject(0) { |sum, m| sum += links[Set[m, person]].to_i } } end
make_heuristic_from_past(people, past_set)
click to toggle source
# File lib/group_mixer/mixer.rb, line 27 def make_heuristic_from_past(people, past_set) past_set.each_with_object(Hash.new(0)) { |past, pheromone| past.members.to_a.combination(2).each do |pair| pheromone[Set.new(pair)] += past.weight if (people & pair).size > 1 end } end
make_link_amount_hash(people, links)
click to toggle source
# File lib/group_mixer/mixer.rb, line 35 def make_link_amount_hash(people, links) people.each_with_object(Hash.new) { |person, hash| hash[person] = links.select { |pair, value| pair.member? person } .map { |pair, value| value } .inject(0) { |sum, value| sum += value } } end
select_group(groups, person, links)
click to toggle source
# File lib/group_mixer/mixer.rb, line 43 def select_group(groups, person, links) relevances = group_relevance(groups, person, links) min_relevence = relevances.min{ |x, y| x[1] <=> y[1] }[1] min_relevence_groups = relevances.select { |g, v| v == min_relevence }.keys max_relevence_group_size = min_relevence_groups.max{ |x, y| x.members.size <=> y.members.size }.members.size min_relevence_groups.select { |g| g.members.size == max_relevence_group_size }.sample end