package ec.de;
import ec.*;
import ec.simple.*;
/*
* DEEvaluator.java
*
* Created: Fri Aug 13 11:20:54 EDT 2010
* By: Sean Luke
*/
/**
* DEEvaluator is a simple subclass of SimpleEvaluator which first evaluates the population, then
* compares each population member against the parent which had created it in Differential Evolution.
* The parents are stored in DEBreeder.previousPopulation. If the parent is superior to the child,
* then the parent replaces the child in the population and the child is discarded. This does not
* happen in the first generation, as there are of course no parents yet.
*
* This code could have been moved into the Breeder of course. But then the better of the parents
* and children would not appear in standard Statistics objects. So we've broken it out here.
*
*
The full description of Differential Evolution may be found in the book
* "Differential Evolution: A Practical Approach to Global Optimization"
* by Kenneth Price, Rainer Storn, and Jouni Lampinen.
*
* @author Sean Luke
* @version 1.0
*/
public class DEEvaluator extends SimpleEvaluator
{
public void evaluatePopulation(EvolutionState state)
{
super.evaluatePopulation(state);
if( state.breeder instanceof DEBreeder )
{
Population previousPopulation = ((DEBreeder)(state.breeder)).previousPopulation; // for faster access
if( previousPopulation != null )
{
if( previousPopulation.subpops.length != state.population.subpops.length )
state.output.fatal( "DEEvaluator requires that the population have the same number of subpopulations every generation.");
for( int i = 0 ; i < previousPopulation.subpops.length ; i++ )
{
if( state.population.subpops[i].individuals.length != previousPopulation.subpops[i].individuals.length )
state.output.fatal( "DEEvaluator requires that subpopulation " + i + " should have the same number of individuals in all generations." );
for( int j = 0 ; j < state.population.subpops[i].individuals.length ; j++ )
if( previousPopulation.subpops[i].individuals[j].fitness.betterThan( state.population.subpops[i].individuals[j].fitness ) )
state.population.subpops[i].individuals[j] = previousPopulation.subpops[i].individuals[j];
}
}
}
else state.output.fatal("DEEvaluator requires DEBreeder to be the breeder.");
}
}
Ads help maintain this website.