[6152] | 1 | package ec.de; |
---|
| 2 | |
---|
| 3 | import ec.*; |
---|
| 4 | import ec.util.*; |
---|
| 5 | import ec.vector.*; |
---|
| 6 | |
---|
| 7 | /* |
---|
| 8 | * Best1BinDEBreeder.java |
---|
| 9 | * |
---|
| 10 | * Created: Wed Apr 26 17:50:17 2006 |
---|
| 11 | * By: Liviu Panait |
---|
| 12 | */ |
---|
| 13 | |
---|
| 14 | /** |
---|
| 15 | * Best1BinDEBreeder is a differential evolution breeding operator. |
---|
| 16 | * The code is derived from a DE algorithm, known as DE/best/1/bin "with uniform jitter", |
---|
| 17 | * found on page 140 of |
---|
| 18 | * "Differential Evolution: A Practical Approach to Global Optimization" |
---|
| 19 | * by Kenneth Price, Rainer Storn, and Jouni Lampinen. |
---|
| 20 | * |
---|
| 21 | * <p>Best1BinDEBreeder requires that all individuals be DoubleVectorIndividuals. |
---|
| 22 | * |
---|
| 23 | * <p>In short, the algorithm is as follows. For each individual in the population, we produce a child |
---|
| 24 | * by first selecting the best individual in the population, which we call r0. We then |
---|
| 25 | * select two more (different) individuals, none the original individual nor r0, called r1 and r2. |
---|
| 26 | * We then create an individal c, defined as c = r0 + FJitter() * (r1 - r2), where FJitter() is |
---|
| 27 | * a per-gene independent random number defined as F + F_NOISE * (random(0,1) - 0.5). A common value for |
---|
| 28 | * F_NOISE is 0.001. Last, we cross over c with the |
---|
| 29 | * original individual and produce a single child, using uniform crossover with gene-independent |
---|
| 30 | * crossover probability "Cr". |
---|
| 31 | * |
---|
| 32 | * <p>This class should be used in conjunction with |
---|
| 33 | * DEEvaluator, which allows the children to enter the population only if they're superior to their |
---|
| 34 | * parents (the original individuals). If so, they replace their parents. |
---|
| 35 | * |
---|
| 36 | * <p><b>Parameters</b><br> |
---|
| 37 | * <table> |
---|
| 38 | * <tr><td valign=top><i>base.</i><tt>f-noise</tt><br> |
---|
| 39 | * <font size=-1>0.0 <= double </font></td> |
---|
| 40 | * <td valign=top>The "F_NOISE" jitter value</td></tr> |
---|
| 41 | * |
---|
| 42 | * </table> |
---|
| 43 | * |
---|
| 44 | * @author Liviu Panait and Sean Luke |
---|
| 45 | * @version 2.0 |
---|
| 46 | */ |
---|
| 47 | |
---|
| 48 | public class Best1BinDEBreeder extends DEBreeder |
---|
| 49 | { |
---|
| 50 | /** limits on uniform noise for F */ |
---|
| 51 | public double F_NOISE = 0.0; |
---|
| 52 | |
---|
| 53 | public static final String P_FNOISE = "f-noise"; |
---|
| 54 | |
---|
| 55 | public void setup(final EvolutionState state, final Parameter base) |
---|
| 56 | { |
---|
| 57 | super.setup(state,base); |
---|
| 58 | |
---|
| 59 | F_NOISE = state.parameters.getDouble(base.push(P_FNOISE), null, 0.0); |
---|
| 60 | if ( F_NOISE < 0.0 ) |
---|
| 61 | state.output.fatal( "Parameter not found, or its value is below 0.0.", base.push(P_FNOISE), null ); |
---|
| 62 | } |
---|
| 63 | |
---|
| 64 | |
---|
| 65 | public DoubleVectorIndividual createIndividual( final EvolutionState state, |
---|
| 66 | int subpop, |
---|
| 67 | int index, |
---|
| 68 | int thread) |
---|
| 69 | { |
---|
| 70 | Individual[] inds = state.population.subpops[subpop].individuals; |
---|
| 71 | |
---|
| 72 | DoubleVectorIndividual v = (DoubleVectorIndividual)(inds[index].clone()); |
---|
| 73 | |
---|
| 74 | do |
---|
| 75 | { |
---|
| 76 | // select three indexes different from each other and from that of the current parent |
---|
| 77 | int r0, r1, r2; |
---|
| 78 | // do |
---|
| 79 | { |
---|
| 80 | r0 = bestSoFarIndex[subpop]; |
---|
| 81 | } |
---|
| 82 | // while( r0 == index ); |
---|
| 83 | do |
---|
| 84 | { |
---|
| 85 | r1 = state.random[thread].nextInt(inds.length); |
---|
| 86 | } |
---|
| 87 | while( r1 == r0 || r1 == index ); |
---|
| 88 | do |
---|
| 89 | { |
---|
| 90 | r2 = state.random[thread].nextInt(inds.length); |
---|
| 91 | } |
---|
| 92 | while( r2 == r1 || r2 == r0 || r2 == index ); |
---|
| 93 | |
---|
| 94 | DoubleVectorIndividual g0 = (DoubleVectorIndividual)(inds[r0]); |
---|
| 95 | DoubleVectorIndividual g1 = (DoubleVectorIndividual)(inds[r1]); |
---|
| 96 | DoubleVectorIndividual g2 = (DoubleVectorIndividual)(inds[r2]); |
---|
| 97 | |
---|
| 98 | for(int i = 0; i < v.genome.length; i++) |
---|
| 99 | v.genome[i] = g0.genome[i] + |
---|
| 100 | (F + state.random[thread].nextDouble() * F_NOISE - (F_NOISE / 2.0)) * |
---|
| 101 | (g1.genome[i] - g2.genome[i]); |
---|
| 102 | } |
---|
| 103 | while(!valid(v)); |
---|
| 104 | |
---|
| 105 | return crossover(state, (DoubleVectorIndividual)(inds[index]), v, thread); |
---|
| 106 | } |
---|
| 107 | |
---|
| 108 | } |
---|