Added selection methods

eoBestSelect            always return the best individual
eoSequentialSelect      a selectOne version of eoDetSelect (uses an index to
                        return next offspring from sorted pop)
This commit is contained in:
evomarc 2001-02-07 05:04:24 +00:00
commit 1c93adc43a

View file

@ -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 <utils/eoRNG.h>
#include <eoSelectOne.h>
//-----------------------------------------------------------------------------
/** eoRandomSelect: a selection method that selects ONE individual randomly
-MS- 22/10/99 */
/** eoRandomSelect: a selection method that selects ONE individual randomly */
//-----------------------------------------------------------------------------
template <class EOT> class eoRandomSelect: public eoSelectOne<EOT>
@ -42,11 +46,69 @@ template <class EOT> class eoRandomSelect: public eoSelectOne<EOT>
public:
/// not a big deal!!!
virtual const EOT& operator()(const eoPop<EOT>& pop)
virtual const EOT& operator()(const eoPop<EOT>& _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 EOT> class eoBestSelect: public eoSelectOne<EOT>
{
public:
/// not a big deal!!!
virtual const EOT& operator()(const eoPop<EOT>& _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 EOT> class eoSequentialSelect: public eoSelectOne<EOT>
{
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<EOT>& _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<EOT>& _pop)
{
if (current >= _pop.size())
init(_pop);
unsigned eoN = current;
current++;
return *eoPters[eoN] ;
}
private:
bool ordered;
unsigned current;
vector<const EOT*> eoPters;
};
#endif eoRandomSelect_h