~ruther/ctu-fee-eoa

967210c08829e8ffff264c22a8917517a47c5480 — Rutherther 2 months ago 06f3259
tests: add test for Linear fitness function
1 files changed, 41 insertions(+), 1 deletions(-)

M env/src/local_search/mod.rs
M env/src/local_search/mod.rs => env/src/local_search/mod.rs +41 -1
@@ 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
        );
    }
}