[Lemon-commits] [lemon_svn] ladanyi: r1229 - hugo/trunk/src/work/akos
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:44:00 CET 2006
Author: ladanyi
Date: Wed Sep 29 12:35:35 2004
New Revision: 1229
Added:
hugo/trunk/src/work/akos/SimAnn.h
hugo/trunk/src/work/akos/simann_test.cc
Log:
Initial revision.
Added: hugo/trunk/src/work/akos/SimAnn.h
==============================================================================
--- (empty file)
+++ hugo/trunk/src/work/akos/SimAnn.h Wed Sep 29 12:35:35 2004
@@ -0,0 +1,103 @@
+#ifndef SIMANN_H
+#define SIMANN_H
+
+#ifndef INFTY
+#define INFTY 1e24
+#endif
+
+#include <iostream>
+
+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();
+ }
+ }
+ }
+};
+
+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; }
+};
+
+#endif
Added: hugo/trunk/src/work/akos/simann_test.cc
==============================================================================
--- (empty file)
+++ hugo/trunk/src/work/akos/simann_test.cc Wed Sep 29 12:35:35 2004
@@ -0,0 +1,39 @@
+#include "SimAnn.h"
+#include <cstdlib>
+#include <cmath>
+#include <iostream>
+
+class MyController : public SimAnnBase::Controller {
+public:
+ long MaxIter, MaxNoImpr;
+ double af;
+ MyController() {
+ MaxIter = 500000;
+ MaxNoImpr = 20000;
+ af = 0.9999;
+ T = 1000;
+ }
+ bool next() {
+ T *= af;
+ std::cout << T << std::endl;
+ return !((sab->getIter() > MaxIter) || (sab->getIter() - sab->getLastImpr() > MaxNoImpr));
+ }
+ bool accept(double cost) {
+ return (drand48() <= exp(cost / T));
+ }
+};
+
+class MyEntity {
+public:
+ void init() {}
+ double mutate() { return 10.0; }
+};
+
+int main() {
+ SimAnn<MyEntity> sa;
+ MyController c;
+ sa.setController(c);
+ MyEntity ent;
+ sa.setEnt(ent);
+ sa.run();
+}
More information about the Lemon-commits
mailing list