1 package net.bmahe.genetics4j.core.mutation;
2
3 import java.util.Objects;
4 import java.util.random.RandomGenerator;
5
6 import org.apache.commons.lang3.Validate;
7
8 import net.bmahe.genetics4j.core.Genotype;
9 import net.bmahe.genetics4j.core.chromosomes.Chromosome;
10 import net.bmahe.genetics4j.core.mutation.chromosome.ChromosomeMutationHandler;
11 import net.bmahe.genetics4j.core.spec.mutation.MutationPolicy;
12
13 public class GenericMutatorImpl implements Mutator {
14
15 private final RandomGenerator randomGenerator;
16 private final ChromosomeMutationHandler<? extends Chromosome>[] chromosomeMutationHandlers;
17 private final MutationPolicy mutationPolicy;
18 private final double populationMutationProbability;
19
20 public GenericMutatorImpl(final RandomGenerator _randomGenerator,
21 final ChromosomeMutationHandler<? extends Chromosome>[] _chromosomeMutationHandlers,
22 final MutationPolicy _mutationPolicy,
23 final double _populationMutationProbability) {
24 Objects.requireNonNull(_randomGenerator);
25 Objects.requireNonNull(_chromosomeMutationHandlers);
26 Objects.requireNonNull(_mutationPolicy);
27 Validate.inclusiveBetween(0.0d, 1.0d, _populationMutationProbability);
28
29 this.randomGenerator = _randomGenerator;
30 this.chromosomeMutationHandlers = _chromosomeMutationHandlers;
31 this.mutationPolicy = _mutationPolicy;
32 this.populationMutationProbability = _populationMutationProbability;
33 }
34
35 @Override
36 public Genotype mutate(final long generation, final Genotype original) {
37 Validate.isTrue(generation >= 0);
38 Objects.requireNonNull(original);
39
40 final Chromosome[] chromosomes = original.getChromosomes();
41 final Chromosome[] newChromosomes = new Chromosome[chromosomes.length];
42
43 if (randomGenerator.nextDouble() < populationMutationProbability) {
44
45 for (int i = 0; i < chromosomes.length; i++) {
46 final Chromosome chromosome = chromosomes[i];
47 final Chromosome mutatedChromosome = chromosomeMutationHandlers[i].mutate(mutationPolicy, chromosome);
48
49 newChromosomes[i] = mutatedChromosome;
50 }
51 } else {
52 for (int i = 0; i < chromosomes.length; i++) {
53 final Chromosome chromosome = chromosomes[i];
54 newChromosomes[i] = chromosome;
55 }
56 }
57
58 return new Genotype(newChromosomes);
59 }
60 }