From 967210c08829e8ffff264c22a8917517a47c5480 Mon Sep 17 00:00:00 2001 From: Rutherther Date: Mon, 6 Oct 2025 15:21:03 +0200 Subject: [PATCH] tests: add test for Linear fitness function --- env/src/local_search/mod.rs | 42 ++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/env/src/local_search/mod.rs b/env/src/local_search/mod.rs index 53817b1ef263922b7aa8fad3e332e26d08c87e5d..40162913b08c5166557a8c5856e044ce1bb79581 100644 --- a/env/src/local_search/mod.rs +++ b/env/src/local_search/mod.rs @@ -79,7 +79,9 @@ where #[cfg(test)] pub mod tests { - use crate::{binary_string::{BinaryString, Bounds}, comparison::MinimizingOperator, fitness::{one_max::OneMax, rosenbrock::Rosenbrock, sphere::Sphere, BinaryFitnessWrapper}, local_search::local_search_first_improving, perturbation::BinaryStringBitPerturbation, terminating::{AndTerminatingConditions, EqualTerminatingCondition, NoBetterForCyclesTerminatingCondition}}; + 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}}; #[test] fn test_local_search_sphere() { @@ -216,4 +218,42 @@ pub mod tests { ); } + #[test] + fn test_local_search_linear() { + 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( + RandomDistributionPerturbation::normal(0.5).unwrap(), + 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 + ); + } }