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 }