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.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  }