~ruther/ctu-fee-eoa

b56050a3d9e7445222b3092cc9e05e2a7b66835f — Rutherther a month ago 8eb3e89
chore(tsp): few minor updates
1 files changed, 14 insertions(+), 16 deletions(-)

M codes/tsp_hw01/src/main.rs
M codes/tsp_hw01/src/main.rs => codes/tsp_hw01/src/main.rs +14 -16
@@ 13,7 13,7 @@ use perturbations::{MovePerturbation, Random2OptPerturbation, ReverseSubsequence
use binary_string_representation::TSPBinaryStringWrapper;
use nalgebra::{Dim, Dyn};
use eoa_lib::{
    binary_string::BinaryString, comparison::MinimizingOperator, crossover::BinaryNPointCrossover, evolution::{evolution_algorithm, EvolutionStats}, initializer::{Initializer, RandomInitializer}, local_search::{local_search_first_improving, LocalSearchStats}, pairing::AdjacentPairing, perturbation::{apply_to_perturbations, BinaryStringBitPerturbation, BinaryStringFlipNPerturbation, BinaryStringSingleBitPerturbation, CombinedPerturbation, MutationPerturbation, PerturbationOperator}, replacement::{BestReplacement, TournamentReplacement}, selection::{BestSelection, RouletteWheelSelection}, terminating::MaximumCyclesTerminatingCondition
    binary_string::BinaryString, comparison::MinimizingOperator, crossover::BinaryNPointCrossover, evolution::{evolution_algorithm, EvolutionStats}, initializer::{Initializer, RandomInitializer}, local_search::{local_search_first_improving, LocalSearchStats}, pairing::AdjacentPairing, perturbation::{apply_to_perturbations, BinaryStringBitPerturbation, BinaryStringFlipNPerturbation, BinaryStringSingleBitPerturbation, CombinedPerturbation, MutationPerturbation, PerturbationOperator}, replacement::{BestReplacement, TournamentReplacement}, selection::{BestSelection, RouletteWheelSelection, TournamentSelection}, terminating::MaximumCyclesTerminatingCondition
};
use rand::rng;
use std::env;


@@ 86,8 86,7 @@ fn extract_evolution_data(
    let mut evaluations = Vec::new();

    for candidate in &stats.best_candidates {
        let fitness_evaluations = initial_population_size + candidate.iteration * offspring_count;
        iterations.push(fitness_evaluations);
        iterations.push(candidate.evaluation);
        evaluations.push(candidate.evaluated_chromosome.evaluation);
    }



@@ 118,8 117,7 @@ fn extract_binary_evolution_data(
    let mut evaluations = Vec::new();

    for candidate in &stats.best_candidates {
        let fitness_evaluations = initial_population_size + candidate.iteration * offspring_count;
        iterations.push(fitness_evaluations);
        iterations.push(candidate.evaluation);
        evaluations.push(candidate.evaluated_chromosome.evaluation);
    }



@@ 218,13 216,13 @@ fn load_optimal_cost(instance_filename: &str) -> Result<f64, Box<dyn std::error:

fn run_evolution_algorithm(instance: &TSPInstance<Dyn>) -> Result<PlotData, Box<dyn std::error::Error>> {
    let mut rng = rng();
    let initializer = MinimumSpanningTreeInitializer::new(instance);
    let initializer = TSPRandomInitializer::new();
    let dimension = instance.dimension();

    // Create combined perturbation with two mutations wrapped in MutationPerturbation
    let move_mutation = MutationPerturbation::new(Box::new(MovePerturbation::new()), 0.05);
    let swap_mutation = MutationPerturbation::new(Box::new(SwapPerturbation::new()), 0.05);
    let reverse_mutation = MutationPerturbation::new(Box::new(ReverseSubsequencePerturbation::new()), 0.0);
    let move_mutation = MutationPerturbation::new(Box::new(MovePerturbation::new()), 0.1);
    let swap_mutation = MutationPerturbation::new(Box::new(SwapPerturbation::new()), 0.1);
    let reverse_mutation = MutationPerturbation::new(Box::new(ReverseSubsequencePerturbation::new()), 0.1);
    let mut combined_perturbation = CombinedPerturbation::new(vec![
        Box::new(move_mutation),
        Box::new(swap_mutation),


@@ 233,19 231,19 @@ fn run_evolution_algorithm(instance: &TSPInstance<Dyn>) -> Result<PlotData, Box<

    // Set up other components
    let mut crossover = EdgeRecombinationCrossover::new();
    let mut selection = RouletteWheelSelection::new();
    let mut selection = TournamentSelection::new(5, 0.8);
    let mut replacement = BestReplacement::new();
    let mut pairing = AdjacentPairing::new();
    let better_than_operator = MinimizingOperator::new();

    // Create initial population
    let population_size = 500;
    let mut initial_population = initializer.initialize(dimension, population_size, &mut rng);
    let two_opt = Random2OptPerturbation::new(instance, 10);
    let initial_population = initializer.initialize(dimension, population_size, &mut rng);
    // let two_opt = Random2OptPerturbation::new(instance, 10);

    for individual in initial_population.iter_mut() {
        two_opt.perturb(individual, &mut rng);
    }
    // for individual in initial_population.iter_mut() {
    //     two_opt.perturb(individual, &mut rng);
    // }

    let initial_population = eoa_lib::replacement::Population::from_vec(initial_population);



@@ 270,7 268,7 @@ fn run_evolution_algorithm(instance: &TSPInstance<Dyn>) -> Result<PlotData, Box<
            MutationPerturbation::apply_to_mutations(
                perturbation,
                &mut |p| {
                    p.probability = (0.05 * (1.0 + (iters_since_better as f64 / iters_till_end as f64))).min(1.0);
                    p.probability = (0.5 * (1.0 + (iters_since_better as f64 / iters_till_end as f64))).min(1.0);
                }
            );
        }