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

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

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     // define algorithm name
00012     name_ = "DifferentialEvolution";
00013 
00014     // by default, the algorithm is unconstrained
00015     bounded_ = false;
00016 
00017     // create selection operators needed
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     // read parameters, check defined genotype (only a single FloatingPoint is allowed)
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     // create donor vectors for each population member
00057     for(uint iIter = 0; iIter < deme->size(); iIter++){ 
00058         createDonorVectors(deme, state);
00059     }
00060 
00061     // perform DE crossover, generate trial vectors (stored in donor_vector)
00062     for(uint iIter = 0; iIter < deme->size(); iIter++) {
00063         crossover(deme, iIter, state);
00064     }
00065     
00066     // select the better one for each population member and trial vector
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     //for(uint i = 0; i < deme->size(); i++){
00074     //  state->getLogger()->log(5, "deme[" + uint2str(i) + "]: " + dbl2str(deme->at(i)->fitness->getValue()) + "\t" + uint2str(deme->at(i)->index));
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     // select three different population members
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     // get their genotypes
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     // create new individual to contain new donor vector
00103     IndividualP v (new Individual(state));
00104     FloatingPoint::FloatingPoint* b = (FloatingPoint::FloatingPoint*) v->getGenotype().get();
00105     double donor_value;
00106     
00107     // calculate new donor vector elements
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             // check for bounds
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     // get population member and corresponding donor vector
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     // crossover their elements (keep the result in donor_vector)
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 }

Generated on Tue Nov 4 2014 13:04:30 for ECF by  doxygen 1.7.1