ga/src/core/geneticalgo.cpp

00001 /********************************************************************************
00002  *  FARSA Genetic Algorithm Library                                             *
00003  *  Copyright (C) 2007-2009 Gianluca Massera <emmegian@yahoo.it>                *
00004  *                                                                              *
00005  *  This program is free software; you can redistribute it and/or modify        *
00006  *  it under the terms of the GNU General Public License as published by        *
00007  *  the Free Software Foundation; either version 2 of the License, or           *
00008  *  (at your option) any later version.                                         *
00009  *                                                                              *
00010  *  This program is distributed in the hope that it will be useful,             *
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of              *
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               *
00013  *  GNU General Public License for more details.                                *
00014  *                                                                              *
00015  *  You should have received a copy of the GNU General Public License           *
00016  *  along with this program; if not, write to the Free Software                 *
00017  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA  *
00018  ********************************************************************************/
00019 
00020 #include "core/geneticalgo.h"
00021 #include "core/genotype.h"
00022 #include "core/genome.h"
00023 #include <cmath>
00024 
00025 namespace farsa {
00026 
00027 GeneticAlgo::GeneticAlgo()
00028     : evolutionEnd(false),
00029       evaluationDone(false),
00030       genomev(NULL),
00031       generationv(0),
00032       numGens(0),
00033       bestfits(),
00034       avgfits(),
00035       meanHdists(),
00036       varHdists(),
00037       stdHdists() {
00038     /* nothing else to do */
00039 }
00040 
00041 GeneticAlgo::~GeneticAlgo() {
00042     delete genomev;
00043 }
00044 
00045 void GeneticAlgo::evolve( unsigned int generationToReach ) {
00046     while((!isEvolutionEnded()) &&
00047           ((generationv < generationToReach) || ((generationv == generationToReach) && (!evaluationDone)))) {
00048         gaStep();
00049     }
00050 }
00051 
00052 void GeneticAlgo::evolve( ) {
00053     while( !isEvolutionEnded() ) {
00054         gaStep();
00055     }
00056 }
00057 
00058 bool GeneticAlgo::isEvolutionEnded() {
00059     return evolutionEnd;
00060 }
00061 
00062 bool GeneticAlgo::isEvaluationDone() {
00063     return evaluationDone;
00064 }
00065 
00066 void GeneticAlgo::setGenome( Genome* gen ) {
00067     genomev = gen;
00068 }
00069 
00070 Genome* GeneticAlgo::genome() {
00071     return genomev;
00072 }
00073 
00074 const Genome* GeneticAlgo::genome() const {
00075     return genomev;
00076 }
00077 
00078 void GeneticAlgo::setGeneration( unsigned int gen ) {
00079     generationv = gen;
00080 /*  The vectors will be resized when updateStats() will be called
00081     bestfits.resize( gen );
00082     avgfits.resize( gen );
00083     meanHdists.resize( gen );
00084     varHdists.resize( gen );
00085     stdHdists.resize( gen );*/
00086 }
00087 
00088 unsigned int GeneticAlgo::generation() const {
00089     return generationv;
00090 }
00091 
00092 void GeneticAlgo::setNumGenerations( int g ) {
00093     numGens = g;
00094 }
00095 
00096 int GeneticAlgo::numGenerations() {
00097     return numGens;
00098 }
00099 
00100 QVector< QVector<double> > GeneticAlgo::bestFits() const {
00101     return bestfits;
00102 }
00103 
00104 QVector< QVector<double> > GeneticAlgo::averageFits() const {
00105     return avgfits;
00106 }
00107 
00108 QVector<double> GeneticAlgo::meanHammingDist() const {
00109     return meanHdists;
00110 }
00111 
00112 QVector<double> GeneticAlgo::varianceHammingDist() const {
00113     return varHdists;
00114 }
00115 
00116 QVector<double> GeneticAlgo::standardDeviationHammingDist() const {
00117     return stdHdists;
00118 }
00119 
00120 void GeneticAlgo::updateStats() {
00121     // check if it is necessary to grow-up vectors
00122     bestfits.resize( generationv+1 );
00123     avgfits.resize( generationv+1 );
00124     meanHdists.resize( generationv+1 );
00125     varHdists.resize( generationv+1 );
00126     stdHdists.resize( generationv+1 );
00127     // Calculate statistic data for this generation
00128     QVector<double> bests;
00129     QVector<double> avegs;
00130     int numObjs = genomev->at(0)->numOfObjectives();
00131     bests.resize( numObjs );
00132     avegs.resize( numObjs );
00133     for( int i=0; i<numObjs; i++ ) {
00134         bests[i] = genomev->at(0)->objective(i);
00135         avegs[i] = bests[i];
00136     }
00137     for( unsigned int g=1; g<genomev->size(); g++ ) {
00138         for( int i=0; i<numObjs; i++ ) {
00139             bests[i] = qMax( bests[i], genomev->at(g)->objective(i) );
00140             avegs[i] += genomev->at(g)->objective(i);
00141         }
00142     }
00143     for( int i=0; i<numObjs; i++ ) {
00144         avegs[i] = avegs[i]/(genomev->size());
00145     }
00146     bestfits[generationv] = bests;
00147     avgfits[generationv] = avegs;
00148 /* *****
00149     double meanH = 0;
00150     double varH = 0;
00151     // ****** Devo fare per forza O(n^2) calcoli ?!?!?
00152     Genome& genomeref = *genomev;
00153     unsigned int dim = genomeref.size();
00154     for( unsigned int i=0; i<dim; i++ ) {
00155         for( unsigned int j=0; j<dim; j++ ) {
00156             meanH += genomeref[i]->hammingDistance( genomeref[j] );
00157         }
00158     }
00159     meanH /= dim*dim;
00160     for( unsigned int i=0; i<dim; i++ ) {
00161         for( unsigned int j=0; j<dim; j++ ) {
00162             varH += pow( genomeref[i]->hammingDistance( genomeref[j] ) - meanH, 2 );
00163         }
00164     }
00165     varH /= (dim*dim)-1;
00166     //--- set data
00167     meanHdists[generationv] = meanH;
00168     varHdists[generationv] = varH;
00169     stdHdists[generationv] = sqrt( varH );
00170 ***** */
00171 }
00172 
00173 } // end namespace farsa