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

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

00001 #include "ECF_base.h"
00002 #include "AlgElimination.h"
00003 #include "ECF_macro.h"
00004 
00005 
00006 Elimination :: Elimination()
00007 {
00008     name_ = "Elimination";
00009 
00010     selFitPropOp = static_cast<SelFitnessProportionalOpP> (new SelFitnessProportionalOp);
00011     selRandomOp = static_cast<SelRandomOpP> (new SelRandomOp);
00012     selBestOp = static_cast<SelBestOpP> (new SelBestOp);
00013 }
00014 
00015 
00016 void Elimination :: registerParameters(StateP state)
00017 {
00018     registerParameter(state, "gengap", (voidP) new double(0.6), ECF::DOUBLE,
00019         "generation gap (percentage of population to be eliminated)");
00020     registerParameter(state, "selpressure", (voidP) new double(10), ECF::DOUBLE,
00021         "selection pressure: how much is the worst individual 'worse' than the best");
00022 }
00023 
00024 
00025 bool Elimination :: initialize(StateP state)
00026 {
00027     selFitPropOp->initialize(state);
00028     selRandomOp->initialize(state);
00029     selBestOp->initialize(state);
00030 
00031     voidP genGapP = getParameterValue(state, "gengap");
00032     genGap_ = *((double*) genGapP.get());
00033 
00034     if(genGap_ <= 0 || genGap_ > 1) {
00035         ECF_LOG_ERROR(state, "Error: generation gap parameter in Elimination algorithm must be in <0, 1]!");
00036         throw "";
00037     }
00038 
00039     voidP selPressP = getParameterValue(state, "selpressure");
00040     selPressure_ = *((double*) selPressP.get());
00041 
00042     // selection chooses worse individuals
00043     selFitPropOp->setSelPressure(1./selPressure_);
00044 
00045     return true;
00046 }
00047 
00048 
00049 bool Elimination :: advanceGeneration(StateP state, DemeP deme)
00050 {
00051     // elitism: copy current best individual
00052     IndividualP best = selBestOp->select(*deme);
00053     best = copy(best);
00054 
00055     // copy pointers
00056     std::vector<IndividualP> newGen;
00057     for(uint i = 0; i < deme->size(); i++)
00058         newGen.push_back(deme->at(i));
00059 
00060     // eliminate genGap_ worse individuals
00061     uint generationGap = (uint) (genGap_ * deme->size());
00062     for(uint i = 0; i < generationGap; i++) {
00063         IndividualP victim = selFitPropOp->select(newGen);
00064         removeFrom(victim, newGen);
00065     }
00066 
00067     // make genGap_ new ones
00068     for(uint i = 0; i < generationGap; i++) {
00069         IndividualP parent1 = selRandomOp->select(*deme);
00070         IndividualP parent2 = selRandomOp->select(*deme);
00071         IndividualP child = copy(parent1);
00072         mate(parent1, parent2, child);
00073         newGen.push_back(child);
00074     }
00075 
00076     // replace
00077     for(uint i = 0; i < deme->size(); i++)
00078         replaceWith(deme->at(i), newGen[i]);
00079 
00080     // mutate all
00081     mutate(*deme);
00082 
00083     // evaluate new individuals
00084     for(uint i = 0; i < deme->size(); i++)
00085         if(!deme->at(i)->fitness->isValid()) {
00086             evaluate(deme->at(i));
00087         }
00088 
00089     // elitism: preserve best individual
00090     IndividualP random = selFitPropOp->select(*deme);
00091     if(best->fitness->isBetterThan(random->fitness))
00092         replaceWith(random, best);
00093 
00094     return true;
00095 }

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