From 372dc756e002ef91480f4455c046b8d8da30458d Mon Sep 17 00:00:00 2001 From: Rutherther Date: Tue, 28 Oct 2025 10:54:10 +0100 Subject: [PATCH] tests: adjust evolution one_max algorithm to always find optimum --- codes/eoa_lib/src/evolution.rs | 39 ++++++++++++++-------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/codes/eoa_lib/src/evolution.rs b/codes/eoa_lib/src/evolution.rs index 303a3918ca985bc3ab99e21d3fac35b87eae64e2..24d3739520842fa33703e4d2ec83f8f5eb326696 100644 --- a/codes/eoa_lib/src/evolution.rs +++ b/codes/eoa_lib/src/evolution.rs @@ -101,18 +101,18 @@ pub fn evolution_algorithm( pub mod tests { use nalgebra::Const; - use crate::{binary_string::BinaryString, comparison::MinimizingOperator, crossover::BinaryOnePointCrossover, fitness::one_max::OneMax, initializer::{Initializer, RandomInitializer}, pairing::AdjacentPairing, perturbation::{BinaryStringBitPerturbation, MutationPerturbation}, replacement::{BestReplacement, Population}, selection::TournamentSelection}; + use crate::{binary_string::BinaryString, comparison::MinimizingOperator, crossover::BinaryOnePointCrossover, fitness::one_max::OneMax, initializer::{Initializer, RandomInitializer}, pairing::AdjacentPairing, perturbation::{BinaryStringBitPerturbation, BinaryStringFlipPerturbation, BinaryStringSingleBitPerturbation, CombinedPerturbation, MutationPerturbation}, replacement::{BestReplacement, Population, TournamentReplacement}, selection::TournamentSelection}; use super::evolution_algorithm; #[test] - pub fn test_one_max() { + pub fn test_evolution_one_max() { const D: usize = 512; let optimum = BinaryString::>::new(vec![0; D]); let one_max = OneMax::>::new(); let initializer = RandomInitializer::, BinaryString::>>::new_binary(); - let population_size = 512; + let population_size = 10; let mut rng_init = rand::rng(); let population = Population::from_vec( @@ -122,34 +122,27 @@ pub mod tests { let mut rng = rand::rng(); let result = evolution_algorithm( population, - population_size / 4, + 50, &one_max, - // TODO: tournament should somehow accept sorting? - // TODO: deterministic and nondeterministic tournament ordering - &TournamentSelection::new(3, 0.8), + &TournamentSelection::new(5, 0.8), &mut AdjacentPairing::new(), &BinaryOnePointCrossover::new(), - &MutationPerturbation::new( - Box::new(BinaryStringBitPerturbation::new(0.05)), - 0.1), - &BestReplacement::new(), + &CombinedPerturbation::new( + vec![ + Box::new(MutationPerturbation::new( + Box::new(BinaryStringSingleBitPerturbation::new()), + 0.3)), + Box::new(MutationPerturbation::new( + Box::new(BinaryStringFlipPerturbation::new()), + 0.3)) + ] + ), + &TournamentReplacement::new(5, 0.8), &MinimizingOperator, 1000, &mut rng ).unwrap(); - println!("{:?}", result.stats.best_candidates - .iter() - .map(|candidate| candidate.evaluated_chromosome.evaluation) - .collect::>()); - println!("{:?}", result.stats.best_candidates - .iter() - .map(|candidate| candidate.iteration) - .collect::>()); - println!("{:?}", result.population.best_candidate(&MinimizingOperator)); - println!("{:?}", result.best_candidate); - // println!("{:?}", res); - assert_eq!( result.best_candidate.evaluation, 0