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
00043 selFitPropOp->setSelPressure(1./selPressure_);
00044
00045 return true;
00046 }
00047
00048
00049 bool Elimination :: advanceGeneration(StateP state, DemeP deme)
00050 {
00051
00052 IndividualP best = selBestOp->select(*deme);
00053 best = copy(best);
00054
00055
00056 std::vector<IndividualP> newGen;
00057 for(uint i = 0; i < deme->size(); i++)
00058 newGen.push_back(deme->at(i));
00059
00060
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
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
00077 for(uint i = 0; i < deme->size(); i++)
00078 replaceWith(deme->at(i), newGen[i]);
00079
00080
00081 mutate(*deme);
00082
00083
00084 for(uint i = 0; i < deme->size(); i++)
00085 if(!deme->at(i)->fitness->isValid()) {
00086 evaluate(deme->at(i));
00087 }
00088
00089
00090 IndividualP random = selFitPropOp->select(*deme);
00091 if(best->fitness->isBetterThan(random->fitness))
00092 replaceWith(random, best);
00093
00094 return true;
00095 }