paradiseo/eo/src/eoEvalFuncCounterBounder.h
canape 23df679f51 some modifications for EDO
You have to sove this problems:
EDO: t-dispatcher-round (commented)
MOOE: Lesson4 (commented)
MO: t-moRndIndexedVectorTabuList (commented)
2013-02-07 14:43:11 +01:00

67 lines
1.8 KiB
C++

#ifndef eoEvalFuncCounterBounder_H
#define eoEvalFuncCounterBounder_H
#include <eoEvalFunc.h>
#include <utils/eoParam.h>
/** @addtogroup Evaluation
* @{
*/
/** The exception raised by eoEvalFuncCounterBounder
* when the maximum number of allowed evaluations is reached.
*/
class eoEvalFuncCounterBounderException : public std::exception
{
public:
eoEvalFuncCounterBounderException(unsigned long threshold) : _threshold(threshold){}
const char* what() const throw()
{
std::ostringstream ss;
ss << "STOP in eoEvalFuncCounterBounderException: the maximum number of evaluation has been reached (" << _threshold << ").";
return ss.str().c_str();
}
private:
unsigned long _threshold;
};
/** Counts the number of evaluations actually performed and throw an eoEvalFuncCounterBounderException
* when the maximum number of allowed evaluations is reached.
*
* This eval counter permits to stop a search during a generation, without waiting for a continue to be
* checked at the end of the loop. Useful if you have 10 individuals and 10 generations,
* but want to stop after 95 evaluations.
*/
template < typename EOT >
class eoEvalFuncCounterBounder : public eoEvalFuncCounter< EOT >
{
public :
eoEvalFuncCounterBounder(eoEvalFunc<EOT>& func, unsigned long threshold, std::string name = "Eval. ")
: eoEvalFuncCounter< EOT >( func, name ), _threshold( threshold )
{}
using eoEvalFuncCounter< EOT >::value;
virtual void operator()(EOT& eo)
{
if (eo.invalid())
{
value()++;
if (_threshold > 0 && value() >= _threshold)
{
throw eoEvalFuncCounterBounderException(_threshold);
}
this->func(eo);
}
}
private :
unsigned long _threshold;
};
/** @} */
#endif