package ec.de;
import ec.*;
import ec.util.*;
import ec.vector.*;
/*
* Best1BinDEBreeder.java
*
* Created: Wed Apr 26 17:50:17 2006
* By: Liviu Panait
*/
/**
* Best1BinDEBreeder is a differential evolution breeding operator.
* The code is derived from a DE algorithm, known as DE/best/1/bin "with uniform jitter",
* found on page 140 of
* "Differential Evolution: A Practical Approach to Global Optimization"
* by Kenneth Price, Rainer Storn, and Jouni Lampinen.
*
*
Best1BinDEBreeder requires that all individuals be DoubleVectorIndividuals.
*
*
In short, the algorithm is as follows. For each individual in the population, we produce a child
* by first selecting the best individual in the population, which we call r0. We then
* select two more (different) individuals, none the original individual nor r0, called r1 and r2.
* We then create an individal c, defined as c = r0 + FJitter() * (r1 - r2), where FJitter() is
* a per-gene independent random number defined as F + F_NOISE * (random(0,1) - 0.5). A common value for
* F_NOISE is 0.001. Last, we cross over c with the
* original individual and produce a single child, using uniform crossover with gene-independent
* crossover probability "Cr".
*
*
This class should be used in conjunction with
* DEEvaluator, which allows the children to enter the population only if they're superior to their
* parents (the original individuals). If so, they replace their parents.
*
*
Parameters
*
* base.f-noise
* 0.0 <= double |
* The "F_NOISE" jitter value |
*
*
*
* @author Liviu Panait and Sean Luke
* @version 2.0
*/
public class Best1BinDEBreeder extends DEBreeder
{
/** limits on uniform noise for F */
public double F_NOISE = 0.0;
public static final String P_FNOISE = "f-noise";
public void setup(final EvolutionState state, final Parameter base)
{
super.setup(state,base);
F_NOISE = state.parameters.getDouble(base.push(P_FNOISE), null, 0.0);
if ( F_NOISE < 0.0 )
state.output.fatal( "Parameter not found, or its value is below 0.0.", base.push(P_FNOISE), null );
}
public DoubleVectorIndividual createIndividual( final EvolutionState state,
int subpop,
int index,
int thread)
{
Individual[] inds = state.population.subpops[subpop].individuals;
DoubleVectorIndividual v = (DoubleVectorIndividual)(inds[index].clone());
do
{
// select three indexes different from each other and from that of the current parent
int r0, r1, r2;
// do
{
r0 = bestSoFarIndex[subpop];
}
// while( r0 == index );
do
{
r1 = state.random[thread].nextInt(inds.length);
}
while( r1 == r0 || r1 == index );
do
{
r2 = state.random[thread].nextInt(inds.length);
}
while( r2 == r1 || r2 == r0 || r2 == index );
DoubleVectorIndividual g0 = (DoubleVectorIndividual)(inds[r0]);
DoubleVectorIndividual g1 = (DoubleVectorIndividual)(inds[r1]);
DoubleVectorIndividual g2 = (DoubleVectorIndividual)(inds[r2]);
for(int i = 0; i < v.genome.length; i++)
v.genome[i] = g0.genome[i] +
(F + state.random[thread].nextDouble() * F_NOISE - (F_NOISE / 2.0)) *
(g1.genome[i] - g2.genome[i]);
}
while(!valid(v));
return crossover(state, (DoubleVectorIndividual)(inds[index]), v, thread);
}
}