@@ 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::<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(
+ PatternPerturbation::new(0.5),
+ 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
+ );
+ }
}