• Main Page
  • Modules
  • Classes
  • Files
  • File List

D:/Projekt/ECF_trunk/ECF/AlgDifferentialEvolution.cpp

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     // define algorithm name
00012     name_ = "DifferentialEvolution";
00013 
00014     // create selection operators needed
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     // read parameters, check defined genotype (only a single FloatingPoint is allowed)
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     // create donor vectors for each population member
00049     for(uint iIter = 0; iIter < deme->size(); iIter++){ 
00050         createDonorVectors(deme, state);
00051     }
00052 
00053     // perform DE crossover, generate trial vectors (stored in donor_vector)
00054     for(uint iIter = 0; iIter < deme->size(); iIter++) {
00055         crossover(deme, iIter, state);
00056     }
00057     
00058     // select the better one for each population member and trial vector
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     //for(uint i = 0; i < deme->size(); i++){
00066     //  state->getLogger()->log(5, "deme[" + uint2str(i) + "]: " + dbl2str(deme->at(i)->fitness->getValue()) + "\t" + uint2str(deme->at(i)->index));
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     // select three different population members
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     // get their genotypes
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     // create new individual to contain new donor vector
00095     IndividualP v (new Individual(state));
00096     FloatingPoint::FloatingPoint* b = (FloatingPoint::FloatingPoint*) v->getGenotype().get();
00097     double donor_value;
00098     
00099     // calculate new donor vector elements
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     // get population member and corresponding donor vector
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     // crossover their elements (keep the result in donor_vector)
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 }

Generated on Fri Jul 5 2013 09:34:22 for ECF by  doxygen 1.7.1