GenotypeGenerator.java
package net.bmahe.genetics4j.core.util;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Supplier;
import org.apache.commons.lang3.Validate;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import net.bmahe.genetics4j.core.Genotype;
import net.bmahe.genetics4j.core.chromosomes.Chromosome;
import net.bmahe.genetics4j.core.chromosomes.factory.ChromosomeFactory;
import net.bmahe.genetics4j.core.chromosomes.factory.ChromosomeFactoryProvider;
import net.bmahe.genetics4j.core.spec.AbstractEAConfiguration;
public class GenotypeGenerator<T extends Comparable<T>> {
final static public Logger logger = LogManager.getLogger(GenotypeGenerator.class);
private final ChromosomeFactoryProvider chromosomeFactoryProvider;
private final AbstractEAConfiguration<T> eaConfiguration;
private final Optional<Supplier<Genotype>> populationGenerator;
public GenotypeGenerator(final ChromosomeFactoryProvider _chromosomeFactoryProvider,
final AbstractEAConfiguration<T> _eaConfiguration) {
Objects.requireNonNull(_chromosomeFactoryProvider);
Objects.requireNonNull(_eaConfiguration);
this.chromosomeFactoryProvider = _chromosomeFactoryProvider;
this.eaConfiguration = _eaConfiguration;
this.populationGenerator = eaConfiguration.genotypeGenerator();
}
public List<Genotype> generateGenotypes(final int numPopulation) {
Validate.isTrue(numPopulation > 0);
logger.info("Generating {} individuals", numPopulation);
final List<Genotype> genotypes = new ArrayList<>();
// Override
if (populationGenerator.isPresent()) {
final Supplier<Genotype> populationSupplier = populationGenerator.get();
for (int i = 0; i < numPopulation; i++) {
genotypes.add(populationSupplier.get());
}
} else {
final int numChromosomes = eaConfiguration.numChromosomes();
final ChromosomeFactory<? extends Chromosome>[] chromosomeFactories = new ChromosomeFactory<?>[numChromosomes];
for (int i = 0; i < numChromosomes; i++) {
chromosomeFactories[i] = chromosomeFactoryProvider
.provideChromosomeFactory(eaConfiguration.getChromosomeSpec(i));
}
for (int i = 0; i < numPopulation; i++) {
final Chromosome[] chromosomes = new Chromosome[numChromosomes];
for (int j = 0; j < numChromosomes; j++) {
chromosomes[j] = chromosomeFactories[j].generate(eaConfiguration.getChromosomeSpec(j));
}
genotypes.add(new Genotype(chromosomes));
}
}
return genotypes;
}
}