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
00044 if (iterationnumber < AnnealingGeneration)
00045 T = InitTemperature;
00046 else
00047 T = InitTemperature / AnnealingRatio;
00048
00049 for (int i = 0; i < popsize; ++i)
00050 {
00051 CurrentMisFit = column(LocalMisFit,i);
00052 Probabilities(i) = exp(-ublas::sum(CurrentMisFit)/T);
00053 sum += Probabilities(i);
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 }