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