use crate::configuration::ProblemSolving;
use crate::operations::mutation::swap::swap;
use crate::traits::ChromosomeT;
use log::info;
pub fn mass_degeneration<U: ChromosomeT>(
chromosomes: &mut [U],
problem_solving: ProblemSolving,
mutation_rounds: usize,
elite_count: usize,
) {
if chromosomes.is_empty() {
return;
}
let elite_count = elite_count.min(chromosomes.len());
match problem_solving {
ProblemSolving::Maximization => {
chromosomes.sort_by(|a, b| {
b.fitness()
.partial_cmp(&a.fitness())
.unwrap_or(std::cmp::Ordering::Equal)
});
}
ProblemSolving::Minimization | ProblemSolving::FixedFitness => {
chromosomes.sort_by(|a, b| {
a.fitness()
.partial_cmp(&b.fitness())
.unwrap_or(std::cmp::Ordering::Equal)
});
}
}
for chromosome in chromosomes.iter_mut().skip(elite_count) {
for _ in 0..mutation_rounds {
swap(chromosome);
}
chromosome.set_fitness(f64::NAN);
}
info!(
target = "extension_events",
method = "mass_degeneration";
"MassDegeneration applied: {} mutation rounds on {} non-elite chromosomes",
mutation_rounds,
chromosomes.len().saturating_sub(elite_count)
);
}