~ruther/ctu-fee-eoa

0047990b459b29545707dbf614b37ae3b083e492 — Rutherther a month ago 600d9ae
fix: return proper indices from tournament
1 files changed, 7 insertions(+), 5 deletions(-)

M codes/eoa_lib/src/selection.rs
M codes/eoa_lib/src/selection.rs => codes/eoa_lib/src/selection.rs +7 -5
@@ 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
        })
    }
}