package no.priv.garshol.duke.genetic; import java.util.List; import java.util.ArrayList; import java.util.Collections; import no.priv.garshol.duke.Configuration; /** * Keeps track of the population. */ public class GeneticPopulation { private Configuration config; // this is the original config private List<GeneticConfiguration> population; private int size; private int mutation_rate; private double recombination_rate; private int copies_of_original; private boolean evolve_comparators; // should we evolve comparators? public GeneticPopulation(Configuration config) { this.config = config; this.size = 100; this.mutation_rate = -1; this.recombination_rate = -1.0; this.copies_of_original = 0; this.evolve_comparators = true; } /** * Creates the initial population. */ public void create() { GeneticConfiguration cfg = new GeneticConfiguration(config, mutation_rate, recombination_rate, evolve_comparators); population = new ArrayList(size); int ix = 0; for (; ix < copies_of_original; ix++) population.add(cfg.makeCopy()); for (; ix < size; ix++) population.add(cfg.makeRandomCopy()); } /** * Returns all configurations in the current generation. */ public List<GeneticConfiguration> getConfigs() { return population; } public void setNewGeneration(List<GeneticConfiguration> nextgen) { this.population = nextgen; } /** * Sorts the population by their achieved F-numbers. */ public void sort() { Collections.sort(population); for (int ix = 0; ix < population.size(); ix++) population.get(ix).setRank(ix + 1); } /** * Returns the best configuration. */ public GeneticConfiguration getBestConfiguration() { return population.get(0); } /** * Returns the worst configuration. */ public GeneticConfiguration getWorstConfiguration() { return population.get(population.size() - 1); } /** * Returns a random configuration. */ public GeneticConfiguration pickRandomConfig() { return population.get((int) Math.random() * population.size()); } /** * Runs a tournament among k individuals to find the most fit * individual. */ public GeneticConfiguration runTournament(int k) { GeneticConfiguration best = pickRandomConfig(); for (int ix = 1; ix < k; ix++) { GeneticConfiguration candidate = pickRandomConfig(); if (candidate.getFNumber() > best.getFNumber()) best = candidate; } return best; } /** * Sets the size of the population. */ public void setSize(int size) { this.size = size; } public void setMutationRate(int mutation_rate) { this.mutation_rate = mutation_rate; } public void setRecombinationRate(double recombination_rate) { this.recombination_rate = recombination_rate; } public void setEvolveComparators(boolean evolve_comparators) { this.evolve_comparators = evolve_comparators; } public void setCopiesOfOriginal(int copies) { this.copies_of_original = copies; } /** * Returns the size of the population. */ public int size() { return size; } }