Skip to main content

red_queen_core/
variation.rs

1//! Variation operators (mutation and crossover).
2
3use crate::genome::Genome;
4use rand::Rng;
5
6/// Configuration for variation.
7#[derive(Debug, Clone)]
8pub struct VariationConfig {
9    /// Probability of mutation.
10    pub mutation_rate: f64,
11    /// Probability of crossover.
12    pub crossover_rate: f64,
13}
14
15impl Default for VariationConfig {
16    fn default() -> Self {
17        Self {
18            mutation_rate: 0.3,
19            crossover_rate: 0.7,
20        }
21    }
22}
23
24/// Apply variation to produce offspring.
25pub fn vary<G: Genome, R: Rng>(
26    parent1: &G,
27    parent2: &G,
28    config: &VariationConfig,
29    rng: &mut R,
30) -> G {
31    // Crossover
32    let mut offspring = if rng.gen::<f64>() < config.crossover_rate {
33        parent1.crossover(parent2, rng)
34    } else {
35        parent1.clone()
36    };
37
38    // Mutation
39    offspring.mutate(rng, config.mutation_rate);
40
41    offspring
42}