Use immutable data structures to calculate variations
This commit is contained in:
parent
60b96ab82d
commit
c2feb229d2
@ -12,6 +12,22 @@ module Tables
|
||||
@tables.values.freeze
|
||||
end
|
||||
|
||||
def deep_freeze
|
||||
@tables.each_value(&:freeze)
|
||||
@tables.freeze
|
||||
freeze
|
||||
end
|
||||
|
||||
def replace(table)
|
||||
@tables[table.id] = table
|
||||
end
|
||||
|
||||
def dup
|
||||
super.tap do |new_distribution|
|
||||
new_distribution.instance_variable_set(:@tables, @tables.dup)
|
||||
end
|
||||
end
|
||||
|
||||
def <<(array)
|
||||
Table.new(array).tap do |table|
|
||||
@tables[table.id] = table
|
||||
@ -22,6 +38,9 @@ module Tables
|
||||
@tables = {}
|
||||
|
||||
self << people.slice!(0..rand(@min_per_table..@max_per_table)) while people.any?
|
||||
|
||||
@tables.freeze
|
||||
freeze
|
||||
end
|
||||
|
||||
def discomfort
|
||||
|
@ -8,25 +8,23 @@ module Tables
|
||||
def each
|
||||
@initial_solution.tables.combination(2) do |table_a, table_b|
|
||||
table_a.product(table_b).each do |(person_a, person_b)|
|
||||
original_discomfort_a = table_a.reset
|
||||
original_discomfort_b = table_b.reset
|
||||
new_solution = @initial_solution.dup
|
||||
|
||||
table_a.delete(person_a)
|
||||
table_b.delete(person_b)
|
||||
new_table_a = table_a.dup
|
||||
new_table_b = table_b.dup
|
||||
|
||||
table_a << person_b
|
||||
table_b << person_a
|
||||
new_solution.replace(new_table_a)
|
||||
new_solution.replace(new_table_b)
|
||||
|
||||
yield(@initial_solution)
|
||||
ensure
|
||||
table_a.delete(person_b)
|
||||
table_b.delete(person_a)
|
||||
new_table_a.delete(person_a)
|
||||
new_table_b.delete(person_b)
|
||||
|
||||
table_a << person_a
|
||||
table_b << person_b
|
||||
new_table_a << person_b
|
||||
new_table_b << person_a
|
||||
|
||||
table_a.discomfort = original_discomfort_a
|
||||
table_b.discomfort = original_discomfort_b
|
||||
new_solution.freeze
|
||||
|
||||
yield(new_solution)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -18,5 +18,11 @@ module Tables
|
||||
def discomfort
|
||||
@discomfort ||= DiscomfortCalculator.new(self).calculate
|
||||
end
|
||||
|
||||
def dup
|
||||
super.tap do |new_table|
|
||||
new_table.discomfort = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -26,7 +26,7 @@ module VNS
|
||||
optimize(perturbation.new(@best_solution))
|
||||
end
|
||||
|
||||
@best_solution
|
||||
@best_solution
|
||||
end
|
||||
|
||||
private
|
||||
|
@ -1,4 +1,4 @@
|
||||
NUMBER_OF_GUESTS = 50
|
||||
NUMBER_OF_GUESTS = ENV['SEED_GUEST_COUNT'].presence.to_i || 50
|
||||
|
||||
TablesArrangement.delete_all
|
||||
Expense.delete_all
|
||||
@ -21,7 +21,6 @@ Expense.create!(name: 'Transportation', amount: 3000, pricing_type: 'fixed')
|
||||
Expense.create!(name: 'Invitations', amount: 200, pricing_type: 'fixed')
|
||||
Expense.create!(name: 'Cake', amount: 500, pricing_type: 'fixed')
|
||||
|
||||
|
||||
samples = {
|
||||
close_family_a: 10,
|
||||
close_family_b: 10,
|
||||
|
Loading…
x
Reference in New Issue
Block a user