ladanyi@918: #ifndef SIMANN_H ladanyi@918: #define SIMANN_H ladanyi@918: ladanyi@918: #ifndef INFTY ladanyi@918: #define INFTY 1e24 ladanyi@918: #endif ladanyi@918: ladanyi@918: #include ladanyi@918: ladanyi@918: class SimAnnBase { ladanyi@918: public: ladanyi@918: friend class Controller; ladanyi@918: class Controller { ladanyi@918: public: ladanyi@918: SimAnnBase *sab; ladanyi@918: double T; ladanyi@918: void init(SimAnnBase *_sab) { sab = _sab; } ladanyi@918: bool next() {} ladanyi@918: bool accept(double cost) {} ladanyi@918: }; ladanyi@918: protected: ladanyi@918: double CurrCost; ladanyi@918: double PrevCost; ladanyi@918: double BestCost; ladanyi@918: ladanyi@918: long Iter; ladanyi@918: long LastImpr; ladanyi@918: ladanyi@918: //friend class Controller; ladanyi@918: Controller *Ctrl; ladanyi@918: public: ladanyi@918: long getIter() { return Iter; } ladanyi@918: long getLastImpr() { return LastImpr; } ladanyi@918: double getBestCost() { return BestCost; } ladanyi@918: virtual void mutate() = 0; ladanyi@918: virtual void revert() = 0; ladanyi@918: virtual void saveAsBest() = 0; ladanyi@918: virtual void init() = 0; ladanyi@918: ladanyi@918: void run() { ladanyi@918: init(); ladanyi@918: while (Ctrl->next()) { ladanyi@918: Iter++; ladanyi@918: std::cout << Iter << std::endl; ladanyi@918: mutate(); ladanyi@918: if (Ctrl->accept(PrevCost - CurrCost) && (CurrCost < BestCost)) { ladanyi@918: LastImpr = Iter; ladanyi@918: saveAsBest(); ladanyi@918: } ladanyi@918: else { ladanyi@918: revert(); ladanyi@918: } ladanyi@918: } ladanyi@918: } ladanyi@918: }; ladanyi@918: ladanyi@918: template ladanyi@918: class SimAnn : public SimAnnBase { ladanyi@918: private: ladanyi@918: E *CurrEnt; ladanyi@918: E *PrevEnt; ladanyi@918: E *BestEnt; ladanyi@918: public: ladanyi@918: SimAnn() { ladanyi@918: CurrCost = PrevCost = BestCost = INFTY; ladanyi@918: Iter = LastImpr = 0; ladanyi@918: } ladanyi@918: void setController(Controller &_Ctrl) { Ctrl = &_Ctrl; } ladanyi@918: void setEnt(E &Ent) { ladanyi@918: CurrEnt = new E(Ent); ladanyi@918: PrevEnt = new E(Ent); ladanyi@918: BestEnt = new E(Ent); ladanyi@918: } ladanyi@918: E getBestEnt() { return *BestEnt; } ladanyi@918: void mutate() { ladanyi@918: *PrevEnt = *CurrEnt; ladanyi@918: PrevCost = CurrCost; ladanyi@918: CurrCost = CurrEnt->mutate(); ladanyi@918: } ladanyi@918: void revert() { ladanyi@918: E *tmp = CurrEnt; ladanyi@918: CurrEnt = PrevEnt; ladanyi@918: PrevEnt = tmp; ladanyi@918: CurrCost = PrevCost; ladanyi@918: } ladanyi@918: void saveAsBest() { ladanyi@918: *BestEnt = *CurrEnt; ladanyi@918: BestCost = CurrCost; ladanyi@918: } ladanyi@918: void init() { ladanyi@918: Ctrl->init(this); ladanyi@918: CurrEnt->init(); ladanyi@918: } ladanyi@918: }; ladanyi@918: ladanyi@918: class EntitySkeleton { ladanyi@918: public: ladanyi@918: void init() {} ladanyi@918: // returns the new cost ladanyi@918: double mutate() { return 0.0; } ladanyi@918: }; ladanyi@918: ladanyi@918: #endif