genetic_algorithm/crossover/
single_point.rsuse super::Crossover;
use crate::genotype::EvolveGenotype;
use crate::strategy::evolve::{EvolveConfig, EvolveState};
use crate::strategy::{StrategyAction, StrategyReporter, StrategyState};
use itertools::Itertools;
use rand::Rng;
use std::time::Instant;
#[derive(Clone, Debug, Default)]
pub struct SinglePoint;
impl Crossover for SinglePoint {
fn call<G: EvolveGenotype, R: Rng, SR: StrategyReporter<Genotype = G>>(
&mut self,
genotype: &mut G,
state: &mut EvolveState<G>,
config: &EvolveConfig,
_reporter: &mut SR,
rng: &mut R,
) {
let now = Instant::now();
let crossover_size = self.prepare_population(genotype, state, config);
for (father, mother) in state
.population
.chromosomes
.iter_mut()
.take(crossover_size)
.tuples()
{
genotype.crossover_chromosome_points(1, true, father, mother, rng);
}
state.add_duration(StrategyAction::Crossover, now.elapsed());
}
fn require_crossover_points(&self) -> bool {
true
}
}
impl SinglePoint {
pub fn new() -> Self {
Self
}
}