View Javadoc
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  }