1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use crate::genetic_algorithm::operators::mutation::Mutation;
use mop_blocks::{mph::MphOrs, Pct, Solution, SolutionDomain};
use rand::{rngs::StdRng, Rng, SeedableRng};

#[derive(Clone, Debug)]
pub struct RandomDomainAssignments {
  genes_num: usize,
  probability: Pct,
}

impl RandomDomainAssignments {
  pub fn new(genes_num: usize, probability: Pct) -> Self {
    RandomDomainAssignments { genes_num, probability }
  }
}
impl<OR, S, SD> Mutation<SD, MphOrs<OR, S>> for RandomDomainAssignments
where
  S: Solution,
  SD: SolutionDomain<S>,
{
  fn mutation(&self, sd: &SD, source: &mut MphOrs<OR, S>) {
    let mut rng = StdRng::from_entropy();
    for mut result in source.iter_mut() {
      if self.probability.is_in_rnd_pbty(&mut rng) {
        for _ in 0..self.genes_num {
          let var_idx = rng.gen_range(0, result.solution().len());
          sd.set_rnd_solution_domain(result.solution_mut(), var_idx, &mut rng);
        }
      }
    }
  }
}