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