3 #include <geneial/algorithm/criteria/StatefulStoppingCriterion.h>
7 geneial_private_namespace(geneial)
9 geneial_private_namespace(algorithm)
11 geneial_private_namespace(stopping_criteria)
13 using ::geneial::population::management::BaseManager;
15 geneial_export_namespace
22 template <
typename FITNESS_TYPE>
23 class FixPointCriterion :
public StatefulStoppingCriterion<FITNESS_TYPE>
26 virtual ~FixPointCriterion() {};
28 FixPointCriterion(
const FITNESS_TYPE threshold = 0,
const FITNESS_TYPE windowSize = 10,
const FITNESS_TYPE minDiff = 1):
29 _windowSize(windowSize),
30 _threshold(threshold),
33 assert(_minDiff <= _windowSize);
37 virtual void print(std::ostream& os)
const
49 virtual bool wasStatefullyReached(BaseManager<FITNESS_TYPE> &manager)
51 updateWindowValues(manager);
55 if(_window.size() >= _minDiff)
57 const FITNESS_TYPE latest = _window.front();
58 const FITNESS_TYPE oldest = _window.back();
62 result = (latest - oldest) <= _threshold;
70 void inline updateWindowValues(BaseManager<FITNESS_TYPE> &manager)
72 const FITNESS_TYPE bestFitness = manager.getHighestFitness();
73 assert(_window.size() <= _windowSize);
75 _window.push_front(bestFitness);
77 while(_window.size()>_windowSize)
82 assert(_window.size() <= _windowSize);
87 const unsigned int _windowSize;
90 FITNESS_TYPE _threshold;
92 std::deque<FITNESS_TYPE> _window;
95 const unsigned int _minDiff;