pub(crate) use crate::{
configuration::{LimitConfiguration, ProblemSolving},
traits::ChromosomeT,
};
#[cfg(all(not(target_arch = "wasm32"), feature = "parallel"))]
use rayon::prelude::*;
pub fn fitness_based<U: ChromosomeT>(
chromosomes: &mut Vec<U>,
population_size: usize,
limit_configuration: LimitConfiguration,
) {
crate::log_debug!(target="survivor_events", method="fitness_based"; "Starting fitness based survivor method");
if limit_configuration.problem_solving != ProblemSolving::FixedFitness {
#[cfg(all(not(target_arch = "wasm32"), feature = "parallel"))]
chromosomes.par_sort_unstable_by(|a, b| {
b.fitness()
.partial_cmp(&a.fitness())
.unwrap_or(std::cmp::Ordering::Equal)
});
#[cfg(any(target_arch = "wasm32", not(feature = "parallel")))]
chromosomes.sort_unstable_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);
#[cfg(all(not(target_arch = "wasm32"), feature = "parallel"))]
chromosomes.par_sort_unstable_by(|a, b| {
b.fitness_distance(&target)
.partial_cmp(&a.fitness_distance(&target))
.unwrap_or(std::cmp::Ordering::Equal)
});
#[cfg(any(target_arch = "wasm32", not(feature = "parallel")))]
chromosomes.sort_unstable_by(|a, b| {
b.fitness_distance(&target)
.partial_cmp(&a.fitness_distance(&target))
.unwrap_or(std::cmp::Ordering::Equal)
});
}
crate::log_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);
}
}
}
crate::log_debug!(target="survivor_events", method="fitness_based"; "Fitness based survivor method finished");
}