annotate trunk/aid/ga.d @ 0:4b2e8e8a633e

Repository setup.
author revcompgeek
date Mon, 03 Mar 2008 19:28:10 -0700
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
1 /***********************************
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
2 * Provides a set of classes *
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
3 * for using Genetic Algorithms. *
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
4 * *
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
5 * Author: Matt P. *
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
6 * Version: 0.1 *
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
7 ***********************************/
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
8
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
9 module aid.ga;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
10
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
11 import tango.math.Random;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
12 import tango.io.Stdout;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
13
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
14 void removeIndex(Gene[] array, uint index){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
15 //scope(failure) Stdout.format("E: removeIndex {}", index).newline;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
16 if (index == 0)
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
17 array = array[1..$];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
18 else if (index == array.length)
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
19 array = array[0..$-1];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
20 else
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
21 array = array[0..index-1] ~ array[index+1..$];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
22 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
23
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
24 class Gene {
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
25 char[] geneSequence;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
26 private double fit = -1; // Save the fitness value so that it doesn't have to be calculated more than once.
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
27 private GeneticAlgorithm* ga;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
28
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
29 this(GeneticAlgorithm* a){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
30 ga = a;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
31 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
32
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
33 this(Gene g, GeneticAlgorithm* a){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
34 scope(failure) Stdout("E: Gene clone").newline;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
35 geneSequence = g.geneSequence.dup;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
36 this(a);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
37 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
38
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
39 double fitness(){ // Get property
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
40 if (fit == -1){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
41 fit = ga.calculateFitness(geneSequence);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
42 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
43 return fit;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
44 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
45
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
46 Gene[] crossover(Gene other){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
47 Gene gene1 = new Gene(this,ga),gene2 = new Gene(other,ga);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
48 auto r = Random.shared;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
49 auto len = geneSequence.length;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
50 char[] temp;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
51
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
52 //scope(failure) Stdout.format("E: crossover {}").newline;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
53
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
54 if (ga.crossoverType == 2){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
55 //Stdout("1").flush;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
56 uint point1 = r.next(len-2)+1;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
57 uint point2 = r.next(len-2)+1;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
58 while (point1 == point2)
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
59 point2 = r.next(len);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
60 if (point2 < point1){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
61 scope uint t = point1;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
62 point1 = point2;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
63 point2 = t;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
64 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
65 //Stdout("2").newline;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
66 scope(failure) Stdout.format("Ed: {},{}",point1,point2).newline;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
67 //Stdout(point1)(", ")(point2).newline;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
68 temp = gene1.geneSequence[point1..point2].dup;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
69 //Stdout("4").flush;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
70 gene1.geneSequence[point1..point2] = gene2.geneSequence[point1..point2].dup;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
71 //Stdout("5").flush;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
72 gene2.geneSequence[point1..point2] = temp;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
73 //Stdout("6").flush;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
74 } else if (ga.crossoverType == 1) {
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
75 uint point = r.next(len-2)+1;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
76 temp = gene1.geneSequence[point..$].dup;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
77 gene1.geneSequence[point..$] = gene2.geneSequence[point..$];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
78 gene2.geneSequence[point..$] = temp;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
79 } else { // Uniform crossover
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
80 for (int i = 0; i < len / 2; i++){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
81 uint point = r.next(len);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
82
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
83 auto t = gene1.geneSequence[point];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
84 gene1.geneSequence[point] = gene2.geneSequence[point];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
85 gene2.geneSequence[point] = t;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
86 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
87 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
88 return [gene1,gene2];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
89 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
90
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
91 Gene mutate(){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
92 Gene g = new Gene(this,ga);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
93 uint i = Random.shared.next(g.geneSequence.length);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
94 g.geneSequence[i] = ga.getRandomChar(i);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
95 return g;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
96 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
97 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
98
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
99 class Generation {
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
100 private Gene[] genes;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
101 private uint population;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
102 private GeneticAlgorithm* ga;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
103
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
104 public this(GeneticAlgorithm* g, bool generate = false){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
105 ga = g;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
106 population = ga.startPopulation;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
107 if (generate) generateGenes();
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
108 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
109
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
110 public this(Generation gen){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
111 genes = gen.genes;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
112 ga = gen.ga;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
113 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
114
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
115 public Generation evolve(){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
116 Generation newGen = new Generation(ga);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
117
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
118 // Use tournament selection to create a new Generation
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
119 uint livingPop = cast(uint)(population * ga.survivalRate);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
120 newGen.population = population;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
121 newGen.genes.length = population;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
122 for (auto i = 0; i < livingPop; i++){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
123 uint t = tournamentSelect();
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
124 newGen.genes[i] = genes[t];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
125 //genes.removeIndex(t);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
126 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
127
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
128 // Cross over the left over genes
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
129 for (auto i = livingPop; i < population; i+=2){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
130 uint i1 = tournamentSelect(), i2 = tournamentSelect();
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
131 while (i1 == i2)
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
132 i2 = tournamentSelect();
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
133 Gene g1 = genes[i1], g2 = genes[i2];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
134
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
135 Gene[] gs = g1.crossover(g2);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
136
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
137 newGen.genes[i..i+2] = gs[];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
138 if (ga.deleteOnCrossover){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
139 genes.removeIndex(i1);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
140 genes.removeIndex(i2);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
141 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
142 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
143
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
144 // Mutate a small amount of genes
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
145 for (auto i = 0; i < population * ga.mutationRate; i++){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
146 uint index = Random.shared.next(newGen.genes.length);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
147 newGen.genes[index] = newGen.genes[index].mutate();
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
148 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
149
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
150 return newGen;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
151 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
152
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
153 private void generateGenes(){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
154 scope(failure) Stdout("E: generateGenes").newline;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
155 genes.length = population;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
156 for (uint i = 0; i < population; i++){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
157 Gene t = new Gene(ga);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
158 t.geneSequence = ga.getRandomGenotype();
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
159 genes[i] = t;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
160 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
161 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
162
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
163 private uint tournamentSelect(){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
164 Gene[4] gens;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
165 uint[4] indices;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
166 scope(failure) Stdout("E: tournamentSelect").newline;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
167 for (uint i = 0; i < 4; i++){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
168 indices[i] = Random.shared.next(genes.length);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
169 gens[i] = genes[indices[i]];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
170 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
171 double max = gens[0].fitness;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
172 uint index = indices[0];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
173 foreach (i,g; gens){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
174 if (g.fitness > max){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
175 max = g.fitness;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
176 index = indices[i];
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
177 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
178 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
179 return index;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
180 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
181 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
182
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
183 class GeneticAlgorithm {
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
184 public double delegate(char[]) calculateFitness; // Set these before you do anything with the library
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
185 public char[] delegate() getRandomGenotype;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
186 public char delegate(uint index) getRandomChar;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
187 public double survivalRate = 0.5;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
188 public double mutationRate = 0.05;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
189 public bool deleteOnCrossover = true;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
190 public int crossoverType = 1; // 1 point crossover
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
191 public uint startPopulation = 1000;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
192 public bool verbose = false;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
193 public uint bailout = 1000;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
194
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
195 public double fitnessThreshold;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
196
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
197 public uint run(){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
198 //Stdout("t").flush;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
199 Generation currGen = new Generation(&this,true);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
200 //Stdout("test").flush;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
201 bool stop = false;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
202 uint generation = 1;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
203 double average;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
204 double max;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
205 while (true){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
206 if (verbose) max = 0;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
207 if (verbose) average = 0;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
208 foreach (Gene g; currGen.genes){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
209 if (verbose) average += g.fitness;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
210
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
211 if (verbose) if (g.fitness > max) max = g.fitness;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
212 if (g.fitness >= fitnessThreshold){
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
213 stop = true;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
214 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
215 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
216 if (verbose) average /= currGen.genes.length;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
217 if (verbose) Stdout.formatln("Gen: {} Avg: {:.4} Max: {:.4}",generation, average, max);
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
218 if (stop || generation >= bailout) return generation;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
219 currGen = currGen.evolve();
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
220 generation++;
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
221 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
222 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
223 }
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
224
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
225
4b2e8e8a633e Repository setup.
revcompgeek
parents:
diff changeset
226