View Javadoc
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   * Applies a child mutator repeatedly, passing each mutation result to the next invocation.
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  }