1 #ifndef __MINLCA_UTILS_SIMULATED_ANNEALING_HH
2 #define __MINLCA_UTILS_SIMULATED_ANNEALING_HH
4 #include <lemon/random.h>
16 template<
typename Node>
20 typedef lemon::Random Random;
38 if (_current != _best and _current->energy() < 0.5 * _best->energy()) {
43 Node *next = _current->randomNeighbour();
44 double difEnergy = next->energy() - _current->energy();
47 std::string flags =
"";
50 if (_r->boolean(std::exp(difEnergy /
temperature()))) {
51 if (_current != _best) {
61 if (_current->energy() > _best->energy()) {
72 flags = flags +
" ++";
79 std::cerr <<
"Step " << _steps <<
' ' << _current->energy() << flags;
80 std::cerr << std::endl;
96 : _current(nullptr), _best(nullptr), _steps(0), _max_steps(steps),
97 _stiter(stIter), _k(k), _lambda(lambda), _delete_random(true),
100 _r =
new lemon::Random(seed);
113 : _current(nullptr), _best(nullptr), _steps(0), _max_steps(maxSteps),
114 _stiter(stIter), _k(k), _lambda(lambda), _delete_random(false), _r(&r)
129 if (_current != _best and _current !=
nullptr) {
133 if (_delete_random) {
150 _current = _best = start;
164 return _k * std::exp(-_lambda * (_steps / _stiter) * _stiter);
180 while (_steps < _max_steps) {
186 std::cerr <<
"Finished SA execution" << std::endl;
187 std::cerr << std::string(10,
'-') << std::endl;
190 if (_current != _best) {
int _max_steps
Maximum number of steps.
int _stiter
Steps per iteration.
int _k
Coefficient for the temperature.
int _steps
Total steps done.
SimulatedAnnealing(int steps, int stIter, int k, double lambda, int seed=0)
Constructor with seed.
SimulatedAnnealing(int maxSteps, int stIter, int k, double lambda, Random &r)
Constructor using pre-built random number generator.
Generic simulated annealing algorithm.
Node * best()
Get the best node.
virtual double temperature() const
Returns the current temperature.
bool _delete_random
Delete the random number generator in destructor.
Default namespace Default namespace for MinLCA algorithms.
void runStep()
Run a single step.
Node * _current
Current node.
Node * run()
Run the algorithm.
Random * _r
Pointer to random number generator.
double _lambda
Coefficient in the exponent of the temperature.
void init(Node *start)
Initialiser for the class.
~SimulatedAnnealing()
Default destructor.