lib/vns.rb in vns-0.3.0 vs lib/vns.rb in vns-1.0.pre.rc.1
- old
+ new
@@ -2,20 +2,21 @@
require 'vns/person'
require 'vns/session'
require 'active_support/all'
class VNS
- attr_reader :people, :sessions, :preferences, :max_allocation
+ attr_reader :people, :sessions, :preferences, :max_allocation, :group_duplication_factor
PERTURBATION_COUNT = 100
- def initialize(people, sessions, preferences, max_allocation, &inspection)
- @people = people.map.with_index { |person, i| Person.new(i, person) }
+ def initialize(people, groups, sessions, preferences, max_allocation, group_duplication_factor, &inspection)
+ @people = people.map.with_index { |person, i| Person.new(i, person, groups[i]) }
@sessions = sessions.map.with_index { |session, i| Session.new(i, session) }
@preferences = preferences
@inspection = inspection
@max_allocation = max_allocation
+ @group_duplication_factor = group_duplication_factor
end
def run
initial_groups = people.in_groups(sessions.count).map(&:compact)
initial_solution = sessions.zip(initial_groups).to_h
@@ -39,14 +40,22 @@
end
def target_function(solution = @solution)
return Float::INFINITY unless solution
- solution.map do |session, people|
- people.map do |person|
- preferences[person.id][session.id]
- end
- end.flatten.inject(:+)
+ individual_penalty = solution.map do |session, people|
+ people.map do |person|
+ preferences[person.id][session.id]
+ end
+ end.flatten.inject(:+)
+
+ group_penalty = solution.map do |session, people|
+ people.group_by(&:group).map{|group, people| people.count - 1 }.sum
+ end.inject(:+)
+
+ Rails.logger.info "Penalty: #{individual_penalty} + #{group_penalty}"
+
+ individual_penalty + group_duplication_factor * group_penalty
end
private
def global_optimize(initial_solution)