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
00041 selFitPropOp->setSelPressure(1./selPressure_);
00042
00043 return true;
00044 }
00045
00046
00047 bool Elimination :: advanceGeneration(StateP state, DemeP deme)
00048 {
00049
00050 IndividualP best = selBestOp->select(*deme);
00051 best = copy(best);
00052
00053
00054 std::vector<IndividualP> newGen;
00055 for(uint i = 0; i < deme->size(); i++)
00056 newGen.push_back(deme->at(i));
00057
00058
00059 uint generationGap = (uint) (genGap_ * deme->size());
00060 for(uint i = 0; i < generationGap; i++) {
00061 IndividualP victim = selFitPropOp->select(newGen);
00062 removeFrom(victim, newGen);
00063 }
00064
00065
00066 for(uint i = 0; i < generationGap; i++) {
00067 IndividualP parent1 = selRandomOp->select(*deme);
00068 IndividualP parent2 = selRandomOp->select(*deme);
00069 IndividualP child = copy(parent1);
00070 mate(parent1, parent2, child);
00071 newGen.push_back(child);
00072 }
00073
00074
00075 for(uint i = 0; i < deme->size(); i++)
00076 replaceWith(deme->at(i), newGen[i]);
00077
00078
00079 mutate(*deme);
00080
00081
00082 for(uint i = 0; i < deme->size(); i++)
00083 if(!deme->at(i)->fitness->isValid()) {
00084 evaluate(deme->at(i));
00085 }
00086
00087
00088 IndividualP random = selFitPropOp->select(*deme);
00089 if(best->fitness->isBetterThan(random->fitness))
00090 replaceWith(random, best);
00091
00092 return true;
00093 }