1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.dishevelled.evolve.examples;
25
26 import java.util.ArrayList;
27 import java.util.Collection;
28 import java.util.Collections;
29 import java.util.List;
30 import java.util.Random;
31
32 import org.dishevelled.evolve.EvolutionaryAlgorithm;
33 import org.dishevelled.evolve.EvolutionaryAlgorithmAdapter;
34 import org.dishevelled.evolve.EvolutionaryAlgorithmEvent;
35 import org.dishevelled.evolve.EvolutionaryAlgorithmListener;
36 import org.dishevelled.evolve.ExitStrategy;
37 import org.dishevelled.evolve.Fitness;
38 import org.dishevelled.evolve.Recombination;
39 import org.dishevelled.evolve.Selection;
40
41 import org.dishevelled.evolve.exit.FitnessThresholdExitStrategy;
42
43 import org.dishevelled.evolve.impl.EvolutionaryAlgorithmImpl;
44
45 import org.dishevelled.evolve.mutate.IndividualWiseMutation;
46 import org.dishevelled.evolve.mutate.NullIndividualWiseMutation;
47 import org.dishevelled.evolve.mutate.ProportionalMutation;
48
49 import org.dishevelled.evolve.recombine.NullRecombination;
50
51 import org.dishevelled.evolve.select.FitnessProportionalSelection;
52
53
54
55
56
57
58
59 public final class GuessTheNumber
60 implements Runnable
61 {
62
63 private final int number;
64
65
66 private final int individuals;
67
68
69 private final int maxNumber;
70
71
72 private final Random random;
73
74
75 private final ExitStrategy<Integer> exitStrategy;
76
77
78 private final Recombination<Integer> recombination;
79
80
81 private final ProportionalMutation<Integer> mutation;
82
83
84 private final Fitness<Integer> fitness;
85
86
87 private final Selection<Integer> selection;
88
89
90 private final boolean verbose = true;
91
92
93
94
95
96 public GuessTheNumber()
97 {
98 random = new Random();
99 maxNumber = 1000;
100 number = random.nextInt(maxNumber);
101 individuals = 10;
102
103 exitStrategy = new FitnessThresholdExitStrategy<Integer>(0.99d);
104
105 recombination = new NullRecombination<Integer>();
106
107 mutation = new ProportionalMutation<Integer>();
108 mutation.add(new NullIndividualWiseMutation<Integer>(), 0.8d);
109 mutation.add(new IndividualWiseMutation<Integer>()
110 {
111
112 public Integer mutate(final Integer i)
113 {
114 int j = i.intValue();
115 j += random.nextInt((int) (maxNumber / 4.0d));
116 j -= random.nextInt((int) (maxNumber / 4.0d));
117 j = Math.max(0, j);
118 j = Math.min(maxNumber, j);
119 return Integer.valueOf(j);
120 }
121 }, 0.2d);
122
123 fitness = new Fitness<Integer>()
124 {
125
126 public Double score(final Integer i)
127 {
128 return (1.0d / (Math.abs(number - i) + 1.0d));
129 }
130 };
131
132 selection = new FitnessProportionalSelection<Integer>();
133 }
134
135
136 public void run()
137 {
138 EvolutionaryAlgorithm<Integer> ea = new EvolutionaryAlgorithmImpl<Integer>();
139 EvolutionaryAlgorithmListener<Integer> logger = new LoggingEvolutionaryAlgorithmListener();
140 if (verbose)
141 {
142 ea.addEvolutionaryAlgorithmListener(logger);
143 }
144 try
145 {
146 Collection<Integer> population = new ArrayList<Integer>(individuals);
147 for (int i = 0; i < individuals; i++)
148 {
149 population.add(random.nextInt(maxNumber));
150 }
151 Collection<Integer> evolved = ea.evolve(population, exitStrategy, recombination, mutation, fitness, selection);
152 System.out.println("number to guess=" + number);
153 System.out.println("done.\nevolved=" + evolved);
154 }
155 catch (RuntimeException e)
156 {
157 throw e;
158 }
159 finally
160 {
161 if (verbose)
162 {
163 ea.removeEvolutionaryAlgorithmListener(logger);
164 }
165 }
166 }
167
168
169
170
171 private class LoggingEvolutionaryAlgorithmListener
172 extends EvolutionaryAlgorithmAdapter<Integer>
173 {
174
175
176 public void exitFailed(final EvolutionaryAlgorithmEvent<Integer> event)
177 {
178 int time = event.getTime();
179 List<Integer> population = new ArrayList<Integer>(event.getPopulation());
180 Collections.sort(population);
181 System.out.println("time=" + time + " population=" + population);
182 }
183 }
184
185
186
187
188
189
190 public static void main(final String[] args)
191 {
192 new GuessTheNumber().run();
193 }
194 }