author | jacint |
Wed, 29 Sep 2004 14:12:26 +0000 | |
changeset 920 | 2d6c8075d9d0 |
permissions | -rw-r--r-- |
1 #ifndef SIMANN_H
2 #define SIMANN_H
4 #ifndef INFTY
5 #define INFTY 1e24
6 #endif
8 #include <iostream>
10 class SimAnnBase {
11 public:
12 friend class Controller;
13 class Controller {
14 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;
26 long Iter;
27 long LastImpr;
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;
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();
52 }
53 }
54 }
55 };
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 };
96 class EntitySkeleton {
97 public:
98 void init() {}
99 // returns the new cost
100 double mutate() { return 0.0; }
101 };
103 #endif