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
00052 if (iterationnumber < AnnealingGeneration)
00053 T = InitTemperature;
00054 else
00055 T = InitTemperature / AnnealingRatio;
00056
00057 for (int i = 0; i < popsize; ++i)
00058 {
00059 CurrentMisFit = column(LocalMisFit, i);
00060 Probabilities(i) = exp(-ublas::sum(CurrentMisFit) / T);
00061 sum += Probabilities(i);
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 }