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 <cmath>
24 
25 namespace farsa {
26 
28  : evolutionEnd(false),
29  evaluationDone(false),
30  genomev(NULL),
31  generationv(0),
32  numGens(0),
33  bestfits(),
34  avgfits(),
35  meanHdists(),
36  varHdists(),
37  stdHdists() {
38  /* nothing else to do */
39 }
40 
42  delete genomev;
43 }
44 
45 void GeneticAlgo::evolve( unsigned int generationToReach ) {
46  while((!isEvolutionEnded()) &&
47  ((generationv < generationToReach) || ((generationv == generationToReach) && (!evaluationDone)))) {
48  gaStep();
49  }
50 }
51 
53  while( !isEvolutionEnded() ) {
54  gaStep();
55  }
56 }
57 
59  return evolutionEnd;
60 }
61 
63  return evaluationDone;
64 }
65 
67  genomev = gen;
68 }
69 
71  return genomev;
72 }
73 
74 const Genome* GeneticAlgo::genome() const {
75  return genomev;
76 }
77 
78 void GeneticAlgo::setGeneration( unsigned int gen ) {
79  generationv = gen;
80 /* The vectors will be resized when updateStats() will be called
81  bestfits.resize( gen );
82  avgfits.resize( gen );
83  meanHdists.resize( gen );
84  varHdists.resize( gen );
85  stdHdists.resize( gen );*/
86 }
87 
88 unsigned int GeneticAlgo::generation() const {
89  return generationv;
90 }
91 
93  numGens = g;
94 }
95 
97  return numGens;
98 }
99 
100 QVector< QVector<double> > GeneticAlgo::bestFits() const {
101  return bestfits;
102 }
103 
104 QVector< QVector<double> > GeneticAlgo::averageFits() const {
105  return avgfits;
106 }
107 
108 QVector<double> GeneticAlgo::meanHammingDist() const {
109  return meanHdists;
110 }
111 
112 QVector<double> GeneticAlgo::varianceHammingDist() const {
113  return varHdists;
114 }
115 
117  return stdHdists;
118 }
119 
121  // check if it is necessary to grow-up vectors
122  bestfits.resize( generationv+1 );
123  avgfits.resize( generationv+1 );
124  meanHdists.resize( generationv+1 );
125  varHdists.resize( generationv+1 );
126  stdHdists.resize( generationv+1 );
127  // Calculate statistic data for this generation
128  QVector<double> bests;
129  QVector<double> avegs;
130  int numObjs = genomev->at(0)->numOfObjectives();
131  bests.resize( numObjs );
132  avegs.resize( numObjs );
133  for( int i=0; i<numObjs; i++ ) {
134  bests[i] = genomev->at(0)->objective(i);
135  avegs[i] = bests[i];
136  }
137  for( unsigned int g=1; g<genomev->size(); g++ ) {
138  for( int i=0; i<numObjs; i++ ) {
139  bests[i] = qMax( bests[i], genomev->at(g)->objective(i) );
140  avegs[i] += genomev->at(g)->objective(i);
141  }
142  }
143  for( int i=0; i<numObjs; i++ ) {
144  avegs[i] = avegs[i]/(genomev->size());
145  }
146  bestfits[generationv] = bests;
147  avgfits[generationv] = avegs;
148 /* *****
149  double meanH = 0;
150  double varH = 0;
151  // ****** Devo fare per forza O(n^2) calcoli ?!?!?
152  Genome& genomeref = *genomev;
153  unsigned int dim = genomeref.size();
154  for( unsigned int i=0; i<dim; i++ ) {
155  for( unsigned int j=0; j<dim; j++ ) {
156  meanH += genomeref[i]->hammingDistance( genomeref[j] );
157  }
158  }
159  meanH /= dim*dim;
160  for( unsigned int i=0; i<dim; i++ ) {
161  for( unsigned int j=0; j<dim; j++ ) {
162  varH += pow( genomeref[i]->hammingDistance( genomeref[j] ) - meanH, 2 );
163  }
164  }
165  varH /= (dim*dim)-1;
166  //--- set data
167  meanHdists[generationv] = meanH;
168  varHdists[generationv] = varH;
169  stdHdists[generationv] = sqrt( varH );
170 ***** */
171 }
172 
173 } // end namespace farsa