/* * This file is part of JGAP. * * JGAP offers a dual license model containing the LGPL as well as the MPL. * * For licensing information please see the file license.txt included with JGAP * or have a look at the top of class org.jgap.Chromosome which representatively * includes the JGAP license policy applicable for any file delivered with JGAP. */ package org.jgap; /** * An extended implementation of NaturalSelector that acts as a base class for * the built-in JGAP selectors BestChromosomesSelector and * WeightedRouletteSelector. * * @author Klaus Meffert * @since 3.3.3 */ public abstract class NaturalSelectorExt extends NaturalSelector { private Population m_to_pop; /** * Allows or disallows doublette chromosomes to be added to the selector */ private boolean m_doublettesAllowed; /** * Default constructor, only needed for dynamic instantiation! * * @throws InvalidConfigurationException * * @author Klaus Meffert * @since 3.3.3 */ public NaturalSelectorExt() throws InvalidConfigurationException { super(); init(Genotype.getStaticConfiguration()); } /** * * @param a_config the configuration to use * * @throws InvalidConfigurationException * * @author Klaus Meffert * @since 3.3.3 */ public NaturalSelectorExt(Configuration a_config) throws InvalidConfigurationException { super(a_config); init(a_config); } protected void init(Configuration a_config) throws InvalidConfigurationException { } /** * Determines whether doublette chromosomes may be added to the selector or * will be ignored. * @param a_doublettesAllowed true: doublette chromosomes allowed to be * added to the selector. false: doublettes will be ignored and not added * * @author Klaus Meffert * @since 3.3.3 */ public void setDoubletteChromosomesAllowed(final boolean a_doublettesAllowed) { m_doublettesAllowed = a_doublettesAllowed; } /** * @return true: doublette chromosomes allowed to be added to the selector * false: this is sort of risky and might lead to unexpected population sizes * during evolution! * * @author Klaus Meffert * @since 3.3.3 */ public boolean getDoubletteChromosomesAllowed() { return m_doublettesAllowed; } /** * @param a_o the object to compare * @return true: compared object is seen as equal to current instance * * @author Klaus Meffert * @since 3.3.3 */ public boolean equals(Object a_o) { if (a_o == null) { return false; } NaturalSelectorExt other = (NaturalSelectorExt) a_o; if (!super.equals(a_o)) { return false; } if (m_doublettesAllowed != other.m_doublettesAllowed) { return false; } return true; } /* Add a chromosome instance to the selector's working pool of chromosomes. * @param a_chromosomeToAdd the specimen to add to the pool * @author Klaus Meffert * @since 3.3.3 */ protected abstract void add(final IChromosome a_chromosomeToAdd); /** * Selects a given number of Chromosomes that will move on to the next * generation population. * * @param a_from_pop the population the Chromosomes will be selected from * @param a_to_pop the population the Chromosomes will be added to * @param a_howManyToSelect the number of Chromosomes to select * * @author Klaus Meffert * @since 3.3.3 */ public final synchronized void select(final int a_howManyToSelect, final Population a_from_pop, Population a_to_pop) { if (a_from_pop != null) { int popSize = a_from_pop.size(); if (popSize < 1) { throw new IllegalStateException("Population size must be greater 0"); } for (int i = 0; i < popSize; i++) { add(a_from_pop.getChromosome(i)); } } selectChromosomes(a_howManyToSelect, a_to_pop); } /** * Selects a given number of chromosomes that will move on to the next * generation population. For selecting a chromosome for the next generation, * the method selectChromosome(IChromosome, boolean) has to be used! * * @param a_from_pop the population the Chromosomes will be selected from * @param a_howManyToSelect the number of Chromosomes to select * * @author Klaus Meffert * @since 3.3.3 */ protected abstract void selectChromosomes(final int a_howManyToSelect, final Population a_from_pop); protected final void selectChromosome(IChromosome a_chrom, final boolean a_clone) { if (a_clone && !m_to_pop.contains(a_chrom)) { // Use cloning. // ------------ ICloneHandler cloner = getConfiguration().getJGAPFactory(). getCloneHandlerFor(a_chrom, null); if (cloner != null) { try { IChromosome original = a_chrom; a_chrom = (IChromosome) cloner.perform(original, null, null); a_chrom.setIsSelectedForNextGeneration(true); m_to_pop.addChromosome(a_chrom); if (m_monitorActive) { a_chrom.setUniqueIDTemplate(original.getUniqueID(), 1); } } catch (Exception ex) { ex.printStackTrace(); } } } else { m_to_pop.addChromosome(a_chrom); } } }