AnnealingGA.cpp

Go to the documentation of this file.
00001 #include "AnnealingGA.h"
00002 #include <cmath>
00003 
00004 #include "miscfunc.h"
00005 
00006 #ifdef _OPENMP
00007 #include <omp.h>
00008 #endif
00009 
00010 using namespace std;
00011 using namespace gplib;
00012 namespace gplib
00013   {
00014     AnnealingGA::AnnealingGA(GeneralPropagation* const LocalPropagation,
00015         GeneralPopulation* const LocalPopulation,
00016         GeneralTranscribe* const LocalTranscribe,
00017         const tObjectiveVector &IndObjective, const int nthreads):
00018       GeneralGA(LocalPropagation, LocalPopulation, LocalTranscribe,
00019           IndObjective, nthreads), InitTemperature(1.0),
00020           AnnealingGeneration(1), AnnealingRatio(1.0)
00021       {
00022       }
00023 
00024     AnnealingGA::~AnnealingGA()
00025       {
00026       }
00027 
00028     int AnnealingGA::GetBestIndex()
00029       {
00030         return distance(Population->GetProbabilities().begin(), max_element(
00031             Population->GetProbabilities().begin(),
00032             Population->GetProbabilities().end()));
00033       }
00034 
00035     void AnnealingGA::SetParams(const double InitT, const int AnnealG,
00036         const double AnnealR)
00037       {
00038         InitTemperature = InitT;
00039         AnnealingGeneration = AnnealG;
00040         AnnealingRatio = AnnealR;
00041       }
00042 
00043     void AnnealingGA::CalcProbabilities(const int iterationnumber,
00044         rmat &LocalMisFit, GeneralPopulation &LocalPopulation)
00045       {
00046         double sum = 0;
00047         const int popsize = LocalPopulation.GetPopsize();
00048         double T = 1.0;
00049         gplib::rvec CurrentMisFit;
00050         tprobabilityv Probabilities(popsize);
00051         // The temperature depends on the iteration
00052         if (iterationnumber < AnnealingGeneration)
00053           T = InitTemperature;
00054         else
00055           T = InitTemperature / AnnealingRatio;
00056         // for all members of the population
00057         for (int i = 0; i < popsize; ++i)
00058           {
00059             CurrentMisFit = column(LocalMisFit, i); //Get the misfit vector of the current member
00060             Probabilities(i) = exp(-ublas::sum(CurrentMisFit) / T); //apply the annealing scheme to the summed misfits
00061             sum += Probabilities(i); // add all misfit values
00062           }
00063         const double factor = 1. / sum;
00064         for (int i = 0; i < popsize; ++i)
00065           Probabilities(i) *= factor;
00066         LocalPopulation.SetProbabilities(Probabilities);
00067       }
00068 
00069     void AnnealingGA::Elitism(const int iterationnumber)
00070       {
00071       }
00072   }

Generated on Tue May 4 16:52:14 2010 for GPLIB++ by  doxygen 1.5.8