diff --git a/eo/src/eoRandomSelect.h b/eo/src/eoRandomSelect.h index 9d57e869..fd609f3e 100644 --- a/eo/src/eoRandomSelect.h +++ b/eo/src/eoRandomSelect.h @@ -28,13 +28,17 @@ #define eoRandomSelect_h //----------------------------------------------------------------------------- +/** This file contains straightforward selectors: + * eoRandomSelect returns an individual uniformly selected + * eoBestSelect always return the best individual + * eoSequentialSelect returns all individuals in turn + */ #include #include //----------------------------------------------------------------------------- -/** eoRandomSelect: a selection method that selects ONE individual randomly - -MS- 22/10/99 */ +/** eoRandomSelect: a selection method that selects ONE individual randomly */ //----------------------------------------------------------------------------- template class eoRandomSelect: public eoSelectOne @@ -42,11 +46,69 @@ template class eoRandomSelect: public eoSelectOne public: /// not a big deal!!! - virtual const EOT& operator()(const eoPop& pop) + virtual const EOT& operator()(const eoPop& _pop) { - return pop[rng.random(pop.size())] ; + return _pop[eo::rng.random(pop.size())] ; } }; +//----------------------------------------------------------------------------- +/** eoBestSelect: a selection method that always return the best + * (mainly for testing purposes) */ +//----------------------------------------------------------------------------- + +template class eoBestSelect: public eoSelectOne +{ + public: + + /// not a big deal!!! + virtual const EOT& operator()(const eoPop& _pop) + { + return _pop.best_element() ; + } +}; + +//----------------------------------------------------------------------------- +/** eoSequentialSelect: returns all individual in order + * looping back to the beginning when exhasuted + * can be from best to worse, or in random order + * + * It is the eoSelectOne equivalent of eoDetSelect - + * though eoDetSelect always returns individuals from best to worst + */ +//----------------------------------------------------------------------------- + +template class eoSequentialSelect: public eoSelectOne +{ + public: + /** Ctor: sets the current pter to MAXINT so init will take place first time + not very elegant, maybe ... + */ + eoSequentialSelect(bool _ordered = true): + ordered(_ordered), current(MAXINT) {} + + void init(const eoPop& _pop) + { + if (ordered) // probably we could have a marker to avoid re-sorting + _pop.sort(eoPters); + else + _pop.shuffle(eoPters); + current=0; + } + + virtual const EOT& operator()(const eoPop& _pop) + { + if (current >= _pop.size()) + init(_pop); + unsigned eoN = current; + current++; + return *eoPters[eoN] ; + } +private: + bool ordered; + unsigned current; + vector eoPters; +}; + #endif eoRandomSelect_h