use crate::genome::Genome;
use rand::Rng;
#[derive(Debug, Clone)]
pub struct VariationConfig {
pub mutation_rate: f64,
pub crossover_rate: f64,
}
impl Default for VariationConfig {
fn default() -> Self {
Self {
mutation_rate: 0.3,
crossover_rate: 0.7,
}
}
}
pub fn vary<G: Genome, R: Rng>(
parent1: &G,
parent2: &G,
config: &VariationConfig,
rng: &mut R,
) -> G {
let mut offspring = if rng.gen::<f64>() < config.crossover_rate {
parent1.crossover(parent2, rng)
} else {
parent1.clone()
};
offspring.mutate(rng, config.mutation_rate);
offspring
}