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.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  }