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 AnnealingGA::AnnealingGA(GeneralPropagation* const LocalPropagation, GeneralPopulation* const LocalPopulation, 
00013                 GeneralTranscribe* const LocalTranscribe, const tObjectiveVector &IndObjective):
00014 GeneralGA(LocalPropagation,LocalPopulation,LocalTranscribe,IndObjective),
00015 InitTemperature(1.0),
00016 AnnealingGeneration(1),
00017 AnnealingRatio(1.0)
00018 {
00019 }
00020 
00021 AnnealingGA::~AnnealingGA()
00022 {}
00023 
00024 int AnnealingGA::GetBestIndex()
00025 {
00026         return distance(Population->GetProbabilities().begin(),max_element(Population->GetProbabilities().begin(),Population->GetProbabilities().end()));
00027 }
00028 
00029 void AnnealingGA::SetParams(const double InitT, const int AnnealG, const double AnnealR)
00030 {
00031         InitTemperature = InitT;
00032         AnnealingGeneration = AnnealG;
00033         AnnealingRatio = AnnealR;
00034 }
00035 
00036 void AnnealingGA::CalcProbabilities(const int iterationnumber, rmat &LocalMisFit, GeneralPopulation &LocalPopulation)
00037 {
00038         double sum = 0;
00039         const int popsize = LocalPopulation.GetPopsize();
00040         double T = 1.0;
00041         gplib::rvec CurrentMisFit;
00042         tprobabilityv Probabilities(popsize);
00043         // The temperature depends on the iteration
00044         if (iterationnumber < AnnealingGeneration)
00045                         T = InitTemperature;
00046                 else 
00047                         T = InitTemperature / AnnealingRatio;
00048         // for all members of the population
00049         for (int  i = 0; i < popsize; ++i)
00050         {
00051                 CurrentMisFit = column(LocalMisFit,i); //Get the misfit vector of the current member
00052                 Probabilities(i) = exp(-ublas::sum(CurrentMisFit)/T); //apply the annealing scheme to the summed misfits
00053                 sum += Probabilities(i); // add all misfit values
00054         }
00055         const double factor = 1./sum;
00056         for (int  i = 0; i < popsize; ++i)
00057                 Probabilities(i) *= factor;
00058         LocalPopulation.SetProbabilities(Probabilities);
00059 }
00060 
00061 void AnnealingGA::Elitism(const int iterationnumber)
00062 {
00063 }

Generated on Fri Jul 4 15:30:20 2008 for GPLIB++ by  doxygen 1.5.5