@@ 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::<f64, 2>::from_vec(vec![-10.0, 10.0]);
+ let max = SVector::<f64, 2>::from_vec(vec![10.0, 10.0]);
+ let min = -SVector::<f64, 2>::from_vec(vec![10.0, 10.0]);
+
+ let linear = Linear::new(7.0, SVector::<f64, 2>::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::<f64, 2>::zeros(),
+ ).unwrap();
+
+ println!("{:?}", result);
+
+ assert_eq!(
+ result.best_candidate.fit,
+ -0.0
+ );
+
+ assert_eq!(
+ result.best_candidate.pos,
+ optimum
+ );
+ }
}