00001 #ifndef OPTFRAME_NSSEQROUTESHIFT_HPP_
00002 #define OPTFRAME_NSSEQROUTESHIFT_HPP_
00003
00004
00005 #include "../Move.hpp"
00006 #include "../NSSeq.hpp"
00007
00008 using namespace std;
00009
00010
00011
00012 template<class T, class M = OPTFRAME_DEFAULT_MEMORY>
00013 class MoveRouteShift: public Move<vector<vector<T> > , M>
00014 {
00015 typedef vector<vector<T> > Routes;
00016
00017 protected:
00018 int r1, r2;
00019 int e1, e2;
00020 int n1, n2;
00021 int i1, i2;
00022
00023 vector<T> v1, v2;
00024
00025 public:
00026
00027 MoveRouteShift(int _r1, int _r2, int _e1, int _e2, int _n1, int _n2, int _i1, int _i2) :
00028 r1(_r1), r2(_r2), e1(_e1), e2(_e2), n1(_n1), n2(_n2), i1(_i1), i2(_i2)
00029 {
00030 for (int e = e1; e < e1 + n1; e++)
00031 v1.push_back(e);
00032 for (int e = e2; e < e2 + n2; e++)
00033 v2.push_back(e);
00034 }
00035
00036 virtual ~MoveRouteShift()
00037 {
00038 }
00039
00040 int get_r1()
00041 {
00042 return r1;
00043 }
00044
00045 int get_r2()
00046 {
00047 return r2;
00048 }
00049
00050 int get_e1()
00051 {
00052 return e1;
00053 }
00054
00055 int get_e2()
00056 {
00057 return e2;
00058 }
00059
00060 int get_n1()
00061 {
00062 return n1;
00063 }
00064
00065 int get_n2()
00066 {
00067 return n2;
00068 }
00069
00070 int get_i1()
00071 {
00072 return i1;
00073 }
00074
00075 int get_i2()
00076 {
00077 return i2;
00078 }
00079
00080 bool canBeApplied(const Routes& rep)
00081 {
00082 bool all_positive = (e1 >= 0) && (e2 >= 0) && (i1 >= 0) && (i2 >= 0);
00083 return all_positive && (r1 < rep.size()) && (r2 < rep.size()) && ((rep.at(r1).size() - n1) >= 0) && ((rep.at(r2).size() - n2) >= 0);
00084 }
00085
00086 Move<Routes, M>& apply(Routes& rep)
00087 {
00088 vector<T> v1;
00089 vector<T> v2;
00090
00091 for (int e = 0; e < n1; e++)
00092 v1.push_back(rep[r1][e1 + e]);
00093 for (int e = 0; e < n2; e++)
00094 v2.push_back(rep[r2][e2 + e]);
00095
00096 if (n1 > 0)
00097 rep[r1].erase(rep[r1].begin() + e1, rep[r1].begin() + e1 + n1);
00098 if (n2 > 0)
00099 rep[r2].erase(rep[r2].begin() + e2, rep[r2].begin() + e2 + n2);
00100
00101 if (n1 > 0)
00102 rep[r2].insert(rep[r2].begin() + i2, v1.begin(), v1.end());
00103 if (n2 > 0)
00104 rep[r1].insert(rep[r1].begin() + i1, v2.begin(), v2.end());
00105
00106
00107 return *new MoveRouteShift(r1, r2, i1, i2, n2, n1, e1, e2);
00108 }
00109
00110 virtual bool operator==(const Move<Routes, M>& _m) const
00111 {
00112 const MoveRouteShift& m1 = (const MoveRouteShift&) _m;
00113
00114 bool empty_v1 = (v1.size() == 0) && (m1.v1.size() == 0);
00115 bool empty_v2 = (v2.size() == 0) && (m1.v2.size() == 0);
00116
00117
00118
00119
00120
00121 if (empty_v1)
00122 return (m1.r1 == r1) && (m1.r2 == r2) && (m1.i1 == i1) && (m1.v2 == v2);
00123 else if (empty_v2)
00124 return (m1.r1 == r1) && (m1.r2 == r2) && (m1.i2 == i2) && (m1.v1 == v1);
00125 else
00126 return (m1.r1 == r1) && (m1.r2 == r2) && (m1.i1 == i1) && (m1.i2 == i2) && (m1.e1 == e1) && (m1.e2 == e2);
00127 }
00128
00129 void print()
00130 {
00131 cout << "MoveRouteShift( ";
00132 cout << "route " << r1 << " [ ";
00133 for (int e = 0; e < n1; e++)
00134 cout << (e1 + e) << " ";
00135 cout << "] to pos " << i2 << " <=> ";
00136 cout << "route " << r2 << " [ ";
00137 for (int e = 0; e < n2; e++)
00138 cout << (e2 + e) << " ";
00139 cout << "] to pos " << i1 << " )";
00140 cout << endl;
00141 }
00142 };
00143
00144 template<class T, class M = OPTFRAME_DEFAULT_MEMORY, class MOVE = MoveRouteShift<T, M> >
00145 class NSIteratorRoutesShift: public NSIterator<vector<vector<T> > , M>
00146 {
00147 typedef vector<vector<T> > Routes;
00148 const Routes& routes;
00149
00150 private:
00151 int n1, n2;
00152 vector<MOVE*> moves;
00153
00154 MOVE* m;
00155
00156 public:
00157
00158 NSIteratorRoutesShift(const Routes& r, int _n1, int _n2) :
00159 routes(r), n1(_n1), n2(_n2)
00160 {
00161 m = NULL;
00162 }
00163
00164 virtual ~NSIteratorRoutesShift()
00165 {
00166 if (moves.size() > 0)
00167 {
00168 for (unsigned int i = 0; i < moves.size(); i++)
00169 delete moves[i];
00170 moves.clear();
00171 }
00172 }
00173
00174 void first()
00175 {
00176 if (moves.size() > 0)
00177 {
00178 for (unsigned int i = 0; i < moves.size(); i++)
00179 delete moves[i];
00180 moves.clear();
00181 }
00182
00183 if (n2 > 0)
00184 for (int r1 = 0; r1 < routes.size(); r1++)
00185 for (int r2 = (r1 == 0) ? 1 : 0; r2 < routes.size(); r2 = (r2 + 1 == r1) ? r2 += 2 : r2 += 1)
00186 for (int e1 = 0; e1 <= (int) routes[r1].size() - n1; e1++)
00187 for (int e2 = 0; e2 <= (int) routes[r2].size() - n2; e2++)
00188 for (int i1 = 0; i1 <= (int) routes[r1].size() - n1; i1++)
00189 for (int i2 = 0; i2 <= (int) routes[r2].size() - n2; i2++)
00190 moves.push_back(new MOVE(r1, r2, e1, e2, n1, n2, i1, i2));
00191 else
00192 for (int r1 = 0; r1 < routes.size(); r1++)
00193 for (int r2 = (r1 == 0) ? 1 : 0; r2 < routes.size(); r2 = (r2 + 1 == r1) ? r2 += 2 : r2 += 1)
00194 for (int e1 = 0; e1 <= (int) routes[r1].size() - n1; e1++)
00195 for (int i2 = 0; i2 <= (int) routes[r2].size(); i2++)
00196 moves.push_back(new MOVE(r1, r2, e1, 0, n1, n2, 0, i2));
00197
00198 if (moves.size() > 0)
00199 {
00200 m = moves[0];
00201 moves.erase(moves.begin() + 0);
00202 }
00203 else
00204 m = NULL;
00205 }
00206
00207 void next()
00208 {
00209 if (moves.size() > 0)
00210 {
00211 m = moves[0];
00212 moves.erase(moves.begin() + 0);
00213 }
00214 else
00215 m = NULL;
00216 }
00217
00218 bool isDone()
00219 {
00220 return m == NULL;
00221 }
00222
00223 Move<Routes, M>& current()
00224 {
00225 if (isDone())
00226 {
00227 cout << "There isnt any current element!" << endl;
00228 cout << "NSSeqRouteShift. Aborting." << endl;
00229 exit(1);
00230 }
00231
00232 return *m;
00233 }
00234 };
00235
00236 template<class T, class M = OPTFRAME_DEFAULT_MEMORY, class MOVE = MoveRouteShift<T, M> >
00237 class NSSeqRouteShift: public NSSeq<vector<vector<T> > , M>
00238 {
00239 typedef vector<vector<T> > Routes;
00240
00241 private:
00242 int n1, n2;
00243
00244 public:
00245
00246 NSSeqRouteShift(int _n1, int _n2)
00247 {
00248 if (_n1 > _n2)
00249 {
00250 n1 = _n1;
00251 n2 = _n2;
00252 }
00253 else
00254 {
00255 n1 = _n2;
00256 n2 = _n1;
00257 }
00258
00259 if (n1 <= 0)
00260 {
00261 n1 = 1;
00262 cout << "Warning: invalid NSSeqShift(" << _n1 << "," << _n2 << ")!" << endl;
00263 }
00264
00265 if (n2 < 0)
00266 {
00267 n2 = 0;
00268 cout << "Warning: invalid NSSeqShift(" << _n1 << "," << _n2 << ")!" << endl;
00269 }
00270
00271 }
00272
00273 virtual ~NSSeqRouteShift()
00274 {
00275 }
00276
00277 Move<Routes, M>& move(const Routes& rep)
00278 {
00279 if (rep.size() < 2)
00280 return *new MOVE(0, 0, -1, -1, 0, 0, -1, -1);
00281
00282
00283 int r1 = rand() % rep.size();
00284 int r2 = r1;
00285 while (r1 == r2)
00286 r2 = rand() % rep.size();
00287
00288 int e1 = -1;
00289 int i1 = -1;
00290
00291 if (n1 <= rep[r1].size())
00292 {
00293 e1 = rand() % (rep[r1].size() - (n1 - 1));
00294 i1 = rand() % (rep[r1].size() - n1 + 1);
00295 }
00296
00297 int e2 = -1;
00298 int i2 = -1;
00299 if (n2 > 0)
00300 if (n2 <= rep[r2].size())
00301 {
00302 e2 = rand() % (rep[r2].size() - (n2 - 1));
00303 i2 = rand() % (rep[r2].size() - n2 + 1);
00304 }
00305
00306 if (n2 == 0)
00307 {
00308 e2 = 0;
00309 i2 = rand() % (rep[r2].size() + 1);
00310 }
00311
00312
00313 return *new MOVE(r1, r2, e1, e2, n1, n2, i1, i2);
00314 }
00315
00316 virtual NSIterator<Routes, M>& getIterator(const Routes& r)
00317 {
00318 return *new NSIteratorRoutesShift<T, M, MOVE> (r, n1, n2);
00319 }
00320
00321 virtual void print()
00322 {
00323 cout << "NSSeqRouteShift" << endl;
00324 }
00325 };
00326
00327 #endif