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 }