1 package net.bmahe.genetics4j.core.chromosomes.factory;
2
3 import java.util.Objects;
4 import java.util.function.Supplier;
5 import java.util.random.RandomGenerator;
6
7 import org.apache.commons.lang3.Validate;
8
9 import net.bmahe.genetics4j.core.chromosomes.DoubleChromosome;
10 import net.bmahe.genetics4j.core.spec.chromosome.ChromosomeSpec;
11 import net.bmahe.genetics4j.core.spec.chromosome.DoubleChromosomeSpec;
12 import net.bmahe.genetics4j.core.util.DistributionUtils;
13
14 public class DoubleChromosomeFactory implements ChromosomeFactory<DoubleChromosome> {
15
16 private final RandomGenerator randomGenerator;
17
18 public DoubleChromosomeFactory(final RandomGenerator _randomGenerator) {
19 Objects.requireNonNull(_randomGenerator);
20
21 this.randomGenerator = _randomGenerator;
22 }
23
24 @Override
25 public boolean canHandle(final ChromosomeSpec chromosomeSpec) {
26 Objects.requireNonNull(chromosomeSpec);
27
28 return chromosomeSpec instanceof DoubleChromosomeSpec;
29 }
30
31 @Override
32 public DoubleChromosome generate(final ChromosomeSpec chromosomeSpec) {
33 Objects.requireNonNull(chromosomeSpec);
34 Validate.isInstanceOf(DoubleChromosomeSpec.class, chromosomeSpec);
35
36 final DoubleChromosomeSpec doubleChromosomeSpec = (DoubleChromosomeSpec) chromosomeSpec;
37
38 final var minValue = doubleChromosomeSpec.minValue();
39 final var maxValue = doubleChromosomeSpec.maxValue();
40 final var distribution = doubleChromosomeSpec.distribution();
41
42 final Supplier<Double> generator = DistributionUtils
43 .distributionValueSupplier(randomGenerator, minValue, maxValue, distribution);
44
45 double[] values = new double[doubleChromosomeSpec.size()];
46 for (int i = 0; i < doubleChromosomeSpec.size(); i++) {
47 values[i] = generator.get();
48 }
49
50 return new DoubleChromosome(doubleChromosomeSpec.size(),
51 doubleChromosomeSpec.minValue(),
52 doubleChromosomeSpec.maxValue(),
53 values);
54 }
55 }