View Javadoc
1   package net.bmahe.genetics4j.core.combination.singlepointcrossover;
2   
3   import java.util.Objects;
4   import java.util.random.RandomGenerator;
5   
6   import org.apache.commons.lang3.Validate;
7   
8   import net.bmahe.genetics4j.core.combination.ChromosomeCombinator;
9   import net.bmahe.genetics4j.core.combination.ChromosomeCombinatorHandler;
10  import net.bmahe.genetics4j.core.combination.ChromosomeCombinatorResolver;
11  import net.bmahe.genetics4j.core.spec.chromosome.BitChromosomeSpec;
12  import net.bmahe.genetics4j.core.spec.chromosome.ChromosomeSpec;
13  import net.bmahe.genetics4j.core.spec.chromosome.DoubleChromosomeSpec;
14  import net.bmahe.genetics4j.core.spec.chromosome.FloatChromosomeSpec;
15  import net.bmahe.genetics4j.core.spec.chromosome.IntChromosomeSpec;
16  import net.bmahe.genetics4j.core.spec.combination.CombinationPolicy;
17  import net.bmahe.genetics4j.core.spec.combination.SinglePointCrossover;
18  
19  public class SinglePointCrossoverHandler<T extends Comparable<T>> implements ChromosomeCombinatorHandler<T> {
20  
21  	private final RandomGenerator randomGenerator;
22  
23  	public SinglePointCrossoverHandler(final RandomGenerator _randomGenerator) {
24  		Objects.requireNonNull(_randomGenerator);
25  
26  		this.randomGenerator = _randomGenerator;
27  	}
28  
29  	@Override
30  	public boolean canHandle(final ChromosomeCombinatorResolver<T> chromosomeCombinatorResolver,
31  			final CombinationPolicy combinationPolicy, final ChromosomeSpec chromosome) {
32  		Objects.requireNonNull(chromosomeCombinatorResolver);
33  		Objects.requireNonNull(combinationPolicy);
34  		Objects.requireNonNull(chromosome);
35  
36  		return combinationPolicy instanceof SinglePointCrossover
37  				&& (chromosome instanceof BitChromosomeSpec || chromosome instanceof IntChromosomeSpec
38  						|| chromosome instanceof DoubleChromosomeSpec || chromosome instanceof FloatChromosomeSpec);
39  	}
40  
41  	@Override
42  	public ChromosomeCombinator<T> resolve(final ChromosomeCombinatorResolver<T> chromosomeCombinatorResolver,
43  			final CombinationPolicy combinationPolicy, final ChromosomeSpec chromosome) {
44  		Objects.requireNonNull(chromosomeCombinatorResolver);
45  		Objects.requireNonNull(combinationPolicy);
46  		Objects.requireNonNull(chromosome);
47  		Validate.isInstanceOf(SinglePointCrossover.class, combinationPolicy);
48  
49  		if (chromosome instanceof BitChromosomeSpec) {
50  			return new BitChromosomeSinglePointCrossover<>(randomGenerator);
51  		}
52  
53  		if (chromosome instanceof IntChromosomeSpec) {
54  			return new IntChromosomeSinglePointCrossover<>(randomGenerator);
55  		}
56  
57  		if (chromosome instanceof DoubleChromosomeSpec) {
58  			return new DoubleChromosomeSinglePointCrossover<>(randomGenerator);
59  		}
60  
61  		if (chromosome instanceof FloatChromosomeSpec) {
62  			return new FloatChromosomeSinglePointCrossover<>(randomGenerator);
63  		}
64  
65  		throw new IllegalArgumentException("Could not handle chromosome " + chromosome);
66  	}
67  }