package jcgp.backend.population; import jcgp.backend.resources.Resources; public class Population { private Chromosome[] chromosomes; private final Resources resources; /** * Initialise a random population according to the parameters specified * in the resources. * * @param resources the CGP resources */ public Population(Resources resources) { this.resources = resources; chromosomes = new Chromosome[resources.populationSize()]; for (int c = 0; c < chromosomes.length; c++) { chromosomes[c] = new Chromosome(resources); } } /** * Initialise a population of copies of the given chromosome. * * @param parent * @param resources */ public Population(Chromosome parent, Resources resources) { this.resources = resources; chromosomes = new Chromosome[resources.populationSize()]; for (int c = 0; c < chromosomes.length; c++) { chromosomes[c] = new Chromosome(parent); } } /** * Returns the indexed chromosome. * * @param index * @return */ public Chromosome getChromosome(int index) { return chromosomes[index]; } /** * @return a random chromosome from this population. */ public Chromosome getRandomChromosome() { return chromosomes[resources.getRandomInt(chromosomes.length)]; } /** * Copy a chromosome into a different position. * After this returns, the target chromosome has * identical connections and functions to the source * one, though they are separate instances. * * This method does nothing if source == target. * * @param source * @param target */ public void copyChromosome(int source, int target) { if (source != target) { chromosomes[target].copyGenes(chromosomes[source]); } } public void reinitialise() { for (int c = 0; c < chromosomes.length; c++) { chromosomes[c].reinitialiseConnections(); } } }