# HG changeset patch # User ladanyi # Date 1108133800 0 # Node ID 99c1aa395a5875aca2615415eeafeda42927e36a # Parent 1cfabf24543325b271917dfca9e846af1b6db3f9 more docs diff -r 1cfabf245433 -r 99c1aa395a58 src/work/akos/simann.h --- a/src/work/akos/simann.h Thu Feb 10 18:53:30 2005 +0000 +++ b/src/work/akos/simann.h Fri Feb 11 14:56:40 2005 +0000 @@ -180,6 +180,7 @@ double _temp = 1000.0, double _ann_fact = 0.9999) : iter(0), last_impr(0), max_iter(_max_iter), max_no_impr(_max_no_impr), temp(_temp), ann_fact(_ann_fact) {} + /*! \brief This is called when a neighbouring state gets accepted. */ void acceptEvent() { iter++; } @@ -215,6 +216,16 @@ /*! \brief A controller with preset running time for the simulated annealing * class. + * + * With this controller you can set the running time of the annealing + * process in advance. It works the following way: the controller measures + * a kind of divergence. The divergence is the difference of the average + * cost of the recently found solutions the cost of the best found one. In + * case this divergence is greater than a given threshold, then we decrease + * the annealing factor, that is we cool the system faster. In case the + * divergence is lower than the threshold, then we increase the temperature. + * The threshold is a function of the elapsed time which reaches zero at the + * desired end time. */ class AdvancedController : public SimAnnBase::Controller { private: @@ -227,22 +238,32 @@ double alpha; double beta; double gamma; + /*! \brief The time at the end of the algorithm. */ double end_time; + /*! \brief The time at the start of the algorithm. */ double start_time; + /*! \brief Starting threshold. */ double start_threshold; + /*! \brief Average cost of recent solutions. */ double avg_cost; + /*! \brief Temperature. */ double temp; + /*! \brief Annealing factor. */ double ann_fact; + /*! \brief Initial annealing factor. */ + double init_ann_fact; bool warmup; /*! \brief Constructor. * \param _end_time running time in seconds * \param _alpha parameter used to calculate the running average * \param _beta parameter used to decrease the annealing factor * \param _gamma parameter used to increase the temperature + * \param _ann_fact initial annealing factor */ AdvancedController(double _end_time, double _alpha = 0.2, - double _beta = 0.9, double _gamma = 1.6) : alpha(_alpha), beta(_beta), - gamma(_gamma), end_time(_end_time), ann_fact(0.99999999), warmup(true) {} + double _beta = 0.9, double _gamma = 1.6, double _ann_fact = 0.9999) : + alpha(_alpha), beta(_beta), gamma(_gamma), end_time(_end_time), + ann_fact(_ann_fact), init_ann_fact(_ann_fact), warmup(true) {} void init() { avg_cost = base->getCurrCost(); } @@ -275,7 +296,8 @@ else { // increase the temperature temp *= gamma; - ann_fact = 0.99999999; // !!!!!!!!!!! + // reset the annealing factor + ann_fact = init_ann_fact; } temp *= ann_fact; return elapsed_time < end_time;