pub(crate) use crate::{
configuration::{LimitConfiguration, ProblemSolving},
traits::ChromosomeT,
};
use log::{debug, trace};
pub fn mu_comma_lambda<U: ChromosomeT>(
chromosomes: &mut Vec<U>,
population_size: usize,
limit_configuration: LimitConfiguration,
) {
debug!(target="survivor_events", method="mu_comma_lambda"; "Starting (mu,lambda) survivor selection");
chromosomes.retain(|c| c.age() == 0);
trace!(target="survivor_events", method="mu_comma_lambda"; "Offspring count after parent removal: {}", chromosomes.len());
if chromosomes.len() <= population_size {
debug!(target="survivor_events", method="mu_comma_lambda"; "(mu,lambda) survivor selection finished (all offspring kept)");
return;
}
if limit_configuration.problem_solving != ProblemSolving::FixedFitness {
chromosomes.sort_by(|a, b| {
b.fitness()
.partial_cmp(&a.fitness())
.unwrap_or(std::cmp::Ordering::Equal)
});
} else {
let target = limit_configuration.fitness_target.unwrap_or(0.0);
chromosomes.sort_by(|a, b| {
b.fitness_distance(&target)
.partial_cmp(&a.fitness_distance(&target))
.unwrap_or(std::cmp::Ordering::Equal)
});
}
if chromosomes.len() > population_size {
match limit_configuration.problem_solving {
ProblemSolving::Maximization => {
chromosomes.truncate(population_size);
}
ProblemSolving::Minimization | ProblemSolving::FixedFitness => {
let excess = chromosomes.len() - population_size;
chromosomes.drain(0..excess);
}
}
}
debug!(target="survivor_events", method="mu_comma_lambda"; "(mu,lambda) survivor selection finished");
}