00001 #ifndef EtII_NSSEQSwapCorner_HPP_
00002 #define EtII_NSSEQSwapCorner_HPP_
00003
00004
00005 #include "../../../OptFrame/NSSeq.hpp"
00006 #include "../../RandGen.hpp"
00007
00008
00009 #include "ProblemInstance.hpp"
00010 #include "Memory.h"
00011 #include "Solution.h"
00012
00013 using namespace std;
00014
00015 class MoveSwapCorner: public Move<RepEtII, MemEtII>
00016 {
00017 private:
00018 int x1, y1, x2, y2;
00019
00020 public:
00021
00022 using Move<RepEtII, MemEtII>::apply;
00023 using Move<RepEtII, MemEtII>::canBeApplied;
00024
00025 MoveSwapCorner(int _x1, int _y1, int _x2, int _y2) :
00026 x1(_x1), y1(_y1), x2(_x2), y2(_y2)
00027 {
00028 }
00029
00030 virtual ~MoveSwapCorner()
00031 {
00032 }
00033
00034 bool canBeApplied(const RepEtII& rep)
00035 {
00036 return true;
00037 }
00038
00039 Move<RepEtII, MemEtII>& apply(RepEtII& rep)
00040 {
00041 Piece p = rep(x1, y1);
00042 rep(x1, y1) = rep(x2, y2);
00043 rep(x2, y2) = p;
00044
00045 while ((rep(0, 0).left != 0) || (rep(0, 0).up != 0))
00046 rep(0, 0).rotate();
00047
00048 while ((rep(0, rep.getCols() - 1).right != 0) || (rep(0, rep.getCols() - 1).up != 0))
00049 rep(0, rep.getCols() - 1).rotate();
00050
00051 while ((rep(rep.getRows() - 1, 0).left != 0) || (rep(rep.getRows() - 1, 0).down != 0))
00052 rep(rep.getRows() - 1, 0).rotate();
00053
00054 while ((rep(rep.getRows() - 1, rep.getCols() - 1).right != 0) || (rep(rep.getRows() - 1, rep.getCols() - 1).down != 0))
00055 rep(rep.getRows() - 1, rep.getCols() - 1).rotate();
00056
00057 return *new MoveSwapCorner(x2, y2, x1, y1);
00058 }
00059
00060 Move<RepEtII, MemEtII>& apply(MemEtII& mem, RepEtII& rep)
00061 {
00062 int f = 0;
00063
00064 if (rep(0, 0).right == rep(0, 1).left)
00065 f++;
00066 if (rep(0, 0).down == rep(1, 0).up)
00067 f++;
00068
00069 if (rep(0, rep.getCols() - 1).left == rep(0, rep.getCols() - 2).right)
00070 f++;
00071 if (rep(0, rep.getCols() - 1).down == rep(1, rep.getCols() - 1).up)
00072 f++;
00073
00074 if (rep(rep.getRows() - 1, 0).right == rep(rep.getRows() - 1, 1).left)
00075 f++;
00076 if (rep(rep.getRows() - 1, 0).up == rep(rep.getRows() - 2, 0).down)
00077 f++;
00078
00079 if (rep(rep.getRows() - 1, rep.getCols() - 1).left == rep(rep.getRows() - 1, rep.getCols() - 2).right)
00080 f++;
00081 if (rep(rep.getRows() - 1, rep.getCols() - 1).up == rep(rep.getRows() - 2, rep.getCols() - 1).down)
00082 f++;
00083
00084 Move<RepEtII, MemEtII>& rev = apply(rep);
00085
00086 int f2 = 0;
00087
00088 if (rep(0, 0).right == rep(0, 1).left)
00089 f2++;
00090 if (rep(0, 0).down == rep(1, 0).up)
00091 f2++;
00092
00093 if (rep(0, rep.getCols() - 1).left == rep(0, rep.getCols() - 2).right)
00094 f2++;
00095 if (rep(0, rep.getCols() - 1).down == rep(1, rep.getCols() - 1).up)
00096 f2++;
00097
00098 if (rep(rep.getRows() - 1, 0).right == rep(rep.getRows() - 1, 1).left)
00099 f2++;
00100 if (rep(rep.getRows() - 1, 0).up == rep(rep.getRows() - 2, 0).down)
00101 f2++;
00102
00103 if (rep(rep.getRows() - 1, rep.getCols() - 1).left == rep(rep.getRows() - 1, rep.getCols() - 2).right)
00104 f2++;
00105 if (rep(rep.getRows() - 1, rep.getCols() - 1).up == rep(rep.getRows() - 2, rep.getCols() - 1).down)
00106 f2++;
00107
00108 mem += (f2 - f);
00109
00110 return rev;
00111 }
00112
00113 virtual bool operator==(const Move<RepEtII, MemEtII>& _m) const
00114 {
00115 const MoveSwapCorner& m = (const MoveSwapCorner&) _m;
00116 return (m.x1 == x1) && (m.y1 == y1) && (m.x2 == x2) && (m.y2 == y2);
00117 }
00118
00119 void print()
00120 {
00121 cout << "MoveSwapCorner: (" << x1 << "," << y1 << ") <=> (" << x2 << "," << y2 << ")" << endl;
00122 }
00123 };
00124
00125 class NSIteratorSwapCorner: public NSIterator<RepEtII, MemEtII>
00126 {
00127 private:
00128 int x1, y1, x2, y2;
00129 int nRows, nCols;
00130
00131 public:
00132 NSIteratorSwapCorner(int _nRows, int _nCols) :
00133 nRows(_nRows), nCols(_nCols)
00134 {
00135 }
00136
00137 virtual ~NSIteratorSwapCorner()
00138 {
00139 }
00140
00141 virtual void first()
00142 {
00143 x1 = 0;
00144 y1 = 0;
00145 x2 = 0;
00146 y2 = 1;
00147 }
00148
00149 virtual void next()
00150 {
00151 y2++;
00152 if (y2 > 1)
00153 {
00154 y2 = 0;
00155 x2++;
00156 if (x2 > 1)
00157 {
00158 y1++;
00159 if (y1 > 1)
00160 {
00161 y1 = 0;
00162 x1++;
00163
00164 x2 = x1;
00165 y2 = y1 + 1;
00166 if (y2 > 1)
00167 {
00168 y2 = 0;
00169 x2++;
00170 }
00171 }
00172 else
00173 {
00174 x2 = x1;
00175 y2 = y1 + 1;
00176 if (y2 > 1)
00177 {
00178 y2 = 0;
00179 x2++;
00180 }
00181 }
00182 }
00183 }
00184 }
00185
00186 virtual bool isDone()
00187 {
00188 return x2 > 1;
00189 }
00190
00191 virtual Move<RepEtII, MemEtII>& current()
00192 {
00193 return *new MoveSwapCorner(x1 * (nRows - 1), y1 * (nCols - 1), x2 * (nRows - 1), y2 * (nCols - 1));
00194 }
00195 };
00196
00197 class NSSeqSwapCorner: public NSSeq<RepEtII, MemEtII>
00198 {
00199 private:
00200 RandGen& rg;
00201
00202 public:
00203
00204 using NSSeq<RepEtII, MemEtII>::move;
00205
00206 NSSeqSwapCorner(RandGen& _rg):rg(_rg)
00207 {
00208 }
00209
00210 virtual ~NSSeqSwapCorner()
00211 {
00212 }
00213
00214 virtual Move<RepEtII, MemEtII>& move(const RepEtII& rep)
00215 {
00216 int x1 = (rg.rand(2)) * (rep.getRows() - 1);
00217 int y1 = (rg.rand(2)) * (rep.getCols() - 1);
00218
00219 int x2 = x1;
00220 int y2 = y1;
00221
00222 while ((x2 == x1) && (y2 == y1))
00223 {
00224 x2 = (rg.rand(2)) * (rep.getRows() - 1);
00225 y2 = (rg.rand(2)) * (rep.getCols() - 1);
00226 }
00227
00228 return *new MoveSwapCorner(x1, y1, x2, y2);
00229 }
00230
00231 virtual NSIterator<RepEtII, MemEtII>& getIterator(const RepEtII& rep)
00232 {
00233
00234 return *new NSIteratorSwapCorner(rep.getRows(), rep.getCols());
00235 }
00236
00237 virtual void print()
00238 {
00239 cout << "NSSeqSwapCorner" << endl;
00240 }
00241 };
00242
00243 #endif
00244