1 #ifndef SIMANN_H |
1 #ifndef LEMON_SIMANN_H |
2 #define SIMANN_H |
2 #define LEMON_SIMANN_H |
3 |
3 |
4 #ifndef INFTY |
4 namespace lemon { |
5 #define INFTY 1e24 |
|
6 #endif |
|
7 |
5 |
8 #include <iostream> |
6 const double INFTY = 1e24; |
9 |
7 |
10 class SimAnnBase { |
8 class SimAnnBase { |
11 public: |
|
12 friend class Controller; |
|
13 class Controller { |
|
14 public: |
9 public: |
15 SimAnnBase *sab; |
10 class Controller; |
16 double T; |
11 private: |
17 void init(SimAnnBase *_sab) { sab = _sab; } |
12 Controller *controller; |
18 bool next() {} |
13 protected: |
19 bool accept(double cost) {} |
14 double curr_cost; |
20 }; |
15 double prev_cost; |
21 protected: |
16 double best_cost; |
22 double CurrCost; |
|
23 double PrevCost; |
|
24 double BestCost; |
|
25 |
17 |
26 long Iter; |
18 virtual void mutate() = 0; |
27 long LastImpr; |
19 virtual void revert() = 0; |
28 |
20 virtual void saveAsBest() = 0; |
29 //friend class Controller; |
21 public: |
30 Controller *Ctrl; |
22 SimAnnBase() { |
31 public: |
23 curr_cost = prev_cost = best_cost = INFTY; |
32 long getIter() { return Iter; } |
24 } |
33 long getLastImpr() { return LastImpr; } |
25 void setController(Controller &_controller) { controller = &_controller; } |
34 double getBestCost() { return BestCost; } |
26 double getBestCost() { return best_cost; } |
35 virtual void mutate() = 0; |
27 void run() { |
36 virtual void revert() = 0; |
28 while (controller->next()) { |
37 virtual void saveAsBest() = 0; |
29 mutate(); |
38 virtual void init() = 0; |
30 if (controller->accept(prev_cost - curr_cost)) { |
39 |
31 controller->acceptEvent(); |
40 void run() { |
32 if (curr_cost < best_cost) { |
41 init(); |
33 saveAsBest(); |
42 while (Ctrl->next()) { |
34 controller->improveEvent(); |
43 Iter++; |
35 } |
44 std::cout << Iter << std::endl; |
36 } |
45 mutate(); |
37 else { |
46 if (Ctrl->accept(PrevCost - CurrCost) && (CurrCost < BestCost)) { |
38 revert(); |
47 LastImpr = Iter; |
39 controller->rejectEvent(); |
48 saveAsBest(); |
40 } |
49 } |
|
50 else { |
|
51 revert(); |
|
52 } |
41 } |
53 } |
42 } |
54 } |
|
55 }; |
|
56 |
43 |
57 template <typename E> |
44 class Controller { |
58 class SimAnn : public SimAnnBase { |
45 public: |
59 private: |
46 virtual void acceptEvent() {} |
60 E *CurrEnt; |
47 virtual void improveEvent() {} |
61 E *PrevEnt; |
48 virtual void rejectEvent() {} |
62 E *BestEnt; |
49 virtual bool next() = 0; |
63 public: |
50 virtual bool accept(double cost_diff) = 0; |
64 SimAnn() { |
51 }; |
65 CurrCost = PrevCost = BestCost = INFTY; |
52 }; |
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 }; |
|
95 |
53 |
96 class EntitySkeleton { |
54 template <typename E> |
97 public: |
55 class SimAnn : public SimAnnBase { |
98 void init() {} |
56 private: |
99 // returns the new cost |
57 E *curr_ent; |
100 double mutate() { return 0.0; } |
58 E *prev_ent; |
101 }; |
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 #endif |
126 #endif |