pub(crate) use crate::{
configuration::{LimitConfiguration, ProblemSolving},
traits::ChromosomeT,
};
#[cfg(all(not(target_arch = "wasm32"), feature = "parallel"))]
use rayon::prelude::*;
pub fn mu_comma_lambda<U: ChromosomeT>(
chromosomes: &mut Vec<U>,
population_size: usize,
limit_configuration: LimitConfiguration,
) {
crate::log_debug!(target="survivor_events", method="mu_comma_lambda"; "Starting (mu,lambda) survivor selection");
chromosomes.retain(|c| c.age() == 0);
crate::log_trace!(target="survivor_events", method="mu_comma_lambda"; "Offspring count after parent removal: {}", chromosomes.len());
if chromosomes.len() <= population_size {
crate::log_debug!(target="survivor_events", method="mu_comma_lambda"; "(mu,lambda) survivor selection finished (all offspring kept)");
return;
}
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)
});
}
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="mu_comma_lambda"; "(mu,lambda) survivor selection finished");
}