/** * @throws Exception * @author Klaus Meffert */ public void testGetter_0() throws Exception { Configuration conf = new Configuration(); Genotype.setStaticConfiguration(conf); assertEquals(false, conf.isLocked()); FitnessFunction fitFunc = new StaticFitnessFunction(2); conf.setFitnessFunction(fitFunc); Gene gene = new BooleanGene(conf); Chromosome sample = new Chromosome(conf, gene, 55); conf.setSampleChromosome(sample); NaturalSelector natSel = new WeightedRouletteSelector(); conf.addNaturalSelector(natSel, false); RandomGenerator randGen = new StockRandomGenerator(); conf.setRandomGenerator(randGen); IEventManager evMan = new EventManager(); conf.setEventManager(evMan); GeneticOperator mutOp = new MutationOperator(conf); conf.addGeneticOperator(mutOp); GeneticOperator croOp = new CrossoverOperator(conf); conf.addGeneticOperator(croOp); conf.setPopulationSize(7); assertEquals(fitFunc, conf.getFitnessFunction()); assertEquals(natSel, conf.getNaturalSelectors(false).get(0)); assertEquals(randGen, conf.getRandomGenerator()); assertEquals(sample, conf.getSampleChromosome()); assertEquals(evMan, conf.getEventManager()); assertEquals(7, conf.getPopulationSize()); assertEquals(2, conf.getGeneticOperators().size()); assertEquals(mutOp, conf.getGeneticOperators().get(0)); assertEquals(croOp, conf.getGeneticOperators().get(1)); }
/** * Convenience method that returns a new Chromosome instance with its genes values (alleles) * randomized. Note that, if possible, this method will acquire a Chromosome instance from the * active ChromosomePool (if any) and then randomize its gene values before returning it. If a * Chromosome cannot be acquired from the pool, then a new instance will be constructed and its * gene values randomized before returning it. * * @param a_configuration the configuration to use * @return randomly initialized Chromosome * @throws InvalidConfigurationException if the given Configuration instance is invalid * @throws IllegalArgumentException if the given Configuration instance is null * @author Neil Rotstan * @author Klaus Meffert * @since 1.0 */ public static IChromosome randomInitialChromosome(Configuration a_configuration) throws InvalidConfigurationException { // Sanity check: make sure the given configuration isn't null. // ----------------------------------------------------------- if (a_configuration == null) { throw new IllegalArgumentException("Configuration instance must not be null"); } // Lock the configuration settings so that they can't be changed // from now on. // ------------------------------------------------------------- a_configuration.lockSettings(); // First see if we can get a Chromosome instance from the pool. // If we can, we'll randomize its gene values (alleles) and then // return it. // ------------------------------------------------------------- IChromosomePool pool = a_configuration.getChromosomePool(); if (pool != null) { IChromosome randomChromosome = pool.acquireChromosome(); if (randomChromosome != null) { Gene[] genes = randomChromosome.getGenes(); RandomGenerator generator = a_configuration.getRandomGenerator(); for (int i = 0; i < genes.length; i++) { genes[i].setToRandomValue(generator); /** @todo what about Gene's energy? */ } randomChromosome.setFitnessValueDirectly(FitnessFunction.NO_FITNESS_VALUE); return randomChromosome; } } // We weren't able to get a Chromosome from the pool, so we have to // construct a new instance and build it from scratch. // ------------------------------------------------------------------ IChromosome sampleChromosome = a_configuration.getSampleChromosome(); sampleChromosome.setFitnessValue(FitnessFunction.NO_FITNESS_VALUE); Gene[] sampleGenes = sampleChromosome.getGenes(); Gene[] newGenes = new Gene[sampleGenes.length]; RandomGenerator generator = a_configuration.getRandomGenerator(); for (int i = 0; i < newGenes.length; i++) { // We use the newGene() method on each of the genes in the // sample Chromosome to generate our new Gene instances for // the Chromosome we're returning. This guarantees that the // new Genes are setup with all of the correct internal state // for the respective gene position they're going to inhabit. // ----------------------------------------------------------- newGenes[i] = sampleGenes[i].newGene(); // Set the gene's value (allele) to a random value. // ------------------------------------------------ newGenes[i].setToRandomValue(generator); /** @todo what about Gene's energy? */ } // Finally, construct the new chromosome with the new random // genes values and return it. // --------------------------------------------------------- return new Chromosome(a_configuration, newGenes); }
/** * Evolves the population of chromosomes within a genotype. This will execute all of the genetic * operators added to the present active configuration and then invoke the natural selector to * choose which chromosomes will be included in the next generation population. * * @param a_pop the population to evolve * @param a_conf the configuration to use for evolution * @return evolved population * @author Klaus Meffert * @since 3.2 */ public Population evolve(Population a_pop, Configuration a_conf) { Population pop = a_pop; int originalPopSize = a_conf.getPopulationSize(); boolean monitorActive = a_conf.getMonitor() != null; IChromosome fittest = null; // If first generation: Set age to one to allow genetic operations, // see CrossoverOperator for an illustration. // ---------------------------------------------------------------- if (a_conf.getGenerationNr() == 0) { int size = pop.size(); for (int i = 0; i < size; i++) { IChromosome chrom = pop.getChromosome(i); chrom.increaseAge(); } } else { // Select fittest chromosome in case it should be preserved and we are // not in the very first generation. // ------------------------------------------------------------------- if (a_conf.isPreserveFittestIndividual()) { /** @todo utilize jobs. In pop do also utilize jobs, especially for fitness computation */ fittest = pop.determineFittestChromosome(0, pop.size() - 1); } } if (a_conf.getGenerationNr() > 0) { // Adjust population size to configured size (if wanted). // Theoretically, this should be done at the end of this method. // But for optimization issues it is not. If it is the last call to // evolve() then the resulting population possibly contains more // chromosomes than the wanted number. But this is no bad thing as // more alternatives mean better chances having a fit candidate. // If it is not the last call to evolve() then the next call will // ensure the correct population size by calling keepPopSizeConstant. // ------------------------------------------------------------------ keepPopSizeConstant(pop, a_conf); } // Ensure fitness value of all chromosomes is udpated. // --------------------------------------------------- if (monitorActive) { // Monitor that fitness value of chromosomes is being updated. // ----------------------------------------------------------- a_conf .getMonitor() .event( IEvolutionMonitor.MONITOR_EVENT_BEFORE_UPDATE_CHROMOSOMES1, a_conf.getGenerationNr(), new Object[] {pop}); } updateChromosomes(pop, a_conf); if (monitorActive) { // Monitor that fitness value of chromosomes is being updated. // ----------------------------------------------------------- a_conf .getMonitor() .event( IEvolutionMonitor.MONITOR_EVENT_AFTER_UPDATE_CHROMOSOMES1, a_conf.getGenerationNr(), new Object[] {pop}); } // Apply certain NaturalSelectors before GeneticOperators will be executed. // ------------------------------------------------------------------------ pop = applyNaturalSelectors(a_conf, pop, true); // Execute all of the Genetic Operators. // ------------------------------------- applyGeneticOperators(a_conf, pop); // Reset fitness value of genetically operated chromosomes. // Normally, this should not be necessary as the Chromosome class // initializes each newly created chromosome with // FitnessFunction.NO_FITNESS_VALUE. But who knows which Chromosome // implementation is used... // ---------------------------------------------------------------- int currentPopSize = pop.size(); for (int i = originalPopSize; i < currentPopSize; i++) { IChromosome chrom = pop.getChromosome(i); chrom.setFitnessValueDirectly(FitnessFunction.NO_FITNESS_VALUE); // Mark chromosome as new-born. // ---------------------------- chrom.resetAge(); // Mark chromosome as being operated on. // ------------------------------------- chrom.increaseOperatedOn(); } // Increase age of all chromosomes which are not modified by genetic // operations. // ----------------------------------------------------------------- int size = Math.min(originalPopSize, currentPopSize); for (int i = 0; i < size; i++) { IChromosome chrom = pop.getChromosome(i); chrom.increaseAge(); // Mark chromosome as not being operated on. // ----------------------------------------- chrom.resetOperatedOn(); } // If a bulk fitness function has been provided, call it. // ------------------------------------------------------ BulkFitnessFunction bulkFunction = a_conf.getBulkFitnessFunction(); if (bulkFunction != null) { if (monitorActive) { // Monitor that bulk fitness will be called for evaluation. // -------------------------------------------------------- a_conf .getMonitor() .event( IEvolutionMonitor.MONITOR_EVENT_BEFORE_BULK_EVAL, a_conf.getGenerationNr(), new Object[] {bulkFunction, pop}); } /** @todo utilize jobs: bulk fitness function is not so important for a prototype! */ bulkFunction.evaluate(pop); if (monitorActive) { // Monitor that bulk fitness has been called for evaluation. // --------------------------------------------------------- a_conf .getMonitor() .event( IEvolutionMonitor.MONITOR_EVENT_AFTER_BULK_EVAL, a_conf.getGenerationNr(), new Object[] {bulkFunction, pop}); } } // Ensure fitness value of all chromosomes is udpated. // --------------------------------------------------- if (monitorActive) { // Monitor that fitness value of chromosomes is being updated. // ----------------------------------------------------------- a_conf .getMonitor() .event( IEvolutionMonitor.MONITOR_EVENT_BEFORE_UPDATE_CHROMOSOMES2, a_conf.getGenerationNr(), new Object[] {pop}); } updateChromosomes(pop, a_conf); if (monitorActive) { // Monitor that fitness value of chromosomes is being updated. // ----------------------------------------------------------- a_conf .getMonitor() .event( IEvolutionMonitor.MONITOR_EVENT_AFTER_UPDATE_CHROMOSOMES2, a_conf.getGenerationNr(), new Object[] {pop}); } // Apply certain NaturalSelectors after GeneticOperators have been applied. // ------------------------------------------------------------------------ pop = applyNaturalSelectors(a_conf, pop, false); // Fill up population randomly if size dropped below specified percentage // of original size. // ---------------------------------------------------------------------- if (a_conf.getMinimumPopSizePercent() > 0) { int sizeWanted = a_conf.getPopulationSize(); int popSize; int minSize = (int) Math.round(sizeWanted * (double) a_conf.getMinimumPopSizePercent() / 100); popSize = pop.size(); if (popSize < minSize) { IChromosome newChrom; IChromosome sampleChrom = a_conf.getSampleChromosome(); Class sampleChromClass = sampleChrom.getClass(); IInitializer chromIniter = a_conf.getJGAPFactory().getInitializerFor(sampleChrom, sampleChromClass); while (pop.size() < minSize) { try { /** * @todo utilize jobs as initialization may be time-consuming as invalid combinations * may have to be filtered out */ newChrom = (IChromosome) chromIniter.perform(sampleChrom, sampleChromClass, null); if (monitorActive) { // Monitor that fitness value of chromosomes is being updated. // ----------------------------------------------------------- a_conf .getMonitor() .event( IEvolutionMonitor.MONITOR_EVENT_BEFORE_ADD_CHROMOSOME, a_conf.getGenerationNr(), new Object[] {pop, newChrom}); } pop.addChromosome(newChrom); } catch (Exception ex) { throw new RuntimeException(ex); } } } } IChromosome newFittest = reAddFittest(pop, fittest); if (monitorActive && newFittest != null) { // Monitor that fitness value of chromosomes is being updated. // ----------------------------------------------------------- a_conf .getMonitor() .event( IEvolutionMonitor.MONITOR_EVENT_READD_FITTEST, a_conf.getGenerationNr(), new Object[] {pop, fittest}); } // Increase number of generations. // ------------------------------- a_conf.incrementGenerationNr(); // Fire an event to indicate we've performed an evolution. // ------------------------------------------------------- m_lastPop = pop; m_lastConf = a_conf; a_conf .getEventManager() .fireGeneticEvent(new GeneticEvent(GeneticEvent.GENOTYPE_EVOLVED_EVENT, this)); return pop; }
/** * @throws Exception * @author Klaus Meffert * @since 2.6 */ public void testToString_1() throws Exception { Configuration conf = new ConfigurationForTesting(); conf.getGeneticOperators().clear(); conf.getNaturalSelectors(false).clear(); conf.getNaturalSelectors(true).clear(); privateAccessor.setField(conf, "m_eventManager", null); String s = trimString(conf.toString()); String eventmgr = conf.S_NONE; String genops = conf.S_NONE; // natural selectors (pre) String natselsPre = conf.S_NONE; // natural selectors (post) String natselsPost = conf.S_NONE; assertEquals( trimString( conf.S_CONFIGURATION + ":" + conf.S_CONFIGURATION_NAME + ":" + conf.getName() + " " + conf.S_POPULATION_SIZE + ":" + conf.getPopulationSize() + " " + conf.S_MINPOPSIZE + ":" + conf.getMinimumPopSizePercent() + " " + conf.S_CHROMOSOME_SIZE + ":" + conf.getChromosomeSize() + " " + conf.S_SAMPLE_CHROM + ":" + conf.S_SIZE + ":" + conf.getSampleChromosome().size() + " " + conf.S_TOSTRING + ":" + conf.getSampleChromosome().toString() + " " + conf.S_RANDOM_GENERATOR + ":" + conf.getRandomGenerator().getClass().getName() + " " + conf.S_EVENT_MANAGER + ":" + eventmgr + " " + conf.S_CONFIGURATION_HANDLER + ":" + conf.getConfigurationHandler().getName() + " " + conf.S_FITNESS_FUNCTION + ":" + conf.getFitnessFunction().getClass().getName() + " " + conf.S_FITNESS_EVALUATOR + ":" + conf.getFitnessEvaluator().getClass().getName() + " " + conf.S_GENETIC_OPERATORS + ":" + genops + " " + conf.S_NATURAL_SELECTORS + "(" + conf.S_PRE + ")" + ":" + natselsPre + " " + conf.S_NATURAL_SELECTORS + "(" + conf.S_POST + ")" + ":" + natselsPost + " " // + conf.S_POPCONSTANT_SELECTOR + ":" // + "null" + " " ), s); }
/** * @throws Exception * @author Klaus Meffert * @since 2.4 */ public void testToString_0() throws Exception { Configuration conf = new ConfigurationForTesting(); conf.addGeneticOperator(new MutationOperator(conf)); conf.addNaturalSelector(new WeightedRouletteSelector(conf), true); conf.addNaturalSelector(new WeightedRouletteSelector(conf), false); conf.addNaturalSelector(new BestChromosomesSelector(conf), false); String s = trimString(conf.toString()); String eventmgr = conf.getEventManager() != null ? conf.getEventManager().getClass().getName() : conf.S_NONE; String genops = ""; if (conf.getGeneticOperators().size() < 1) { genops = conf.S_NONE; } else { for (int i = 0; i < conf.getGeneticOperators().size(); i++) { if (i > 0) { genops += "; "; } genops += conf.getGeneticOperators().get(i).getClass().getName(); ; } } // natural selectors (pre) String natselsPre = ""; int natsize = conf.getNaturalSelectors(true).size(); if (natsize < 1) { natselsPre = conf.S_NONE; } else { for (int i = 0; i < natsize; i++) { if (i > 0) { natselsPre += "; "; } natselsPre += " " + conf.getNaturalSelectors(true).get(i).getClass().getName(); } } // natural selectors (post) String natselsPost = ""; natsize = conf.getNaturalSelectors(false).size(); if (natsize < 1) { natselsPost = conf.S_NONE; } else { for (int i = 0; i < natsize; i++) { if (i > 0) { natselsPost += "; "; } natselsPost += " " + conf.getNaturalSelectors(false).get(i).getClass().getName(); } } assertEquals( trimString( conf.S_CONFIGURATION + ":" + conf.S_CONFIGURATION_NAME + ":" + conf.getName() + " " + conf.S_POPULATION_SIZE + ":" + conf.getPopulationSize() + " " + conf.S_MINPOPSIZE + ":" + conf.getMinimumPopSizePercent() + " " + conf.S_CHROMOSOME_SIZE + ":" + conf.getChromosomeSize() + " " + conf.S_SAMPLE_CHROM + ":" + conf.S_SIZE + ":" + conf.getSampleChromosome().size() + " " + conf.S_TOSTRING + ":" + conf.getSampleChromosome().toString() + " " + conf.S_RANDOM_GENERATOR + ":" + conf.getRandomGenerator().getClass().getName() + " " + conf.S_EVENT_MANAGER + ":" + eventmgr + " " + conf.S_CONFIGURATION_HANDLER + ":" + conf.getConfigurationHandler().getName() + " " + conf.S_FITNESS_FUNCTION + ":" + conf.getFitnessFunction().getClass().getName() + " " + conf.S_FITNESS_EVALUATOR + ":" + conf.getFitnessEvaluator().getClass().getName() + " " + conf.S_GENETIC_OPERATORS + ":" + genops + " " + conf.S_NATURAL_SELECTORS + "(" + conf.S_PRE + ")" + ":" + natselsPre + " " + conf.S_NATURAL_SELECTORS + "(" + conf.S_POST + ")" + ":" + natselsPost + " " // + conf.S_POPCONSTANT_SELECTOR + ":" // + "null" + " " ), s); }