#pragma once
#include <cmath>
#include <random>
#include <utility>
#include <algorithm>
// To find a status with lower energy according to the given condition
template<typename status, typename count, typename energy_function, typename temperature_function, typename next_function, typename generator>
status simulated_annealing(status i_old, count c, const energy_function& ef, const temperature_function& tf, const next_function& nf, generator& g){
auto e_old = ef(i_old);
status i_best = i_old;
auto e_best = e_old;
std::uniform_real_distribution<decltype(e_old)> rf(0, 1);
for(; c > 0; --c){
status i_new = nf(i_old, g);
auto e_new = ef(i_new);
if(e_new < e_best){
i_best = i_new ;
e_best = e_new ;
}
if( e_new < e_old || std::exp( (e_old - e_new) / tf(c) ) > rf(g) ){
i_old = std::move(i_new);
e_old = std::move(e_new);
}
}
return(i_best);
}
#Simulated annealing code
3 messages · Page 1 of 1 (latest)
When your question is answered use !solved to mark the question as resolved.
Remember to ask specific questions, provide necessary details, and reduce your question to its simplest form. For tips on how to ask a good question use !howto ask.
Can anyone explain this line of code from https://codereview.stackexchange.com/questions/70310/simple-simulated-annealing-template-in-c11?
std::uniform_real_distribution<decltype(e_old)> rf(0, 1);