pub(crate) use crate::{
configuration::{LimitConfiguration, ProblemSolving},
traits::ChromosomeT,
};
use log::{debug, trace};
pub fn fitness_based<U: ChromosomeT>(
chromosomes: &mut Vec<U>,
population_size: usize,
limit_configuration: LimitConfiguration,
) {
debug!(target="survivor_events", method="fitness_based"; "Starting fitness based survivor method");
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)
});
}
trace!(target="survivor_events", method="fitness_based"; "Chromosomes length {} - population size {}", chromosomes.len(), population_size);
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="fitness_based"; "Fitness based survivor method finished");
}