00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef __moSimpleSolutionTabuList_h
00038 #define __moSimpleSolutionTabuList_h
00039
00040 #include <list>
00041 #include <iterator>
00042
00043 #include "moTabuList.h"
00044
00046 template <class M>
00047 class moSimpleSolutionTabuList: public moTabuList < M >
00048 {
00049
00050 public:
00051
00053 typedef typename M::EOType EOT;
00054
00056
00059 moSimpleSolutionTabuList(unsigned int __size): maxSize(__size)
00060 {
00061 currentSize=0;
00062 }
00063
00065
00070 bool operator () (const M & __move, const EOT & __sol)
00071 {
00072 typename std::list<EOT>::iterator it;
00073
00074 M _move=(M)__move;
00075 EOT _sol=(EOT) __sol;
00076
00077 _move(_sol);
00078
00079 it=tabuList.begin();
00080 while(it!=tabuList.end()&&(!((*it)==_sol)))
00081 {
00082 it++;
00083 }
00084
00085 return it!=tabuList.end();
00086 }
00087
00088 void
00089 add (const M & __move, const EOT & __sol)
00090 {
00091 M _move=(M)__move;
00092 EOT _sol=(EOT) _sol;
00093
00094 _move(_sol);
00095
00096 if(currentSize!=0)
00097 {
00098
00099
00100 removeSolution(_sol);
00101 }
00102
00103 tabuList.push_back(_sol);
00104
00105 if(currentSize==maxSize)
00106 {
00107 tabuList.erase(tabuList.begin());
00108 }
00109 else
00110 {
00111 currentSize++;
00112 }
00113 }
00114
00115 void
00116 update ()
00117 {
00118
00119 }
00120
00121 void
00122 init ()
00123 {
00124
00125 }
00126
00127 private:
00128
00130
00133 void
00134 removeSolution(const EOT & __sol)
00135 {
00136 typename std::list<EOT>::iterator it;
00137
00138 it=tabuList.begin();
00139 while(it!=tabuList.end()&&(!((*it)==__sol)))
00140 {
00141 it++;
00142 }
00143
00144 if(it!=tabuList.end())
00145 {
00146 tabuList.erase(it);
00147 }
00148 }
00149
00151 unsigned int maxSize;
00152
00154 unsigned int currentSize;
00155
00157 std::list<EOT> tabuList;
00158 };
00159
00160 #endif