geneticalgo.cpp
1 /********************************************************************************
2  * FARSA Genetic Algorithm Library *
3  * Copyright (C) 2007-2009 Gianluca Massera <emmegian@yahoo.it> *
4  * *
5  * This program is free software; you can redistribute it and/or modify *
6  * it under the terms of the GNU General Public License as published by *
7  * the Free Software Foundation; either version 2 of the License, or *
8  * (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public License *
16  * along with this program; if not, write to the Free Software *
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *
18  ********************************************************************************/
19 
20 #include "core/geneticalgo.h"
21 #include "core/genotype.h"
22 #include "core/genome.h"
23 #include "core/geneticalgoui.h"
24 #include <cmath>
25 
26 namespace farsa {
27 
29  : evolutionEnd(false),
30  evaluationDone(false),
31  genomev(NULL),
32  generationv(0),
33  numGens(0),
34  bestfits(),
35  avgfits(),
36  meanHdists(),
37  varHdists(),
38  stdHdists(),
39  iodelegate(new GeneticAlgoIODelegate()),
40  observers() {
41  /* nothing else to do */
42 }
43 
45  delete genomev;
46 }
47 
49  return new GeneticAlgoUI( this );
50 }
51 
53  if ( observers.contains(observer) ) return;
54  observers.append( observer );
55 }
56 
58  observers.removeAll( observer );
59 }
60 
61 void GeneticAlgo::evolve( unsigned int generationToReach ) {
62  while((!isEvolutionEnded()) &&
63  ((generationv < generationToReach) || ((generationv == generationToReach) && (!evaluationDone)))) {
64  gaStep();
65  }
66 }
67 
69  while( !isEvolutionEnded() ) {
70  gaStep();
71  }
72 }
73 
75  return evolutionEnd;
76 }
77 
79  return evaluationDone;
80 }
81 
83  genomev = gen;
84 }
85 
87  return genomev;
88 }
89 
90 const Genome* GeneticAlgo::genome() const {
91  return genomev;
92 }
93 
94 void GeneticAlgo::setGeneration( unsigned int gen ) {
95  generationv = gen;
96 /* The vectors will be resized when updateStats() will be called
97  bestfits.resize( gen );
98  avgfits.resize( gen );
99  meanHdists.resize( gen );
100  varHdists.resize( gen );
101  stdHdists.resize( gen );*/
102 }
103 
104 unsigned int GeneticAlgo::generation() const {
105  return generationv;
106 }
107 
109  numGens = g;
110 }
111 
113  return numGens;
114 }
115 
116 QVector< QVector<double> > GeneticAlgo::bestFits() const {
117  return bestfits;
118 }
119 
120 QVector< QVector<double> > GeneticAlgo::averageFits() const {
121  return avgfits;
122 }
123 
124 QVector<double> GeneticAlgo::meanHammingDist() const {
125  return meanHdists;
126 }
127 
128 QVector<double> GeneticAlgo::varianceHammingDist() const {
129  return varHdists;
130 }
131 
133  return stdHdists;
134 }
135 
136 #if defined(__GNUC__) && defined(DEVELOPER_WARNINGS)
137  #warning QUI C È UN MEMORY LEAK, ALMENO PER IL PRIMO IODELEGATE (CHE VIENE CREATO NEL COSTRUTTORE)
138 #endif
140  this->iodelegate = iodelegate;
141 }
142 
144  return iodelegate;
145 }
146 
148  // check if it is necessary to grow-up vectors
149  bestfits.resize( generationv+1 );
150  avgfits.resize( generationv+1 );
151  meanHdists.resize( generationv+1 );
152  varHdists.resize( generationv+1 );
153  stdHdists.resize( generationv+1 );
154  // Calculate statistic data for this generation
155  QVector<double> bests;
156  QVector<double> avegs;
157  int numObjs = genomev->at(0)->numOfObjectives();
158  bests.resize( numObjs );
159  avegs.resize( numObjs );
160  for( int i=0; i<numObjs; i++ ) {
161  bests[i] = genomev->at(0)->objective(i);
162  avegs[i] = bests[i];
163  }
164  for( unsigned int g=1; g<genomev->size(); g++ ) {
165  for( int i=0; i<numObjs; i++ ) {
166  bests[i] = qMax( bests[i], genomev->at(g)->objective(i) );
167  avegs[i] += genomev->at(g)->objective(i);
168  }
169  }
170  for( int i=0; i<numObjs; i++ ) {
171  avegs[i] = avegs[i]/(genomev->size());
172  }
173  bestfits[generationv] = bests;
174  avgfits[generationv] = avegs;
175 /* *****
176  double meanH = 0;
177  double varH = 0;
178  // ****** Devo fare per forza O(n^2) calcoli ?!?!?
179  Genome& genomeref = *genomev;
180  unsigned int dim = genomeref.size();
181  for( unsigned int i=0; i<dim; i++ ) {
182  for( unsigned int j=0; j<dim; j++ ) {
183  meanH += genomeref[i]->hammingDistance( genomeref[j] );
184  }
185  }
186  meanH /= dim*dim;
187  for( unsigned int i=0; i<dim; i++ ) {
188  for( unsigned int j=0; j<dim; j++ ) {
189  varH += pow( genomeref[i]->hammingDistance( genomeref[j] ) - meanH, 2 );
190  }
191  }
192  varH /= (dim*dim)-1;
193  //--- set data
194  meanHdists[generationv] = meanH;
195  varHdists[generationv] = varH;
196  stdHdists[generationv] = sqrt( varH );
197 ***** */
198 }
199 
201  foreach( GeneticAlgoObserver* obs, observers ) {
202  obs->onEndGeneration();
203  }
204 }
205 
206 } // end namespace farsa