1 package net.bmahe.genetics4j.core.mutation;
2
3 import java.util.Arrays;
4 import java.util.Objects;
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.spec.AbstractEAConfiguration;
11 import net.bmahe.genetics4j.core.spec.AbstractEAExecutionContext;
12 import net.bmahe.genetics4j.core.spec.mutation.MutationPolicy;
13 import net.bmahe.genetics4j.core.spec.mutation.PartialMutation;
14
15 public class PartialMutationPolicyHandler<T extends Comparable<T>> implements MutationPolicyHandler<T> {
16
17 @Override
18 public boolean canHandle(final MutationPolicyHandlerResolver<T> mutationPolicyHandlerResolver,
19 final MutationPolicy mutationPolicy) {
20 Objects.requireNonNull(mutationPolicyHandlerResolver);
21 Objects.requireNonNull(mutationPolicy);
22
23 if ((mutationPolicy instanceof PartialMutation) == false) {
24 return false;
25 }
26
27 final PartialMutation partialMutation = (PartialMutation) mutationPolicy;
28
29 final MutationPolicy childMutationPolicy = partialMutation.mutationPolicy();
30 return mutationPolicyHandlerResolver.canHandle(childMutationPolicy);
31 }
32
33 @Override
34 public Mutator createMutator(final AbstractEAExecutionContext<T> eaExecutionContext,
35 final AbstractEAConfiguration<T> eaConfiguration,
36 final MutationPolicyHandlerResolver<T> mutationPolicyHandlerResolver, final MutationPolicy mutationPolicy) {
37 Objects.requireNonNull(eaExecutionContext);
38 Objects.requireNonNull(eaConfiguration);
39 Objects.requireNonNull(mutationPolicyHandlerResolver);
40 Objects.requireNonNull(mutationPolicy);
41 Validate.isInstanceOf(PartialMutation.class, mutationPolicy);
42
43 final PartialMutation partialMutation = (PartialMutation) mutationPolicy;
44
45 final int mutatedChromosomeIndex = partialMutation.chromosomeIndex();
46 final MutationPolicy childMutationPolicy = partialMutation.mutationPolicy();
47 final MutationPolicyHandler<T> mutationPolicyHandler = mutationPolicyHandlerResolver.resolve(childMutationPolicy);
48
49 final Mutator childMutator = mutationPolicyHandler
50 .createMutator(eaExecutionContext, eaConfiguration, mutationPolicyHandlerResolver, childMutationPolicy);
51
52 return new Mutator() {
53
54 @Override
55 public Genotype mutate(final long generation, final Genotype original) {
56 Validate.isTrue(generation >= 0);
57 Objects.requireNonNull(original);
58
59 final Chromosome[] chromosomes = Arrays.copyOf(original.getChromosomes(), original.getChromosomes().length);
60 final Genotype mutated = childMutator.mutate(generation, original);
61
62 chromosomes[mutatedChromosomeIndex] = mutated.getChromosome(mutatedChromosomeIndex);
63
64 return new Genotype(chromosomes);
65 }
66 };
67 }
68 }