1 package net.bmahe.genetics4j.core.combination.singlepointarithmetic;
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.ChromosomeSpec;
12 import net.bmahe.genetics4j.core.spec.chromosome.DoubleChromosomeSpec;
13 import net.bmahe.genetics4j.core.spec.chromosome.FloatChromosomeSpec;
14 import net.bmahe.genetics4j.core.spec.chromosome.IntChromosomeSpec;
15 import net.bmahe.genetics4j.core.spec.combination.CombinationPolicy;
16 import net.bmahe.genetics4j.core.spec.combination.SinglePointArithmetic;
17
18 public class SinglePointArithmeticCombinationHandler<T extends Comparable<T>>
19 implements ChromosomeCombinatorHandler<T>
20 {
21
22 private final RandomGenerator randomGenerator;
23
24 public SinglePointArithmeticCombinationHandler(final RandomGenerator _randomGenerator) {
25 Objects.requireNonNull(_randomGenerator);
26
27 this.randomGenerator = _randomGenerator;
28 }
29
30 @Override
31 public boolean canHandle(final ChromosomeCombinatorResolver<T> chromosomeCombinatorResolver,
32 final CombinationPolicy combinationPolicy, final ChromosomeSpec chromosome) {
33 Objects.requireNonNull(chromosomeCombinatorResolver);
34 Objects.requireNonNull(combinationPolicy);
35 Objects.requireNonNull(chromosome);
36
37 return combinationPolicy instanceof SinglePointArithmetic && (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(SinglePointArithmetic.class, combinationPolicy);
48
49 final var singlePointArithmeticRecombination = (SinglePointArithmetic) combinationPolicy;
50 final double alpha = singlePointArithmeticRecombination.alpha();
51
52 if (chromosome instanceof IntChromosomeSpec) {
53 return new IntChromosomeSinglePointArithmetic<>(randomGenerator, alpha);
54 }
55
56 if (chromosome instanceof DoubleChromosomeSpec) {
57 return new DoubleChromosomeSinglePointArithmetic<>(randomGenerator, alpha);
58 }
59
60 if (chromosome instanceof FloatChromosomeSpec) {
61 return new FloatChromosomeSinglePointArithmetic<>(randomGenerator, (float) alpha);
62 }
63
64 throw new IllegalArgumentException("Could not handle chromosome " + chromosome);
65 }
66 }