genx/crossover/blend.rs
1use rand::{prelude::StdRng, Rng, SeedableRng};
2
3pub fn blend_crossover(parent1: f32, parent2: f32, alpha: f32, seed: Option<u64>) -> (f32, f32) {
4 let mut prng = match seed {
5 Some(val) => StdRng::seed_from_u64(val),
6 None => StdRng::from_entropy(),
7 };
8
9 let gamma: f32 = (1.0 + 2.0 * alpha) * prng.gen::<f32>() - alpha;
10 (
11 (1.0 - gamma) * parent1 + gamma * parent2,
12 (1.0 - gamma) * parent2 + gamma * parent1,
13 )
14}