@@ 13,7 13,7 @@ use perturbations::{MovePerturbation, Random2OptPerturbation, ReverseSubsequence
use binary_string_representation::TSPBinaryStringWrapper;
use nalgebra::{Dim, Dyn};
use eoa_lib::{
- binary_string::BinaryString, comparison::MinimizingOperator, crossover::BinaryNPointCrossover, evolution::{evolution_algorithm, EvolutionStats}, initializer::{Initializer, RandomInitializer}, local_search::{local_search_first_improving, LocalSearchStats}, pairing::AdjacentPairing, perturbation::{apply_to_perturbations, BinaryStringBitPerturbation, BinaryStringFlipNPerturbation, BinaryStringSingleBitPerturbation, CombinedPerturbation, MutationPerturbation, PerturbationOperator}, replacement::{BestReplacement, TournamentReplacement}, selection::{BestSelection, RouletteWheelSelection}, terminating::MaximumCyclesTerminatingCondition
+ binary_string::BinaryString, comparison::MinimizingOperator, crossover::BinaryNPointCrossover, evolution::{evolution_algorithm, EvolutionStats}, initializer::{Initializer, RandomInitializer}, local_search::{local_search_first_improving, LocalSearchStats}, pairing::AdjacentPairing, perturbation::{apply_to_perturbations, BinaryStringBitPerturbation, BinaryStringFlipNPerturbation, BinaryStringSingleBitPerturbation, CombinedPerturbation, MutationPerturbation, PerturbationOperator}, replacement::{BestReplacement, TournamentReplacement}, selection::{BestSelection, RouletteWheelSelection, TournamentSelection}, terminating::MaximumCyclesTerminatingCondition
};
use rand::rng;
use std::env;
@@ 86,8 86,7 @@ fn extract_evolution_data(
let mut evaluations = Vec::new();
for candidate in &stats.best_candidates {
- let fitness_evaluations = initial_population_size + candidate.iteration * offspring_count;
- iterations.push(fitness_evaluations);
+ iterations.push(candidate.evaluation);
evaluations.push(candidate.evaluated_chromosome.evaluation);
}
@@ 118,8 117,7 @@ fn extract_binary_evolution_data(
let mut evaluations = Vec::new();
for candidate in &stats.best_candidates {
- let fitness_evaluations = initial_population_size + candidate.iteration * offspring_count;
- iterations.push(fitness_evaluations);
+ iterations.push(candidate.evaluation);
evaluations.push(candidate.evaluated_chromosome.evaluation);
}
@@ 218,13 216,13 @@ fn load_optimal_cost(instance_filename: &str) -> Result<f64, Box<dyn std::error:
fn run_evolution_algorithm(instance: &TSPInstance<Dyn>) -> Result<PlotData, Box<dyn std::error::Error>> {
let mut rng = rng();
- let initializer = MinimumSpanningTreeInitializer::new(instance);
+ let initializer = TSPRandomInitializer::new();
let dimension = instance.dimension();
// Create combined perturbation with two mutations wrapped in MutationPerturbation
- let move_mutation = MutationPerturbation::new(Box::new(MovePerturbation::new()), 0.05);
- let swap_mutation = MutationPerturbation::new(Box::new(SwapPerturbation::new()), 0.05);
- let reverse_mutation = MutationPerturbation::new(Box::new(ReverseSubsequencePerturbation::new()), 0.0);
+ let move_mutation = MutationPerturbation::new(Box::new(MovePerturbation::new()), 0.1);
+ let swap_mutation = MutationPerturbation::new(Box::new(SwapPerturbation::new()), 0.1);
+ let reverse_mutation = MutationPerturbation::new(Box::new(ReverseSubsequencePerturbation::new()), 0.1);
let mut combined_perturbation = CombinedPerturbation::new(vec![
Box::new(move_mutation),
Box::new(swap_mutation),
@@ 233,19 231,19 @@ fn run_evolution_algorithm(instance: &TSPInstance<Dyn>) -> Result<PlotData, Box<
// Set up other components
let mut crossover = EdgeRecombinationCrossover::new();
- let mut selection = RouletteWheelSelection::new();
+ let mut selection = TournamentSelection::new(5, 0.8);
let mut replacement = BestReplacement::new();
let mut pairing = AdjacentPairing::new();
let better_than_operator = MinimizingOperator::new();
// Create initial population
let population_size = 500;
- let mut initial_population = initializer.initialize(dimension, population_size, &mut rng);
- let two_opt = Random2OptPerturbation::new(instance, 10);
+ let initial_population = initializer.initialize(dimension, population_size, &mut rng);
+ // let two_opt = Random2OptPerturbation::new(instance, 10);
- for individual in initial_population.iter_mut() {
- two_opt.perturb(individual, &mut rng);
- }
+ // for individual in initial_population.iter_mut() {
+ // two_opt.perturb(individual, &mut rng);
+ // }
let initial_population = eoa_lib::replacement::Population::from_vec(initial_population);
@@ 270,7 268,7 @@ fn run_evolution_algorithm(instance: &TSPInstance<Dyn>) -> Result<PlotData, Box<
MutationPerturbation::apply_to_mutations(
perturbation,
&mut |p| {
- p.probability = (0.05 * (1.0 + (iters_since_better as f64 / iters_till_end as f64))).min(1.0);
+ p.probability = (0.5 * (1.0 + (iters_since_better as f64 / iters_till_end as f64))).min(1.0);
}
);
}