~ruther/ctu-fee-eoa

372dc756e002ef91480f4455c046b8d8da30458d — Rutherther a month ago b39687d
tests: adjust evolution one_max algorithm to always find optimum
1 files changed, 16 insertions(+), 23 deletions(-)

M codes/eoa_lib/src/evolution.rs
M codes/eoa_lib/src/evolution.rs => codes/eoa_lib/src/evolution.rs +16 -23
@@ 101,18 101,18 @@ pub fn evolution_algorithm<TChromosome: Clone, TResult: Clone>(
pub mod tests {
    use nalgebra::Const;

    use crate::{binary_string::BinaryString, comparison::MinimizingOperator, crossover::BinaryOnePointCrossover, fitness::one_max::OneMax, initializer::{Initializer, RandomInitializer}, pairing::AdjacentPairing, perturbation::{BinaryStringBitPerturbation, MutationPerturbation}, replacement::{BestReplacement, Population}, selection::TournamentSelection};
    use crate::{binary_string::BinaryString, comparison::MinimizingOperator, crossover::BinaryOnePointCrossover, fitness::one_max::OneMax, initializer::{Initializer, RandomInitializer}, pairing::AdjacentPairing, perturbation::{BinaryStringBitPerturbation, BinaryStringFlipPerturbation, BinaryStringSingleBitPerturbation, CombinedPerturbation, MutationPerturbation}, replacement::{BestReplacement, Population, TournamentReplacement}, selection::TournamentSelection};

    use super::evolution_algorithm;

    #[test]
    pub fn test_one_max() {
    pub fn test_evolution_one_max() {
        const D: usize = 512;
        let optimum = BinaryString::<Const<D>>::new(vec![0; D]);
        let one_max = OneMax::<Const<D>>::new();

        let initializer = RandomInitializer::<Const<D>, BinaryString::<Const<D>>>::new_binary();
        let population_size = 512;
        let population_size = 10;

        let mut rng_init = rand::rng();
        let population = Population::from_vec(


@@ 122,34 122,27 @@ pub mod tests {
        let mut rng = rand::rng();
        let result = evolution_algorithm(
            population,
            population_size / 4,
            50,
            &one_max,
            // TODO: tournament should somehow accept sorting?
            // TODO: deterministic and nondeterministic tournament ordering
            &TournamentSelection::new(3, 0.8),
            &TournamentSelection::new(5, 0.8),
            &mut AdjacentPairing::new(),
            &BinaryOnePointCrossover::new(),
            &MutationPerturbation::new(
                Box::new(BinaryStringBitPerturbation::new(0.05)),
                0.1),
            &BestReplacement::new(),
            &CombinedPerturbation::new(
                vec![
                    Box::new(MutationPerturbation::new(
                        Box::new(BinaryStringSingleBitPerturbation::new()),
                        0.3)),
                    Box::new(MutationPerturbation::new(
                        Box::new(BinaryStringFlipPerturbation::new()),
                        0.3))
                ]
            ),
            &TournamentReplacement::new(5, 0.8),
            &MinimizingOperator,
            1000,
            &mut rng
        ).unwrap();

        println!("{:?}", result.stats.best_candidates
                 .iter()
                 .map(|candidate| candidate.evaluated_chromosome.evaluation)
                 .collect::<Vec<_>>());
        println!("{:?}", result.stats.best_candidates
                 .iter()
                 .map(|candidate| candidate.iteration)
                 .collect::<Vec<_>>());
        println!("{:?}", result.population.best_candidate(&MinimizingOperator));
        println!("{:?}", result.best_candidate);
        // println!("{:?}", res);

        assert_eq!(
            result.best_candidate.evaluation,
            0