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.spec.mutation.RepeatedMutation;
10
11
12
13
14 public class RepeatedMutator implements Mutator {
15
16 private final RandomGenerator randomGenerator;
17 private final RepeatedMutation repeatedMutation;
18 private final Mutator childMutator;
19
20 public RepeatedMutator(final RandomGenerator _randomGenerator,
21 final RepeatedMutation _repeatedMutation,
22 final Mutator _childMutator) {
23 this.randomGenerator = Objects.requireNonNull(_randomGenerator);
24 this.repeatedMutation = Objects.requireNonNull(_repeatedMutation);
25 this.childMutator = Objects.requireNonNull(_childMutator);
26 }
27
28 @Override
29 public Genotype mutate(final long generation, final Genotype original) {
30 Validate.isTrue(generation >= 0);
31 Objects.requireNonNull(original);
32
33 final int numRepetitions = numberOfRepetitions();
34 Genotype mutated = original;
35 for (int i = 0; i < numRepetitions; i++) {
36 mutated = childMutator.mutate(generation, mutated);
37 }
38
39 return mutated;
40 }
41
42 private int numberOfRepetitions() {
43 final int minRepetitions = repeatedMutation.minRepetitions();
44 final int maxRepetitions = repeatedMutation.maxRepetitions();
45 if (minRepetitions == maxRepetitions) {
46 return minRepetitions;
47 }
48
49 return (int) randomGenerator.nextLong(minRepetitions, (long) maxRepetitions + 1L);
50 }
51 }