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