# frozen_string_literal: true namespace :vns do desc 'Benchmarks the efficiency of the VNS implementation' task benchmark: :environment do ActsAsTenant.with_tenant(Wedding.first) do iterations = 10 guests = Guest.potential Rails.logger.info "There are #{guests.count} potential guests" time_acc = 0 solution_acc = 0 hierarchy = AffinityGroupsHierarchy.new iterations.times do |i| engine = VNS::Engine.new engine.add_perturbation(Tables::Swap) engine.add_perturbation(Tables::Shift) initial_solution = Tables::Distribution.new(min_per_table: 8, max_per_table: 10, hierarchy:) random = Random.new(i) initial_solution.random_distribution(guests.shuffle(random:), random:) 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