• 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     registerParameter(state, "selpressure", (voidP) new double(10), ECF::DOUBLE);
00020 }
00021 
00022 
00023 bool Elimination :: initialize(StateP state)
00024 {
00025     selFitPropOp->initialize(state);
00026     selRandomOp->initialize(state);
00027     selBestOp->initialize(state);
00028 
00029     voidP genGapP = getParameterValue(state, "gengap");
00030     genGap_ = *((double*) genGapP.get());
00031 
00032     if(genGap_ <= 0 || genGap_ > 1) {
00033         ECF_LOG_ERROR(state, "Error: generation gap parameter in Elimination algorithm must be in <0, 1]!");
00034         throw "";
00035     }
00036 
00037     voidP selPressP = getParameterValue(state, "selpressure");
00038     selPressure_ = *((double*) selPressP.get());
00039 
00040     selFitPropOp->setSelPressure(selPressure_);
00041     // selection chooses worse individuals
00042     selFitPropOp->setInverseProportional();
00043 
00044     return true;
00045 }
00046 
00047 
00048 bool Elimination :: advanceGeneration(StateP state, DemeP deme)
00049 {
00050     // elitism: copy current best individual
00051     IndividualP best = selBestOp->select(*deme);
00052     best = copy(best);
00053 
00054     // copy pointers
00055     std::vector<IndividualP> newGen;
00056     for(uint i = 0; i < deme->size(); i++)
00057         newGen.push_back(deme->at(i));
00058 
00059     // eliminate genGap_ worse individuals
00060     uint generationGap = (uint) (genGap_ * deme->size());
00061     for(uint i = 0; i < generationGap; i++) {
00062         IndividualP victim = selFitPropOp->select(newGen);
00063         removeFrom(victim, newGen);
00064     }
00065 
00066     // make genGap_ new ones
00067     for(uint i = 0; i < generationGap; i++) {
00068         IndividualP parent1 = selRandomOp->select(*deme);
00069         IndividualP parent2 = selRandomOp->select(*deme);
00070         IndividualP child = copy(parent1);
00071         mate(parent1, parent2, child);
00072         newGen.push_back(child);
00073     }
00074 
00075     // replace
00076     for(uint i = 0; i < deme->size(); i++)
00077         replaceWith(deme->at(i), newGen[i]);
00078 
00079     // mutate all
00080     mutate(*deme);
00081 
00082     // evaluate new individuals
00083     for(uint i = 0; i < deme->size(); i++)
00084         if(!deme->at(i)->fitness->isValid()) {
00085             evaluate(deme->at(i));
00086         }
00087 
00088     // elitism: preserve best individual
00089     IndividualP random = selFitPropOp->select(*deme);
00090     if(best->fitness->isBetterThan(random->fitness))
00091         replaceWith(random, best);
00092 
00093     return true;
00094 }

Generated on Thu Oct 6 2011 13:40:59 for ECF by  doxygen 1.7.1