use crate::chromosomes::ListChromosome;
use crate::traits::ChromosomeT;
use std::borrow::Cow;
use std::fmt::Debug;
use super::ValueMutable;
pub fn list_value_mutation<T>(individual: &mut ListChromosome<T>)
where
T: Clone + Sync + Send + Default + Debug + 'static,
{
let len = individual.dna().len();
if len == 0 {
return;
}
let mut rng = crate::rng::make_rng();
use rand::Rng;
let idx = rng.random_range(0..len);
let mut dna = individual.dna().to_vec();
let gene = &mut dna[idx];
if gene.alleles.len() < 2 {
return;
}
let current_index = gene.id as usize;
let new_index = loop {
let n = rng.random_range(0..gene.alleles.len());
if n != current_index {
break n;
}
};
gene.id = new_index as i32;
gene.value = gene.alleles[new_index].clone();
individual.set_dna(Cow::Owned(dna));
}
impl<T: Clone + Sync + Send + Default + Debug + 'static> ValueMutable for ListChromosome<T> {
fn value_mutate(&mut self) {
list_value_mutation(self);
}
}