src/work/akos/simann.h
changeset 949 b16a10926781
parent 918 bb77eaa8fa0e
child 956 0ff924405d21
equal deleted inserted replaced
0:da05ce96e3f5 0:40cde70732b6
     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