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:
parent
f9fed9acc1
commit
1c93adc43a
1 changed files with 66 additions and 4 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Reference in a new issue