00001 #include "ECF_base.h"
00002 #include "ECF_derived.h"
00003 #include "ECF_macro.h"
00004 #include "AlgDifferentialEvolution.h"
00005 #include "floatingpoint/FloatingPoint.h"
00006 #include <iostream>
00007
00008
00009 DifferentialEvolution::DifferentialEvolution()
00010 {
00011
00012 name_ = "DifferentialEvolution";
00013
00014
00015 selRandomOp = static_cast<SelectionOperatorP> (new SelRandomOp);
00016 }
00017
00018
00019 void DifferentialEvolution::registerParameters(StateP state)
00020 {
00021 registerParameter(state, "F", (voidP) new double(1.), ECF::DOUBLE);
00022 registerParameter(state, "CR", (voidP) new double(0.9), ECF::DOUBLE);
00023 }
00024
00025
00026 bool DifferentialEvolution::initialize(StateP state)
00027 {
00028 selRandomOp->initialize(state);
00029 donor_vector.clear();
00030
00031
00032 voidP F = getParameterValue(state, "F");
00033 Fconst_ = *((double*) F.get());
00034 voidP CR = getParameterValue(state, "CR");
00035 CR_ = *((double*) CR.get());
00036 FloatingPointP flp (new FloatingPoint::FloatingPoint);
00037 if(state->getGenotypes()[0]->getName() != flp->getName() || state->getGenotypes().size() != 1) {
00038 state->getLogger()->log(1, "Error: DE algorithm accepts only a single FloatingPoint genotype!");
00039 throw ("");
00040 }
00041
00042 return true;
00043 }
00044
00045
00046 bool DifferentialEvolution::advanceGeneration(StateP state, DemeP deme)
00047 {
00048
00049 for(uint iIter = 0; iIter < deme->size(); iIter++){
00050 createDonorVectors(deme, state);
00051 }
00052
00053
00054 for(uint iIter = 0; iIter < deme->size(); iIter++) {
00055 crossover(deme, iIter, state);
00056 }
00057
00058
00059 for(uint iIter = 0; iIter < deme->size(); iIter++) {
00060 evaluate(donor_vector[iIter]);
00061 if(donor_vector[iIter]->fitness->isBetterThan(deme->at(iIter)->fitness))
00062 replaceWith(deme->at(iIter), donor_vector[iIter]);
00063 }
00064
00065
00066
00067
00068
00069 donor_vector.clear();
00070
00071 return true;
00072 }
00073
00074
00076 void DifferentialEvolution::createDonorVectors(DemeP deme, StateP state)
00077 {
00078 IndividualP ind1, ind2, ind3;
00079
00080
00081 ind1 = selRandomOp->select(*deme);
00082 ind2 = selRandomOp->select(*deme);
00083 while (ind1->index == ind2->index)
00084 ind2 = selRandomOp->select(*deme);
00085 ind3 = selRandomOp->select(*deme);
00086 while (ind1->index == ind3->index || ind2->index == ind3->index)
00087 ind3 = selRandomOp->select(*deme);
00088
00089
00090 FloatingPoint::FloatingPoint* flp1 = (FloatingPoint::FloatingPoint*) (ind1->getGenotype().get());
00091 FloatingPoint::FloatingPoint* flp2 = (FloatingPoint::FloatingPoint*) (ind2->getGenotype().get());
00092 FloatingPoint::FloatingPoint* flp3 = (FloatingPoint::FloatingPoint*) (ind3->getGenotype().get());
00093
00094
00095 IndividualP v (new Individual(state));
00096 FloatingPoint::FloatingPoint* b = (FloatingPoint::FloatingPoint*) v->getGenotype().get();
00097 double donor_value;
00098
00099
00100 for(uint i = 0; i < flp2->realValue.size(); i++){
00101 donor_value = flp1->realValue[i] + Fconst_ * (flp2->realValue[i] - flp3->realValue[i]);
00102 b->realValue[i] = donor_value;
00103 }
00104
00105 donor_vector.push_back(v);
00106 }
00107
00108
00110 void DifferentialEvolution::crossover(DemeP deme, uint index, StateP state)
00111 {
00112
00113 FloatingPoint::FloatingPoint* flp1 = (FloatingPoint::FloatingPoint*) (deme->at(index)->getGenotype().get());
00114 int dim = (int) flp1->realValue.size();
00115 FloatingPoint::FloatingPoint* flp2 = (FloatingPoint::FloatingPoint*) donor_vector[index]->getGenotype().get();
00116
00117
00118 for(uint i = 0; i < flp1->realValue.size(); i++) {
00119 if (state->getRandomizer()->getRandomDouble() <= CR_ || i == state->getRandomizer()->getRandomInteger(dim)) {
00120 }
00121 else {
00122 flp2->realValue[i] = flp1->realValue[i];
00123 }
00124 }
00125
00126 }