@@ 11,6 11,30 @@ pub trait Selection<TChromosome, TResult> {
) -> impl Iterator<Item = usize>;
}
+pub struct BestSelection;
+impl BestSelection {
+ pub fn new() -> Self {
+ Self
+ }
+}
+
+impl<TChromosome, TResult: Copy> Selection<TChromosome, TResult> for BestSelection {
+ fn select(&mut self,
+ count: usize,
+ evaluations: &EvaluatedPopulation<TChromosome, TResult>,
+ better_than: &dyn BetterThanOperator<TResult>
+ ) -> impl Iterator<Item = usize> {
+ let mut idxs = (0..evaluations.population.len())
+ .collect::<Vec<_>>();
+ idxs.sort_unstable_by(|&i, &j| better_than.ordering(
+ &evaluations.population[i].evaluation,
+ &evaluations.population[j].evaluation)
+ );
+
+ idxs.into_iter().take(count)
+ }
+}
+
pub struct TournamentSelection {
rng: Box<dyn RngCore>,
p: f64,