Changeset 942:75fdd0c6866d in lemon-0.x for src/work/akos/simann.h
- Timestamp:
- 10/11/04 20:02:48 (20 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@1285
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
src/work/akos/simann.h
r918 r942 1 #ifndef SIMANN_H2 #define SIMANN_H1 #ifndef LEMON_SIMANN_H 2 #define LEMON_SIMANN_H 3 3 4 #ifndef INFTY 5 #define INFTY 1e24 6 #endif 4 namespace lemon { 7 5 8 #include <iostream> 6 const double INFTY = 1e24; 9 7 10 class SimAnnBase { 11 public: 12 friend class Controller; 13 class Controller { 8 class SimAnnBase { 14 9 public: 15 SimAnnBase *sab; 16 double T; 17 void init(SimAnnBase *_sab) { sab = _sab; } 18 bool next() {} 19 bool accept(double cost) {} 20 }; 21 protected: 22 double CurrCost; 23 double PrevCost; 24 double BestCost; 10 class Controller; 11 private: 12 Controller *controller; 13 protected: 14 double curr_cost; 15 double prev_cost; 16 double best_cost; 25 17 26 long Iter; 27 long LastImpr; 28 29 //friend class Controller; 30 Controller *Ctrl; 31 public: 32 long getIter() { return Iter; } 33 long getLastImpr() { return LastImpr; } 34 double getBestCost() { return BestCost; } 35 virtual void mutate() = 0; 36 virtual void revert() = 0; 37 virtual void saveAsBest() = 0; 38 virtual void init() = 0; 39 40 void run() { 41 init(); 42 while (Ctrl->next()) { 43 Iter++; 44 std::cout << Iter << std::endl; 45 mutate(); 46 if (Ctrl->accept(PrevCost - CurrCost) && (CurrCost < BestCost)) { 47 LastImpr = Iter; 48 saveAsBest(); 49 } 50 else { 51 revert(); 18 virtual void mutate() = 0; 19 virtual void revert() = 0; 20 virtual void saveAsBest() = 0; 21 public: 22 SimAnnBase() { 23 curr_cost = prev_cost = best_cost = INFTY; 24 } 25 void setController(Controller &_controller) { controller = &_controller; } 26 double getBestCost() { return best_cost; } 27 void run() { 28 while (controller->next()) { 29 mutate(); 30 if (controller->accept(prev_cost - curr_cost)) { 31 controller->acceptEvent(); 32 if (curr_cost < best_cost) { 33 saveAsBest(); 34 controller->improveEvent(); 35 } 36 } 37 else { 38 revert(); 39 controller->rejectEvent(); 40 } 52 41 } 53 42 } 54 }55 };56 43 57 template <typename E> 58 class SimAnn : public SimAnnBase { 59 private: 60 E *CurrEnt; 61 E *PrevEnt; 62 E *BestEnt; 63 public: 64 SimAnn() { 65 CurrCost = PrevCost = BestCost = INFTY; 66 Iter = LastImpr = 0; 67 } 68 void setController(Controller &_Ctrl) { Ctrl = &_Ctrl; } 69 void setEnt(E &Ent) { 70 CurrEnt = new E(Ent); 71 PrevEnt = new E(Ent); 72 BestEnt = new E(Ent); 73 } 74 E getBestEnt() { return *BestEnt; } 75 void mutate() { 76 *PrevEnt = *CurrEnt; 77 PrevCost = CurrCost; 78 CurrCost = CurrEnt->mutate(); 79 } 80 void revert() { 81 E *tmp = CurrEnt; 82 CurrEnt = PrevEnt; 83 PrevEnt = tmp; 84 CurrCost = PrevCost; 85 } 86 void saveAsBest() { 87 *BestEnt = *CurrEnt; 88 BestCost = CurrCost; 89 } 90 void init() { 91 Ctrl->init(this); 92 CurrEnt->init(); 93 } 94 }; 44 class Controller { 45 public: 46 virtual void acceptEvent() {} 47 virtual void improveEvent() {} 48 virtual void rejectEvent() {} 49 virtual bool next() = 0; 50 virtual bool accept(double cost_diff) = 0; 51 }; 52 }; 95 53 96 class EntitySkeleton { 97 public: 98 void init() {} 99 // returns the new cost 100 double mutate() { return 0.0; } 101 }; 54 template <typename E> 55 class SimAnn : public SimAnnBase { 56 private: 57 E *curr_ent; 58 E *prev_ent; 59 E *best_ent; 60 public: 61 SimAnn() : SimAnnBase() {} 62 void setEntity(E &Ent) { 63 curr_ent = new E(Ent); 64 prev_ent = new E(Ent); 65 best_ent = new E(Ent); 66 } 67 E getBestEntity() { return *best_ent; } 68 void mutate() { 69 *prev_ent = *curr_ent; 70 prev_cost = curr_cost; 71 curr_cost = curr_ent->mutate(); 72 } 73 void revert() { 74 E *tmp = curr_ent; 75 curr_ent = prev_ent; 76 prev_ent = tmp; 77 curr_cost = prev_cost; 78 } 79 void saveAsBest() { 80 *best_ent = *curr_ent; 81 best_cost = curr_cost; 82 } 83 }; 84 85 class EntitySkeleton { 86 public: 87 // returns the new cost 88 double mutate() { return 0.0; } 89 }; 90 91 template <typename E> 92 class SimAnn2 : public SimAnnBase { 93 private: 94 E *curr_ent; 95 E *best_ent; 96 public: 97 SimAnn2() : SimAnnBase() {} 98 void setEntity(E &Ent) { 99 curr_ent = new E(Ent); 100 best_ent = new E(Ent); 101 } 102 E getBestEntity() { return *best_ent; } 103 void mutate() { 104 curr_ent->mutate(); 105 } 106 void revert() { 107 curr_ent->revert(); 108 } 109 void saveAsBest() { 110 *best_ent = *curr_ent; 111 best_cost = curr_cost; 112 } 113 }; 114 115 class EntitySkeleton2 { 116 public: 117 // returns the new cost 118 double mutate() { return 0.0; } 119 // restores the entity to its previous state i.e. reverts the effects of 120 // the last mutate() 121 void revert() {} 122 }; 123 124 } 102 125 103 126 #endif
Note: See TracChangeset
for help on using the changeset viewer.