View Javadoc
1   package net.bmahe.genetics4j.core.mutation.chromosome.randommutation;
2   
3   import java.util.Arrays;
4   import java.util.Objects;
5   import java.util.random.RandomGenerator;
6   
7   import org.apache.commons.lang3.Validate;
8   
9   import net.bmahe.genetics4j.core.chromosomes.Chromosome;
10  import net.bmahe.genetics4j.core.chromosomes.FloatChromosome;
11  import net.bmahe.genetics4j.core.mutation.chromosome.ChromosomeMutationHandler;
12  import net.bmahe.genetics4j.core.spec.chromosome.ChromosomeSpec;
13  import net.bmahe.genetics4j.core.spec.chromosome.FloatChromosomeSpec;
14  import net.bmahe.genetics4j.core.spec.mutation.MutationPolicy;
15  import net.bmahe.genetics4j.core.spec.mutation.RandomMutation;
16  
17  public class FloatChromosomeRandomMutationHandler implements ChromosomeMutationHandler<FloatChromosome> {
18  
19  	private final RandomGenerator randomGenerator;
20  
21  	public FloatChromosomeRandomMutationHandler(final RandomGenerator _randomGenerator) {
22  		Objects.requireNonNull(_randomGenerator);
23  
24  		this.randomGenerator = _randomGenerator;
25  	}
26  
27  	@Override
28  	public boolean canHandle(final MutationPolicy mutationPolicy, final ChromosomeSpec chromosome) {
29  		Objects.requireNonNull(mutationPolicy);
30  		Objects.requireNonNull(chromosome);
31  
32  		return mutationPolicy instanceof RandomMutation && chromosome instanceof FloatChromosomeSpec;
33  	}
34  
35  	@Override
36  	public FloatChromosome mutate(final MutationPolicy mutationPolicy, final Chromosome chromosome) {
37  		Objects.requireNonNull(mutationPolicy);
38  		Objects.requireNonNull(chromosome);
39  		Validate.isInstanceOf(RandomMutation.class, mutationPolicy);
40  		Validate.isInstanceOf(FloatChromosome.class, chromosome);
41  
42  		final FloatChromosome floatChromosome = (FloatChromosome) chromosome;
43  		final float minValue = floatChromosome.getMinValue();
44  		final float maxValue = floatChromosome.getMaxValue();
45  
46  		final float[] newValues = Arrays.copyOf(floatChromosome.getValues(), floatChromosome.getNumAlleles());
47  
48  		final int alleleFlipIndex = randomGenerator.nextInt(floatChromosome.getNumAlleles());
49  		newValues[alleleFlipIndex] = minValue + randomGenerator.nextFloat() * (maxValue - minValue);
50  
51  		return new FloatChromosome(floatChromosome.getSize(), minValue, maxValue, newValues);
52  	}
53  }