1 package net.bmahe.genetics4j.core.mutation;
2
3 import java.util.Objects;
4 import java.util.random.RandomGenerator;
5
6 import net.bmahe.genetics4j.core.chromosomes.Chromosome;
7 import net.bmahe.genetics4j.core.mutation.chromosome.ChromosomeMutationHandler;
8 import net.bmahe.genetics4j.core.spec.AbstractEAConfiguration;
9 import net.bmahe.genetics4j.core.spec.AbstractEAExecutionContext;
10 import net.bmahe.genetics4j.core.spec.mutation.CreepMutation;
11 import net.bmahe.genetics4j.core.spec.mutation.MutationPolicy;
12 import net.bmahe.genetics4j.core.util.ChromosomeResolverUtils;
13
14 public class CreepMutationPolicyHandler<T extends Comparable<T>> implements MutationPolicyHandler<T> {
15
16 private final RandomGenerator randomGenerator;
17
18 public CreepMutationPolicyHandler(final RandomGenerator _randomGenerator) {
19 Objects.requireNonNull(_randomGenerator);
20
21 this.randomGenerator = _randomGenerator;
22 }
23
24 @Override
25 public boolean canHandle(final MutationPolicyHandlerResolver<T> mutationPolicyHandlerResolver,
26 final MutationPolicy mutationPolicy) {
27 Objects.requireNonNull(mutationPolicy);
28
29 return mutationPolicy instanceof CreepMutation;
30 }
31
32 @Override
33 public Mutator createMutator(final AbstractEAExecutionContext<T> eaExecutionContext,
34 final AbstractEAConfiguration<T> eaConfiguration,
35 final MutationPolicyHandlerResolver<T> mutationPolicyHandlerResolver, final MutationPolicy mutationPolicy) {
36 Objects.requireNonNull(eaExecutionContext);
37 Objects.requireNonNull(eaConfiguration);
38 Objects.requireNonNull(mutationPolicy);
39 Objects.requireNonNull(mutationPolicyHandlerResolver);
40
41 final CreepMutation creepMutationPolicy = (CreepMutation) mutationPolicy;
42 final double populationMutationProbability = creepMutationPolicy.populationMutationProbability();
43
44 final ChromosomeMutationHandler<? extends Chromosome>[] chromosomeMutationHandlers = ChromosomeResolverUtils
45 .resolveChromosomeMutationHandlers(eaExecutionContext, eaConfiguration, mutationPolicy);
46
47 return new GenericMutatorImpl(randomGenerator,
48 chromosomeMutationHandlers,
49 mutationPolicy,
50 populationMutationProbability);
51 }
52 }