moSA.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
00002 
00003 // "moSA.h"
00004 
00005 // (c) OPAC Team, LIFL, 2003-2006
00006 
00007 /* LICENCE TEXT
00008    
00009    Contact: paradiseo-help@lists.gforge.inria.fr
00010 */
00011 
00012 #ifndef __moSA_h
00013 #define __moSA_h
00014 
00015 #include <eoOp.h>
00016 #include <eoEvalFunc.h>
00017 
00018 #include "moAlgo.h"
00019 #include "moRandMove.h"
00020 #include "moMoveIncrEval.h"
00021 #include "moCoolingSchedule.h"
00022 #include "moSolContinue.h"
00023 
00024 #include <math.h>
00025 
00027 
00030 template < class M > class moSA:public moAlgo < typename M::EOType >
00031 {
00032 
00034   typedef
00035     typename
00036     M::EOType
00037     EOT;
00038 
00040   typedef
00041     typename
00042     EOT::Fitness
00043     Fitness;
00044 
00045 public:
00046 
00048 
00058   moSA (moRandMove < M > &__move_rand,
00059         moMoveIncrEval < M > &__incr_eval,
00060         moSolContinue < EOT > &__cont,
00061         double __init_temp,
00062         moCoolingSchedule & __cool_sched, eoEvalFunc < EOT > &__full_eval):
00063   move_rand (__move_rand),
00064   incr_eval (__incr_eval),
00065   cont (__cont),
00066   init_temp (__init_temp),
00067   cool_sched (__cool_sched),
00068   full_eval (__full_eval)
00069   {
00070 
00071   }
00072 
00074 
00080   bool operator   ()(EOT & __sol)
00081   {
00082 
00083     if (__sol.invalid ())
00084       {
00085         full_eval (__sol);
00086       }
00087 
00088     double temp = init_temp;
00089 
00090     M move;
00091 
00092     EOT best_sol = __sol;
00093 
00094     do
00095       {
00096 
00097         cont.init ();
00098         do
00099           {
00100 
00101             move_rand (move);
00102 
00103             Fitness delta_fit = incr_eval (move, __sol) - __sol.fitness ();
00104 
00105             if (delta_fit > 0 || rng.uniform () < exp (delta_fit / temp))
00106               {
00107 
00108                 __sol.fitness (incr_eval (move, __sol));
00109                 move (__sol);
00110 
00111                 /* Updating the best solution found
00112                    until now ? */
00113                 if (__sol.fitness () > best_sol.fitness ())
00114                   best_sol = __sol;
00115               }
00116 
00117           }
00118         while (cont (__sol));
00119 
00120       }
00121     while (cool_sched (temp));
00122 
00123     __sol = best_sol;
00124 
00125     return true;
00126   }
00127 
00128 private:
00129 
00131   moRandMove < M > &move_rand;
00132 
00134   moMoveIncrEval < M > &incr_eval;
00135 
00137   moSolContinue < EOT > &cont;
00138 
00140   double  init_temp;
00141 
00143   moCoolingSchedule & cool_sched;
00144 
00146   eoEvalFunc < EOT > &full_eval;        // Full evaluator.
00147 };
00148 
00149 #endif

Generated on Thu Jul 5 17:08:27 2007 for PARADISEO-MO by  doxygen 1.4.7