/*
* 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;
import java.util.*;
import org.jgap.audit.*;
import org.jgap.event.*;
/**
* Abstract base class for breeders.
*
* @author Klaus Meffert
* @since 3.2
*/
public abstract class BreederBase
implements IBreeder {
/** String containing the CVS revision. Read out via reflection!*/
private final static String CVS_REVISION = "$Revision: 1.9 $";
public BreederBase() {
}
/**
* Applies all NaturalSelectors registered with the Configuration.
*
* @param a_config the configuration to use
* @param a_pop the population to use as input
* @param a_processBeforeGeneticOperators true apply NaturalSelectors
* applicable before GeneticOperators, false: apply the ones applicable
* after GeneticOperators
* @return selected part of input population
*
* @author Klaus Meffert
* @since 3.2
*/
protected Population applyNaturalSelectors(Configuration a_config,
Population a_pop, boolean a_processBeforeGeneticOperators) {
/**@todo optionally use working pool*/
boolean monitorActive = a_config.getMonitor() != null;
try {
// Process all natural selectors applicable before executing the
// genetic operators (reproduction, crossing over, mutation...).
// -------------------------------------------------------------
int selectorSize = a_config.getNaturalSelectorsSize(
a_processBeforeGeneticOperators);
if (selectorSize > 0) {
int population_size = a_config.getPopulationSize();
// Only select part of the previous population into this generation.
// -----------------------------------------------------------------
population_size = (int) Math.round(population_size *
a_config.getSelectFromPrevGen());
int single_selection_size;
Population new_population = new Population(a_config, population_size);
NaturalSelector selector;
// Repopulate the population of chromosomes with those selected
// by the natural selector. Iterate over all natural selectors.
// ------------------------------------------------------------
for (int i = 0; i < selectorSize; i++) {
selector = a_config.getNaturalSelector(
a_processBeforeGeneticOperators, i);
if (i == selectorSize - 1 && i > 0) {
// Ensure the last NaturalSelector adds the remaining Chromosomes.
// ---------------------------------------------------------------
single_selection_size = population_size - new_population.size();
}
else {
single_selection_size = population_size / selectorSize;
}
if (monitorActive) {
// Monitor that selection is going to be performed.
// ------------------------------------------------
a_config.getMonitor().event(
IEvolutionMonitor.MONITOR_EVENT_BEFORE_SELECT,
a_config.getGenerationNr(),
new Object[] {selector, a_pop, single_selection_size,
a_processBeforeGeneticOperators});
}
// Do selection of chromosomes.
// ----------------------------
/**@todo utilize jobs: integrate job into NaturalSelector!*/
selector.select(single_selection_size, a_pop, new_population);
if (monitorActive) {
// Monitor population after selection took place.
// ----------------------------------------------
a_config.getMonitor().event(
IEvolutionMonitor.MONITOR_EVENT_AFTER_SELECT,
a_config.getGenerationNr(),
new Object[] {selector, a_pop, new_population,
single_selection_size, a_processBeforeGeneticOperators});
}
// Clean up the natural selector.
// ------------------------------
selector.empty();
}
return new_population;
}
else {
return a_pop;
}
} catch (InvalidConfigurationException iex) {
// This exception should never be reached.
// ---------------------------------------
throw new IllegalStateException(iex);
}
}
/**
* Applies all GeneticOperators registered with the Configuration.
*
* @param a_config the configuration to use
* @param a_pop the population to use as input
*
* @author Klaus Meffert
* @since 3.2
*/
protected void applyGeneticOperators(Configuration a_config, Population a_pop) {
List geneticOperators = a_config.getGeneticOperators();
Iterator operatorIterator = geneticOperators.iterator();
boolean monitorActive = a_config.getMonitor() != null;
while (operatorIterator.hasNext()) {
GeneticOperator operator = (GeneticOperator) operatorIterator.next();
/**@todo utilize jobs: integrate job into GeneticOperator*/
// Fire listener before genetic operator will be executed.
// -------------------------------------------------------
a_config.getEventManager().fireGeneticEvent(
new GeneticEvent(GeneticEvent.BEFORE_GENETIC_OPERATOR, new Object[] {
this, operator}));
if (monitorActive) {
// Monitor that operator will be performed.
// ----------------------------------------
a_config.getMonitor().event(
IEvolutionMonitor.MONITOR_EVENT_BEFORE_OPERATE,
a_config.getGenerationNr(),
new Object[] {operator, a_pop, a_pop.getChromosomes()});
}
operator.operate(a_pop, a_pop.getChromosomes());
if (monitorActive) {
// Monitor that operator has been performed.
// -----------------------------------------
a_config.getMonitor().event(
IEvolutionMonitor.MONITOR_EVENT_AFTER_OPERATE,
a_config.getGenerationNr(),
new Object[] {operator, a_pop, a_pop.getChromosomes()});
}
// Fire listener after genetic operator has been executed.
// -------------------------------------------------------
a_config.getEventManager().fireGeneticEvent(
new GeneticEvent(GeneticEvent.AFTER_GENETIC_OPERATOR, new Object[] {
this, operator}));
}
}
/**
* @return deep clone of this instance
*
* @author Klaus Meffert
* @since 3.2
*/
public abstract Object clone();
/**
* @param a_other object to compare to
* @return as always
*
* @author Klaus Meffert
* @since 3.2
*/
public int compareTo(Object a_other) {
if (a_other == null) {
return 1;
}
return getClass().getName().compareTo(a_other.getClass().getName());
}
}