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.FloatChromosome;
10 import net.bmahe.genetics4j.core.spec.chromosome.ChromosomeSpec;
11 import net.bmahe.genetics4j.core.spec.chromosome.FloatChromosomeSpec;
12 import net.bmahe.genetics4j.core.util.DistributionUtils;
13
14 public class FloatChromosomeFactory implements ChromosomeFactory<FloatChromosome> {
15
16 private final RandomGenerator randomGenerator;
17
18 public FloatChromosomeFactory(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 FloatChromosomeSpec;
29 }
30
31 @Override
32 public FloatChromosome generate(final ChromosomeSpec chromosomeSpec) {
33 Objects.requireNonNull(chromosomeSpec);
34 Validate.isInstanceOf(FloatChromosomeSpec.class, chromosomeSpec);
35
36 final FloatChromosomeSpec floatChromosomeSpec = (FloatChromosomeSpec) chromosomeSpec;
37
38 final var minValue = floatChromosomeSpec.minValue();
39 final var maxValue = floatChromosomeSpec.maxValue();
40 final var distribution = floatChromosomeSpec.distribution();
41
42 final Supplier<Float> generator = DistributionUtils
43 .distributionFloatValueSupplier(randomGenerator, minValue, maxValue, distribution);
44
45 float[] values = new float[floatChromosomeSpec.size()];
46 for (int i = 0; i < floatChromosomeSpec.size(); i++) {
47 values[i] = generator.get();
48 }
49
50 return new FloatChromosome(floatChromosomeSpec.size(),
51 floatChromosomeSpec.minValue(),
52 floatChromosomeSpec.maxValue(),
53 values);
54 }
55 }