From 296be2ccb34ce7187b3b1a202f65467595fc5e03 Mon Sep 17 00:00:00 2001 From: Rutherther Date: Mon, 6 Oct 2025 20:31:36 +0200 Subject: [PATCH] feat: add test for local search with PatternPerturbation --- env/src/local_search/mod.rs | 41 ++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/env/src/local_search/mod.rs b/env/src/local_search/mod.rs index 40162913b08c5166557a8c5856e044ce1bb79581..157f5b50206b61a1a7549f91bb519ccc3d26958c 100644 --- a/env/src/local_search/mod.rs +++ b/env/src/local_search/mod.rs @@ -81,7 +81,7 @@ where pub mod tests { use nalgebra::SVector; - use crate::{binary_string::{BinaryString, Bounds}, comparison::MinimizingOperator, fitness::{one_max::OneMax, real::Linear, rosenbrock::Rosenbrock, sphere::Sphere, BinaryFitnessWrapper}, local_search::local_search_first_improving, perturbation::{BinaryStringBitPerturbation, BoundedPerturbation, BoundedPerturbationStrategy, RandomDistributionPerturbation}, terminating::{AndTerminatingConditions, EqualTerminatingCondition, NoBetterForCyclesTerminatingCondition}}; + use crate::{binary_string::{BinaryString, Bounds}, comparison::MinimizingOperator, fitness::{one_max::OneMax, real::Linear, rosenbrock::Rosenbrock, sphere::Sphere, BinaryFitnessWrapper}, local_search::local_search_first_improving, perturbation::{BinaryStringBitPerturbation, BoundedPerturbation, BoundedPerturbationStrategy, PatternPerturbation, RandomDistributionPerturbation}, terminating::{AndTerminatingConditions, EqualTerminatingCondition, NoBetterForCyclesTerminatingCondition}}; #[test] fn test_local_search_sphere() { @@ -256,4 +256,43 @@ pub mod tests { optimum ); } + + #[test] + fn test_local_search_linear_pattern() { + let optimum = SVector::::from_vec(vec![-10.0, 10.0]); + let max = SVector::::from_vec(vec![10.0, 10.0]); + let min = -SVector::::from_vec(vec![10.0, 10.0]); + + let linear = Linear::new(7.0, SVector::::from_vec(vec![0.2, -0.5])); + + let result = local_search_first_improving( + &linear, + &mut + AndTerminatingConditions::new( + vec![ + &mut EqualTerminatingCondition::new_remembered(optimum.clone()), + &mut NoBetterForCyclesTerminatingCondition::new(100) + ] + ), + &mut BoundedPerturbation::new( + PatternPerturbation::new(0.5), + min, + max, + BoundedPerturbationStrategy::Retry(10)), + &MinimizingOperator::new(), + &SVector::::zeros(), + ).unwrap(); + + println!("{:?}", result); + + assert_eq!( + result.best_candidate.fit, + -0.0 + ); + + assert_eq!( + result.best_candidate.pos, + optimum + ); + } }