diff --git a/eo/test/t-eoPareto.cpp b/eo/test/t-eoPareto.cpp index 1057a12c..33e3de73 100644 --- a/eo/test/t-eoPareto.cpp +++ b/eo/test/t-eoPareto.cpp @@ -31,8 +31,8 @@ class Mutate : public eoMonOp { for (unsigned i = 0; i < chromsize; ++i) { - if (rng.flip(1./10.)) - _eo.value[i] += rng.normal() * 0.05 * _eo.value[i]; + if (rng.flip(1./chromsize)) + _eo.value[i] += rng.normal() * 0.1 * _eo.value[i]; if (_eo.value[i] < minval) _eo.value[i] = minval; @@ -71,27 +71,61 @@ class Init : public eoInit { _eo.value[0] = rng.uniform(); + double range = maxval - minval; + for (unsigned i = 1; i < chromsize; ++i) - _eo.value[i] = rng.uniform() * 10. - 5; + _eo.value[i] = rng.uniform() * range + minval; _eo.invalidate(); } }; +// Trying out an elitist non-dominated sorted replacement scheme +template +class eoNDPlusReplacement : public eoReplacement +{ +public: + eoNDPlusReplacement(eoPerf2Worth& _perf2worth) : perf2worth(_perf2worth) {} + + struct WorthPair : public pair + { + bool operator<(const WorthPair& other) const { return other.first < first; } + }; + + void operator()(eoPop& _parents, eoPop& _offspring) + { + unsigned sz = _parents.size(); + _parents.reserve(_parents.size() + _offspring.size()); + copy(_offspring.begin(), _offspring.end(), back_inserter(_parents)); + + // calculate worths + perf2worth(_parents); + perf2worth.sort_pop(_parents); + perf2worth.resize(_parents, sz); + + _offspring.clear(); + } + +private : + eoPerf2Worth& perf2worth; +}; template eoPerf2Worth& make_perf2worth(eoParser& parser, eoState& state) { - eoDominanceMap& dominance = state.storeFunctor(new eoDominanceMap); - unsigned what = parser.createParam(unsigned(0), "perf2worth", "worth mapping indicator : \n\t \ + unsigned what = parser.createParam(unsigned(1), "perf2worth", "worth mapping indicator : \n\t \ 0: non_dominated sorting \n\t\ 1: non_dominated sorting 2 \n\t\ 2: simple ranking \n\t", 'w').value(); switch (what) { - case 1 : return state.storeFunctor(new eoNDSorting_II(dominance)); - case 2 : return state.storeFunctor(new eoParetoRanking(dominance)); + case 1 : return state.storeFunctor(new eoNDSorting_II()); + case 2 : + { + eoDominanceMap& dominance = state.storeFunctor(new eoDominanceMap); + return state.storeFunctor(new eoParetoRanking(dominance)); + } } //default @@ -101,19 +135,20 @@ eoPerf2Worth& make_perf2worth(eoParser& parser, eoState& state) // should actually set parser flag, but I don't care } - return state.storeFunctor(new eoNDSorting_I(dominance, 0.5)); + return state.storeFunctor(new eoNDSorting_I(0.5)); } template -eoSelectFromWorth& make_selector(eoParser& parser, eoState& state, eoPerf2Worth& perf2worth) +eoSelectOne& make_selector(eoParser& parser, eoState& state, eoPerf2Worth& perf2worth) { - unsigned tournamentsize = 2; - double stochtour = 0.95; + unsigned tournamentsize = parser.createParam(unsigned(2), "tournament_size", "Tournament Size", 't').value(); + double stochtour = parser.createParam(unsigned(0.95), "tournament_prob", "Probability in stochastic tournament").value(); switch (parser.createParam(unsigned(0), "selector", "Which selector (too lazy to explain: use the source)", 's').value()) { case 1 : return state.storeFunctor(new eoStochTournamentWorthSelect(perf2worth, stochtour)); case 2 : return state.storeFunctor(new eoRouletteWorthSelect(perf2worth)); + case 3 : return state.storeFunctor(new eoRandomSelect); } // default @@ -138,7 +173,7 @@ void the_main(int argc, char* argv[]) eoPerf2Worth& perf2worth = make_perf2worth(parser, state); // Look: another factory function, now for selection - eoSelectFromWorth& select = make_selector(parser, state, perf2worth); + eoSelectOne& select = make_selector(parser, state, perf2worth); // One general operator eoProportionalOp opsel; @@ -148,7 +183,7 @@ void the_main(int argc, char* argv[]) eoGeneralBreeder breeder(select, opsel); // replacement - eoCommaReplacement replace; + eoNDPlusReplacement replace(perf2worth); unsigned long generation = 0; eoGenContinue gen(num_gen, generation);