Changeset 942:75fdd0c6866d in lemon-0.x for src/work/akos
- Timestamp:
- 10/11/04 20:02:48 (20 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@1285
- Location:
- src/work/akos
- Files:
-
- 1 edited
- 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 -
src/work/akos/simann_test.cc
r918 r942 1 #include " SimAnn.h"1 #include "simann.h" 2 2 #include <cstdlib> 3 3 #include <cmath> 4 4 #include <iostream> 5 5 6 using namespace lemon; 7 6 8 class MyController : public SimAnnBase::Controller { 7 9 public: 8 long MaxIter, MaxNoImpr;9 double af;10 long iter, last_impr, max_iter, max_no_impr; 11 double temp, annealing_factor; 10 12 MyController() { 11 MaxIter = 500000; 12 MaxNoImpr = 20000; 13 af = 0.9999; 14 T = 1000; 13 iter = last_impr = 0; 14 max_iter = 500000; 15 max_no_impr = 20000; 16 annealing_factor = 0.9999; 17 temp = 1000; 18 } 19 void acceptEvent() { 20 iter++; 21 } 22 void improveEvent() { 23 last_impr = iter; 24 } 25 void rejectEvent() { 26 iter++; 15 27 } 16 28 bool next() { 17 T *= af;18 std::cout << T << std::endl;19 return ! ((sab->getIter() > MaxIter) || (sab->getIter() - sab->getLastImpr() > MaxNoImpr));29 temp *= annealing_factor; 30 bool quit = (iter > max_iter) || (iter - last_impr > max_no_impr); 31 return !quit; 20 32 } 21 bool accept(double cost ) {22 return (drand48() <= exp(cost / T));33 bool accept(double cost_diff) { 34 return (drand48() <= exp(cost_diff / temp)); 23 35 } 24 36 }; … … 26 38 class MyEntity { 27 39 public: 28 void init() {}29 40 double mutate() { return 10.0; } 30 41 }; 31 42 32 43 int main() { 33 SimAnn<MyEntity> s a;34 MyController c ;35 s a.setController(c);44 SimAnn<MyEntity> simann; 45 MyController ctrl; 46 simann.setController(ctrl); 36 47 MyEntity ent; 37 s a.setEnt(ent);38 s a.run();48 simann.setEntity(ent); 49 simann.run(); 39 50 }
Note: See TracChangeset
for help on using the changeset viewer.