@@ 1,4 1,5 @@
use rand::{seq::IteratorRandom, Rng, RngCore};
+use std::fmt::Debug;
use crate::{comparison::BetterThanOperator, replacement::EvaluatedPopulation};
@@ 28,13 29,13 @@ impl TournamentSelection {
}
}
- fn tournament<TChromosome, TResult>(
+ fn tournament<TChromosome, TResult: Debug + Copy>(
&mut self,
idxs: &mut Vec<usize>,
evaluations: &EvaluatedPopulation<TChromosome, TResult>,
better_than: &dyn BetterThanOperator<TResult>
) -> usize {
- idxs.sort_by(|&i, &j| better_than.ordering(
+ idxs.sort_unstable_by(|&i, &j| better_than.ordering(
&evaluations.population[i].evaluation,
&evaluations.population[j].evaluation)
);
@@ 59,11 60,11 @@ impl TournamentSelection {
p_selector /= 1.0 - p;
}
- selected
+ idxs[selected]
}
}
-impl<TChromosome, TResult> Selection<TChromosome, TResult> for TournamentSelection {
+impl<TChromosome, TResult: Copy + Debug> Selection<TChromosome, TResult> for TournamentSelection {
fn select(
&mut self,
count: usize,
@@ 76,7 77,8 @@ impl<TChromosome, TResult> Selection<TChromosome, TResult> for TournamentSelecti
// Choose k. Do not care if already selected previously.
(0..evaluations.population.len()).choose_multiple_fill(&mut self.rng, &mut k_selected_idxs);
// Tournament between the k
- self.tournament(&mut k_selected_idxs, evaluations, better_than)
+ let index = self.tournament(&mut k_selected_idxs, evaluations, better_than);
+ index
})
}
}