[Lemon-commits] [lemon_svn] ladanyi: r1285 - hugo/trunk/src/work/akos
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:44:23 CET 2006
Author: ladanyi
Date: Mon Oct 11 20:02:48 2004
New Revision: 1285
Added:
hugo/trunk/src/work/akos/simann.h
- copied, changed from r1284, /hugo/trunk/src/work/akos/SimAnn.h
Removed:
hugo/trunk/src/work/akos/SimAnn.h
Modified:
hugo/trunk/src/work/akos/simann_test.cc
Log:
Naming and coding style fixes and various other changes.
Copied: hugo/trunk/src/work/akos/simann.h (from r1284, /hugo/trunk/src/work/akos/SimAnn.h)
==============================================================================
--- /hugo/trunk/src/work/akos/SimAnn.h (original)
+++ hugo/trunk/src/work/akos/simann.h Mon Oct 11 20:02:48 2004
@@ -1,103 +1,126 @@
-#ifndef SIMANN_H
-#define SIMANN_H
+#ifndef LEMON_SIMANN_H
+#define LEMON_SIMANN_H
-#ifndef INFTY
-#define INFTY 1e24
-#endif
+namespace lemon {
-#include <iostream>
+ const double INFTY = 1e24;
-class SimAnnBase {
-public:
- friend class Controller;
- class Controller {
- public:
- SimAnnBase *sab;
- double T;
- void init(SimAnnBase *_sab) { sab = _sab; }
- bool next() {}
- bool accept(double cost) {}
- };
-protected:
- double CurrCost;
- double PrevCost;
- double BestCost;
-
- long Iter;
- long LastImpr;
-
- //friend class Controller;
- Controller *Ctrl;
-public:
- long getIter() { return Iter; }
- long getLastImpr() { return LastImpr; }
- double getBestCost() { return BestCost; }
- virtual void mutate() = 0;
- virtual void revert() = 0;
- virtual void saveAsBest() = 0;
- virtual void init() = 0;
-
- void run() {
- init();
- while (Ctrl->next()) {
- Iter++;
- std::cout << Iter << std::endl;
- mutate();
- if (Ctrl->accept(PrevCost - CurrCost) && (CurrCost < BestCost)) {
- LastImpr = Iter;
- saveAsBest();
- }
- else {
- revert();
+ class SimAnnBase {
+ public:
+ class Controller;
+ private:
+ Controller *controller;
+ protected:
+ double curr_cost;
+ double prev_cost;
+ double best_cost;
+
+ virtual void mutate() = 0;
+ virtual void revert() = 0;
+ virtual void saveAsBest() = 0;
+ public:
+ SimAnnBase() {
+ curr_cost = prev_cost = best_cost = INFTY;
+ }
+ void setController(Controller &_controller) { controller = &_controller; }
+ double getBestCost() { return best_cost; }
+ void run() {
+ while (controller->next()) {
+ mutate();
+ if (controller->accept(prev_cost - curr_cost)) {
+ controller->acceptEvent();
+ if (curr_cost < best_cost) {
+ saveAsBest();
+ controller->improveEvent();
+ }
+ }
+ else {
+ revert();
+ controller->rejectEvent();
+ }
}
}
- }
-};
-template <typename E>
-class SimAnn : public SimAnnBase {
-private:
- E *CurrEnt;
- E *PrevEnt;
- E *BestEnt;
-public:
- SimAnn() {
- CurrCost = PrevCost = BestCost = INFTY;
- Iter = LastImpr = 0;
- }
- void setController(Controller &_Ctrl) { Ctrl = &_Ctrl; }
- void setEnt(E &Ent) {
- CurrEnt = new E(Ent);
- PrevEnt = new E(Ent);
- BestEnt = new E(Ent);
- }
- E getBestEnt() { return *BestEnt; }
- void mutate() {
- *PrevEnt = *CurrEnt;
- PrevCost = CurrCost;
- CurrCost = CurrEnt->mutate();
- }
- void revert() {
- E *tmp = CurrEnt;
- CurrEnt = PrevEnt;
- PrevEnt = tmp;
- CurrCost = PrevCost;
- }
- void saveAsBest() {
- *BestEnt = *CurrEnt;
- BestCost = CurrCost;
- }
- void init() {
- Ctrl->init(this);
- CurrEnt->init();
- }
-};
-
-class EntitySkeleton {
-public:
- void init() {}
- // returns the new cost
- double mutate() { return 0.0; }
-};
+ class Controller {
+ public:
+ virtual void acceptEvent() {}
+ virtual void improveEvent() {}
+ virtual void rejectEvent() {}
+ virtual bool next() = 0;
+ virtual bool accept(double cost_diff) = 0;
+ };
+ };
+
+ template <typename E>
+ class SimAnn : public SimAnnBase {
+ private:
+ E *curr_ent;
+ E *prev_ent;
+ E *best_ent;
+ public:
+ SimAnn() : SimAnnBase() {}
+ void setEntity(E &Ent) {
+ curr_ent = new E(Ent);
+ prev_ent = new E(Ent);
+ best_ent = new E(Ent);
+ }
+ E getBestEntity() { return *best_ent; }
+ void mutate() {
+ *prev_ent = *curr_ent;
+ prev_cost = curr_cost;
+ curr_cost = curr_ent->mutate();
+ }
+ void revert() {
+ E *tmp = curr_ent;
+ curr_ent = prev_ent;
+ prev_ent = tmp;
+ curr_cost = prev_cost;
+ }
+ void saveAsBest() {
+ *best_ent = *curr_ent;
+ best_cost = curr_cost;
+ }
+ };
+
+ class EntitySkeleton {
+ public:
+ // returns the new cost
+ double mutate() { return 0.0; }
+ };
+
+ template <typename E>
+ class SimAnn2 : public SimAnnBase {
+ private:
+ E *curr_ent;
+ E *best_ent;
+ public:
+ SimAnn2() : SimAnnBase() {}
+ void setEntity(E &Ent) {
+ curr_ent = new E(Ent);
+ best_ent = new E(Ent);
+ }
+ E getBestEntity() { return *best_ent; }
+ void mutate() {
+ curr_ent->mutate();
+ }
+ void revert() {
+ curr_ent->revert();
+ }
+ void saveAsBest() {
+ *best_ent = *curr_ent;
+ best_cost = curr_cost;
+ }
+ };
+
+ class EntitySkeleton2 {
+ public:
+ // returns the new cost
+ double mutate() { return 0.0; }
+ // restores the entity to its previous state i.e. reverts the effects of
+ // the last mutate()
+ void revert() {}
+ };
+
+}
#endif
Modified: hugo/trunk/src/work/akos/simann_test.cc
==============================================================================
--- hugo/trunk/src/work/akos/simann_test.cc (original)
+++ hugo/trunk/src/work/akos/simann_test.cc Mon Oct 11 20:02:48 2004
@@ -1,39 +1,50 @@
-#include "SimAnn.h"
+#include "simann.h"
#include <cstdlib>
#include <cmath>
#include <iostream>
+using namespace lemon;
+
class MyController : public SimAnnBase::Controller {
public:
- long MaxIter, MaxNoImpr;
- double af;
+ long iter, last_impr, max_iter, max_no_impr;
+ double temp, annealing_factor;
MyController() {
- MaxIter = 500000;
- MaxNoImpr = 20000;
- af = 0.9999;
- T = 1000;
+ iter = last_impr = 0;
+ max_iter = 500000;
+ max_no_impr = 20000;
+ annealing_factor = 0.9999;
+ temp = 1000;
+ }
+ void acceptEvent() {
+ iter++;
+ }
+ void improveEvent() {
+ last_impr = iter;
+ }
+ void rejectEvent() {
+ iter++;
}
bool next() {
- T *= af;
- std::cout << T << std::endl;
- return !((sab->getIter() > MaxIter) || (sab->getIter() - sab->getLastImpr() > MaxNoImpr));
+ temp *= annealing_factor;
+ bool quit = (iter > max_iter) || (iter - last_impr > max_no_impr);
+ return !quit;
}
- bool accept(double cost) {
- return (drand48() <= exp(cost / T));
+ bool accept(double cost_diff) {
+ return (drand48() <= exp(cost_diff / temp));
}
};
class MyEntity {
public:
- void init() {}
double mutate() { return 10.0; }
};
int main() {
- SimAnn<MyEntity> sa;
- MyController c;
- sa.setController(c);
+ SimAnn<MyEntity> simann;
+ MyController ctrl;
+ simann.setController(ctrl);
MyEntity ent;
- sa.setEnt(ent);
- sa.run();
+ simann.setEntity(ent);
+ simann.run();
}
More information about the Lemon-commits
mailing list