1 | package ec.de; |
---|
2 | |
---|
3 | import ec.*; |
---|
4 | import ec.util.*; |
---|
5 | import ec.vector.*; |
---|
6 | |
---|
7 | /* |
---|
8 | * Rand1EitherOrDEBreeder.java |
---|
9 | * |
---|
10 | * Created: Wed Apr 26 18:01:11 2006 |
---|
11 | * By: Liviu Panait |
---|
12 | */ |
---|
13 | |
---|
14 | /** |
---|
15 | * Rand1EitherOrDEBreeder is a differential evolution breeding operator. |
---|
16 | * The code is derived from a DE algorithm, known as DE/rand/1/either-or, |
---|
17 | * found on page 141 of |
---|
18 | * "Differential Evolution: A Practical Approach to Global Optimization" |
---|
19 | * by Kenneth Price, Rainer Storn, and Jouni Lampinen. |
---|
20 | * |
---|
21 | * <p>Rand1EitherOrDEBreeder 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 selecting three (different) individuals, none the original individual, called r0, r1, and r2. |
---|
25 | * We then create an individal c, defined either c = r0 + F * (r1 - r2), or as c = r0 + 0.5 * (F+1) * (r1 + r2 - 2 * r0), |
---|
26 | * depending on a coin flip of probability "PF" (if 'true', the first equation is used, else the second). |
---|
27 | * Unlike the other DEBreeders in this package, we do *not* cross over the child with the original individual. |
---|
28 | * In fact, if the crossover probability is specified, Rand1EitherOrDEBreeder will issue a warning that it's |
---|
29 | * not using it. |
---|
30 | * |
---|
31 | * <p>This class should be used in conjunction with |
---|
32 | * DEEvaluator, which allows the children to enter the population only if they're superior to their |
---|
33 | * parents (the original individuals). If so, they replace their parents. |
---|
34 | * |
---|
35 | * <p><b>Parameters</b><br> |
---|
36 | * <table> |
---|
37 | * <tr><td valign=top><i>base.</i><tt>pf</tt><br> |
---|
38 | * <font size=-1>0.0 <= double <= 1.0 </font></td> |
---|
39 | * <td valign=top>The "PF" probability of mutation type</td></tr> |
---|
40 | * </table> |
---|
41 | * |
---|
42 | * @author Liviu Panait and Sean Luke |
---|
43 | * @version 2.0 |
---|
44 | */ |
---|
45 | |
---|
46 | |
---|
47 | public class Rand1EitherOrDEBreeder extends DEBreeder |
---|
48 | { |
---|
49 | public double PF = 0.0; |
---|
50 | |
---|
51 | public static final String P_PF = "pf"; |
---|
52 | |
---|
53 | public void setup(final EvolutionState state, final Parameter base) |
---|
54 | { |
---|
55 | super.setup(state,base); |
---|
56 | |
---|
57 | PF = state.parameters.getDouble(base.push(P_PF),null,0.0); |
---|
58 | if ( PF < 0.0 || PF > 1.0 ) |
---|
59 | state.output.fatal( "Parameter not found, or its value is outside of [0.0,1.0].", base.push(P_PF), null ); |
---|
60 | |
---|
61 | if (state.parameters.exists(base.push(P_Cr), null)) |
---|
62 | state.output.warning("Crossover parameter specified, but Rand1EitherOrDEBreeder does not use crossover.", base.push(P_Cr)); |
---|
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 = state.random[thread].nextInt(inds.length); |
---|
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 | if (state.random[thread].nextBoolean(PF)) |
---|
100 | v.genome[i] = g0.genome[i] + F * (g1.genome[i] - g2.genome[i]); |
---|
101 | else |
---|
102 | v.genome[i] = g0.genome[i] + 0.5 * (F+1) * (g1.genome[i] + g2.genome[i] - 2 * g0.genome[i]); |
---|
103 | } |
---|
104 | while(!valid(v)); |
---|
105 | |
---|
106 | return v; // no crossover is performed |
---|
107 | } |
---|
108 | |
---|
109 | } |
---|