From c050f2027ff14b8f9c695c65264ee931fc66309f Mon Sep 17 00:00:00 2001 From: Manuel Bustillo Date: Tue, 22 Jul 2025 09:05:32 +0200 Subject: [PATCH] Improve benchmark --- lib/tasks/vns.rake | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/lib/tasks/vns.rake b/lib/tasks/vns.rake index b8c7b3a..1a96cc7 100644 --- a/lib/tasks/vns.rake +++ b/lib/tasks/vns.rake @@ -4,26 +4,47 @@ namespace :vns do desc 'Benchmarks the efficiency of the VNS implementation' task benchmark: :environment do ActsAsTenant.with_tenant(Wedding.first) do - Rails.logger.info "There are #{Guest.potential.count} potential guests" - engine = VNS::Engine.new + iterations = 10 - engine.add_perturbation(Tables::Swap) - engine.add_perturbation(Tables::Shift) + guests = Guest.potential + + Rails.logger.info "There are #{guests.count} potential guests" + + time_acc = 0 + solution_acc = 0 hierarchy = AffinityGroupsHierarchy.new - initial_solution = Tables::Distribution.new(min_per_table: 8, max_per_table: 10, hierarchy:) - random = Random.new(561_163) - initial_solution.random_distribution(Guest.potential.shuffle(random:), random:) + iterations.times do |i| + engine = VNS::Engine.new - engine.initial_solution = initial_solution + engine.add_perturbation(Tables::Swap) + engine.add_perturbation(Tables::Shift) - engine.target_function(&:discomfort) + initial_solution = Tables::Distribution.new(min_per_table: 8, max_per_table: 10, hierarchy:) - solution = Rails.benchmark('VNS Benchmarking') { engine.run } + random = Random.new(i) + initial_solution.random_distribution(guests.shuffle(random:), random:) - Rails.logger.info "Best solution found with discomfort: #{solution.discomfort}" + engine.initial_solution = initial_solution + + engine.target_function(&:discomfort) + + start_time = Time.now + + solution = engine.run + + elapsed = Time.now - start_time + + time_acc += elapsed + solution_acc += solution.discomfort + + Rails.logger.info "[#{elapsed}] Best solution found with discomfort: #{solution.discomfort}" + end + + Rails.logger.info "Average time: #{time_acc / iterations} seconds" + Rails.logger.info "Average discomfort: #{solution_acc / iterations}" end end end