# HG changeset patch # User ladanyi # Date 1096454135 0 # Node ID bb77eaa8fa0ea11876d14e425c987abf4ebc11c7 # Parent ffb8f0cbcb577024e71ba8ce0cedd4c0662f5c38 Initial revision. diff -r ffb8f0cbcb57 -r bb77eaa8fa0e src/work/akos/SimAnn.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/work/akos/SimAnn.h Wed Sep 29 10:35:35 2004 +0000 @@ -0,0 +1,103 @@ +#ifndef SIMANN_H +#define SIMANN_H + +#ifndef INFTY +#define INFTY 1e24 +#endif + +#include + +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 +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 diff -r ffb8f0cbcb57 -r bb77eaa8fa0e src/work/akos/simann_test.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/work/akos/simann_test.cc Wed Sep 29 10:35:35 2004 +0000 @@ -0,0 +1,39 @@ +#include "SimAnn.h" +#include +#include +#include + +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 sa; + MyController c; + sa.setController(c); + MyEntity ent; + sa.setEnt(ent); + sa.run(); +}