1 package net.bmahe.genetics4j.core.mutation;
2
3 import java.util.List;
4 import java.util.Objects;
5 import java.util.random.RandomGenerator;
6 import java.util.stream.Collectors;
7
8 import org.apache.commons.lang3.Validate;
9
10 import net.bmahe.genetics4j.core.Genotype;
11 import net.bmahe.genetics4j.core.spec.AbstractEAConfiguration;
12 import net.bmahe.genetics4j.core.spec.AbstractEAExecutionContext;
13 import net.bmahe.genetics4j.core.spec.mutation.MultiMutations;
14 import net.bmahe.genetics4j.core.spec.mutation.MutationPolicy;
15
16 public class MultiMutationsPolicyHandler<T extends Comparable<T>> implements MutationPolicyHandler<T> {
17
18 private final RandomGenerator randomGenerator;
19
20 public MultiMutationsPolicyHandler(final RandomGenerator _randomGenerator) {
21 Objects.requireNonNull(_randomGenerator);
22
23 this.randomGenerator = _randomGenerator;
24 }
25
26 @Override
27 public boolean canHandle(final MutationPolicyHandlerResolver<T> mutationPolicyHandlerResolver,
28 final MutationPolicy mutationPolicy) {
29 Objects.requireNonNull(mutationPolicyHandlerResolver);
30 Objects.requireNonNull(mutationPolicy);
31
32 if ((mutationPolicy instanceof MultiMutations) == false) {
33 return false;
34 }
35
36 final MultiMutations multiMutations = (MultiMutations) mutationPolicy;
37
38 return multiMutations.mutationPolicies().stream().allMatch(mutationPolicyHandlerResolver::canHandle);
39 }
40
41 @Override
42 public Mutator createMutator(final AbstractEAExecutionContext<T> eaExecutionContext,
43 final AbstractEAConfiguration<T> eaConfiguration,
44 final MutationPolicyHandlerResolver<T> mutationPolicyHandlerResolver, final MutationPolicy mutationPolicy) {
45 Objects.requireNonNull(eaExecutionContext);
46 Objects.requireNonNull(eaConfiguration);
47 Objects.requireNonNull(mutationPolicyHandlerResolver);
48 Objects.requireNonNull(mutationPolicy);
49 Validate.isInstanceOf(MultiMutations.class, mutationPolicy);
50
51 final MultiMutations multiMutations = (MultiMutations) mutationPolicy;
52
53 final List<Mutator> mutators = multiMutations.mutationPolicies().stream().map(mp -> {
54
55 final MutationPolicyHandler<T> mutationPolicyHandler = mutationPolicyHandlerResolver.resolve(mp);
56
57 return mutationPolicyHandler
58 .createMutator(eaExecutionContext, eaConfiguration, mutationPolicyHandlerResolver, mp);
59 }).collect(Collectors.toList());
60
61 return new Mutator() {
62
63 @Override
64 public Genotype mutate(final long generation, final Genotype original) {
65 Validate.isTrue(generation >= 0);
66 Objects.requireNonNull(original);
67
68 final int selectedMutatorIndex = randomGenerator.nextInt(mutators.size());
69
70 return mutators.get(selectedMutatorIndex).mutate(generation, original);
71 }
72 };
73 }
74 }