00001 #include "ECF_base.h"
00002 #include "ECF_macro.h"
00003 #include "SelRandomOp.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 bounded_ = false;
00016
00017
00018 selRandomOp = static_cast<SelectionOperatorP> (new SelRandomOp);
00019 }
00020
00021
00022 void DifferentialEvolution::registerParameters(StateP state)
00023 {
00024 registerParameter(state, "F", (voidP) new double(1.), ECF::DOUBLE, "scaling constant");
00025 registerParameter(state, "CR", (voidP) new double(0.9), ECF::DOUBLE, "crossover rate");
00026 registerParameter(state, "bounded", (voidP) new uint(0), ECF::UINT,
00027 "should the algorithm respect the bounds defined in the genotype or not (default: 0)");
00028 }
00029
00030
00031 bool DifferentialEvolution::initialize(StateP state)
00032 {
00033 selRandomOp->initialize(state);
00034 donor_vector.clear();
00035
00036
00037 voidP F = getParameterValue(state, "F");
00038 Fconst_ = *((double*) F.get());
00039 voidP CR = getParameterValue(state, "CR");
00040 CR_ = *((double*) CR.get());
00041 FloatingPointP flp (new FloatingPoint::FloatingPoint);
00042 if(state->getGenotypes()[0]->getName() != flp->getName() || state->getGenotypes().size() != 1) {
00043 state->getLogger()->log(1, "Error: DE algorithm accepts only a single FloatingPoint genotype!");
00044 throw ("");
00045 }
00046
00047 voidP bounded = getParameterValue(state, "bounded");
00048 bounded_ = *((bool*) bounded.get());
00049
00050 return true;
00051 }
00052
00053
00054 bool DifferentialEvolution::advanceGeneration(StateP state, DemeP deme)
00055 {
00056
00057 for(uint iIter = 0; iIter < deme->size(); iIter++){
00058 createDonorVectors(deme, state);
00059 }
00060
00061
00062 for(uint iIter = 0; iIter < deme->size(); iIter++) {
00063 crossover(deme, iIter, state);
00064 }
00065
00066
00067 for(uint iIter = 0; iIter < deme->size(); iIter++) {
00068 evaluate(donor_vector[iIter]);
00069 if(donor_vector[iIter]->fitness->isBetterThan(deme->at(iIter)->fitness))
00070 replaceWith(deme->at(iIter), donor_vector[iIter]);
00071 }
00072
00073
00074
00075
00076
00077 donor_vector.clear();
00078
00079 return true;
00080 }
00081
00082
00084 void DifferentialEvolution::createDonorVectors(DemeP deme, StateP state)
00085 {
00086 IndividualP ind1, ind2, ind3;
00087
00088
00089 ind1 = selRandomOp->select(*deme);
00090 ind2 = selRandomOp->select(*deme);
00091 while (ind1->index == ind2->index)
00092 ind2 = selRandomOp->select(*deme);
00093 ind3 = selRandomOp->select(*deme);
00094 while (ind1->index == ind3->index || ind2->index == ind3->index)
00095 ind3 = selRandomOp->select(*deme);
00096
00097
00098 FloatingPoint::FloatingPoint* flp1 = (FloatingPoint::FloatingPoint*) (ind1->getGenotype().get());
00099 FloatingPoint::FloatingPoint* flp2 = (FloatingPoint::FloatingPoint*) (ind2->getGenotype().get());
00100 FloatingPoint::FloatingPoint* flp3 = (FloatingPoint::FloatingPoint*) (ind3->getGenotype().get());
00101
00102
00103 IndividualP v (new Individual(state));
00104 FloatingPoint::FloatingPoint* b = (FloatingPoint::FloatingPoint*) v->getGenotype().get();
00105 double donor_value;
00106
00107
00108 for(uint i = 0; i < flp2->realValue.size(); i++){
00109 donor_value = flp1->realValue[i] + Fconst_ * (flp2->realValue[i] - flp3->realValue[i]);
00110
00111
00112 if(bounded_) {
00113 if(donor_value < b->getLBound())
00114 donor_value = b->getLBound();
00115 if(donor_value > b->getUBound())
00116 donor_value = b->getUBound();
00117 }
00118
00119 b->realValue[i] = donor_value;
00120 }
00121
00122 donor_vector.push_back(v);
00123 }
00124
00125
00127 void DifferentialEvolution::crossover(DemeP deme, uint index, StateP state)
00128 {
00129
00130 FloatingPoint::FloatingPoint* flp1 = (FloatingPoint::FloatingPoint*) (deme->at(index)->getGenotype().get());
00131 int dim = (int) flp1->realValue.size();
00132 FloatingPoint::FloatingPoint* flp2 = (FloatingPoint::FloatingPoint*) donor_vector[index]->getGenotype().get();
00133
00134
00135 for(uint i = 0; i < flp1->realValue.size(); i++) {
00136 if (state->getRandomizer()->getRandomDouble() <= CR_ || i == state->getRandomizer()->getRandomInteger(dim)) {
00137 }
00138 else {
00139 flp2->realValue[i] = flp1->realValue[i];
00140 }
00141 }
00142
00143 }