~ruther/ctu-fee-eoa

f39d246106fe659544aca5cad3ce1fb343d9cfa4 — Rutherther a month ago 62595f5
feat(lib): allow modifying fitness function in evolution_algorithm
2 files changed, 21 insertions(+), 18 deletions(-)

M codes/eoa_lib/src/evolution.rs
M codes/tsp_hw01/src/main.rs
M codes/eoa_lib/src/evolution.rs => codes/eoa_lib/src/evolution.rs +6 -3
@@ 35,13 35,14 @@ pub fn evolution_algorithm
     TResult: Clone,
     const DParents: usize,
     TSelection: Selection<TChromosome, TResult>,
     TFitness: FitnessFunction<In = TChromosome, Out = TResult>,
     TPairing: Pairing<DParents, Chromosome = TChromosome, Out = TResult>,
     TCrossover: Crossover<DParents, Chromosome = TChromosome, Out = TResult>,
     TReplacement: Replacement<TChromosome, TResult>,
     TPerturbation: PerturbationOperator<Chromosome = TChromosome>>(
    initial_population: Population<TChromosome>,
    parents_count: usize,
    fitness: &impl FitnessFunction<In = TChromosome, Out = TResult>,
    fitness: &mut TFitness,
    selection: &mut TSelection,
    pairing: &mut TPairing,
    crossover: &mut TCrossover,


@@ 56,6 57,7 @@ pub fn evolution_algorithm
        &EvolutionStats<TChromosome, TResult>,
        &EvaluatedPopulation<TChromosome, TResult>,

        &mut TFitness,
        &mut TSelection,
        &mut TPairing,
        &mut TCrossover,


@@ 149,6 151,7 @@ pub fn evolution_algorithm
            iteration,
            &stats,
            &current_population,
            fitness,
            selection,
            pairing,
            crossover,


@@ 195,7 198,7 @@ pub mod tests {
        let result = evolution_algorithm(
            population,
            50,
            &one_max,
            &mut one_max,
            &mut TournamentSelection::new(5, 0.8),
            &mut AdjacentPairing::new(),
            &mut BinaryOnePointCrossover::new(),


@@ 213,7 216,7 @@ pub mod tests {
            &MinimizingOperator,
            1000,
            &mut rng,
            |_, _, _, _, _, _, _, _| ()
            |_, _, _, _, _, _, _, _, _| ()
        ).unwrap();

        assert_eq!(

M codes/tsp_hw01/src/main.rs => codes/tsp_hw01/src/main.rs +15 -15
@@ 269,7 269,7 @@ fn run_evolution_algorithm(instance: &TSPInstance<Dyn>) -> Result<PlotData, Box<
    let result = evolution_algorithm(
        initial_population.clone(),
        parents_count,
        instance,
        &mut instance.clone(),
        &mut selection,
        &mut pairing,
        &mut crossover,


@@ 278,7 278,7 @@ fn run_evolution_algorithm(instance: &TSPInstance<Dyn>) -> Result<PlotData, Box<
        &better_than_operator,
        EA_MAX_ITERATIONS, // max iterations
        &mut rng,
        |iteration, stats, _, _, _, _, perturbation, _| {
        |iteration, stats, _, _, _, _, _, perturbation, _| {
            let iters_till_end = EA_MAX_ITERATIONS - iteration + 1;
            let iters_since_better =
                iteration - stats.best_candidates.last().map(|c| c.iteration).unwrap_or(0);


@@ 335,7 335,7 @@ fn run_evolution_algorithm_mst(instance: &TSPInstance<Dyn>) -> Result<PlotData, 
    let result = evolution_algorithm(
        initial_population.clone(),
        parents_count,
        instance,
        &mut instance.clone(),
        &mut selection,
        &mut pairing,
        &mut crossover,


@@ 344,7 344,7 @@ fn run_evolution_algorithm_mst(instance: &TSPInstance<Dyn>) -> Result<PlotData, 
        &better_than_operator,
        EA_MAX_ITERATIONS, // max iterations
        &mut rng,
        |iteration, stats, _, _, _, _, perturbation, _| {
        |iteration, stats, _, _, _, _, _, perturbation, _| {
            let iters_till_end = EA_MAX_ITERATIONS - iteration + 1;
            let iters_since_better =
                iteration - stats.best_candidates.last().map(|c| c.iteration).unwrap_or(0);


@@ 401,7 401,7 @@ fn run_evolution_algorithm_nn(instance: &TSPInstance<Dyn>) -> Result<PlotData, B
    let result = evolution_algorithm(
        initial_population.clone(),
        parents_count,
        instance,
        &mut instance.clone(),
        &mut selection,
        &mut pairing,
        &mut crossover,


@@ 410,7 410,7 @@ fn run_evolution_algorithm_nn(instance: &TSPInstance<Dyn>) -> Result<PlotData, B
        &better_than_operator,
        EA_MAX_ITERATIONS, // max iterations
        &mut rng,
        |iteration, stats, _, _, _, _, perturbation, _| {
        |iteration, stats, _, _, _, _, _, perturbation, _| {
            let iters_till_end = EA_MAX_ITERATIONS - iteration + 1;
            let iters_since_better =
                iteration - stats.best_candidates.last().map(|c| c.iteration).unwrap_or(0);


@@ 467,7 467,7 @@ fn run_evolution_algorithm_cx(instance: &TSPInstance<Dyn>) -> Result<PlotData, B
    let result = evolution_algorithm(
        initial_population.clone(),
        parents_count,
        instance,
        &mut instance.clone(),
        &mut selection,
        &mut pairing,
        &mut crossover,


@@ 476,7 476,7 @@ fn run_evolution_algorithm_cx(instance: &TSPInstance<Dyn>) -> Result<PlotData, B
        &better_than_operator,
        EA_MAX_ITERATIONS, // max iterations
        &mut rng,
        |_iteration, _stats, _, _, _, _, _perturbation, _| {
        |_iteration, _stats, _, _, _, _, _, _perturbation, _| {
            // No adaptive perturbation changes - keep probabilities constant
        }
    )?;


@@ 525,7 525,7 @@ fn run_evolution_algorithm_pmx(instance: &TSPInstance<Dyn>) -> Result<PlotData, 
    let result = evolution_algorithm(
        initial_population.clone(),
        parents_count,
        instance,
        &mut instance.clone(),
        &mut selection,
        &mut pairing,
        &mut crossover,


@@ 534,7 534,7 @@ fn run_evolution_algorithm_pmx(instance: &TSPInstance<Dyn>) -> Result<PlotData, 
        &better_than_operator,
        EA_MAX_ITERATIONS, // max iterations
        &mut rng,
        |_iteration, _stats, _, _, _, _, _perturbation, _| {
        |_iteration, _stats, _, _, _, _, _, _perturbation, _| {
            // No adaptive perturbation changes - keep probabilities constant
        }
    )?;


@@ 583,7 583,7 @@ fn run_evolution_algorithm_erx(instance: &TSPInstance<Dyn>) -> Result<PlotData, 
    let result = evolution_algorithm(
        initial_population.clone(),
        parents_count,
        instance,
        &mut  instance.clone(),
        &mut selection,
        &mut pairing,
        &mut crossover,


@@ 592,7 592,7 @@ fn run_evolution_algorithm_erx(instance: &TSPInstance<Dyn>) -> Result<PlotData, 
        &better_than_operator,
        EA_MAX_ITERATIONS, // max iterations
        &mut rng,
        |_iteration, _stats, _, _, _, _, _perturbation, _| {
        |_iteration, _stats, _, _, _, _, _, _perturbation, _| {
            // No adaptive perturbation changes - keep probabilities constant
        }
    )?;


@@ 638,14 638,14 @@ fn run_evolution_algorithm_binary(instance: &TSPInstance<Dyn>) -> Result<PlotDat
    let initial_population = initializer.initialize(input_dimension, population_size, &mut rng);
    let initial_population = eoa_lib::population::Population::from_vec(initial_population);

    let fitness = TSPBinaryStringWrapper::new(instance, input_dimension, output_dimension).unwrap();
    let mut fitness = TSPBinaryStringWrapper::new(instance, input_dimension, output_dimension).unwrap();

    // Run evolution algorithm
    let parents_count = EA_PARENTS_COUNT;
    let result = evolution_algorithm(
        initial_population.clone(),
        parents_count,
        &fitness,
        &mut fitness,
        &mut selection,
        &mut pairing,
        &mut crossover,


@@ 654,7 654,7 @@ fn run_evolution_algorithm_binary(instance: &TSPInstance<Dyn>) -> Result<PlotDat
        &better_than_operator,
        EA_MAX_ITERATIONS, // max iterations
        &mut rng,
        |iteration, stats, _, _, _, _, perturbation, _| {
        |iteration, stats, _, _, _, _, _, perturbation, _| {
            let iters_till_end = EA_MAX_ITERATIONS - iteration + 1;
            let iters_since_better =
                iteration - stats.best_candidates.last().map(|c| c.iteration).unwrap_or(0);