diff -r 0ff924405d21 -r 4dd4eaee28e7 src/work/akos/simann.h --- a/src/work/akos/simann.h Thu Nov 04 13:32:44 2004 +0000 +++ b/src/work/akos/simann.h Thu Nov 04 18:48:58 2004 +0000 @@ -22,12 +22,17 @@ SimAnnBase() { curr_cost = prev_cost = best_cost = INFTY; } - void setController(Controller &_controller) { controller = &_controller; } + void setController(Controller &_controller) { + controller = &_controller; + controller->setBase(this); + } + double getCurrCost() { return curr_cost; } + double getPrevCost() { return prev_cost; } double getBestCost() { return best_cost; } void run() { while (controller->next()) { mutate(); - if (controller->accept(prev_cost - curr_cost)) { + if (controller->accept()) { controller->acceptEvent(); if (curr_cost < best_cost) { saveAsBest(); @@ -43,11 +48,13 @@ class Controller { public: + SimAnnBase *base; virtual void acceptEvent() {} virtual void improveEvent() {} virtual void rejectEvent() {} + virtual void setBase(SimAnnBase *_base) { base = _base; } virtual bool next() = 0; - virtual bool accept(double cost_diff) = 0; + virtual bool accept() = 0; }; }; @@ -57,10 +64,10 @@ E *curr_ent; E *best_ent; public: - SimAnn2() : SimAnnBase() {} - void setEntity(E &Ent) { - curr_ent = new E(Ent); - best_ent = new E(Ent); + SimAnn() : SimAnnBase() {} + void setEntity(E &ent) { + curr_ent = new E(ent); + best_ent = new E(ent); } E getBestEntity() { return *best_ent; } void mutate() { @@ -88,7 +95,7 @@ public: long iter, last_impr, max_iter, max_no_impr; double temp, annealing_factor; - MyController() { + SimpleController() { iter = last_impr = 0; max_iter = 500000; max_no_impr = 20000; @@ -109,8 +116,8 @@ bool quit = (iter > max_iter) || (iter - last_impr > max_no_impr); return !quit; } - bool accept(double cost_diff) { - return (drand48() <= exp(cost_diff / temp)); + bool accept() { + return (drand48() <= exp(base->getPrevCost() - base->getCurrCost() / temp)); } };