src/work/akos/SimAnn.h
changeset 928 71dc900ee30f
equal deleted inserted replaced
-1:000000000000 0:da05ce96e3f5
       
     1 #ifndef SIMANN_H
       
     2 #define SIMANN_H
       
     3 
       
     4 #ifndef INFTY
       
     5 #define INFTY 1e24
       
     6 #endif
       
     7 
       
     8 #include <iostream>
       
     9 
       
    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;
       
    25 
       
    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();
       
    52       }
       
    53     }
       
    54   }
       
    55 };
       
    56 
       
    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 };
       
    95 
       
    96 class EntitySkeleton {
       
    97 public:
       
    98   void init() {}
       
    99   // returns the new cost
       
   100   double mutate() { return 0.0; }
       
   101 };
       
   102 
       
   103 #endif