00001 #ifndef OPTFRAME_NSSEQROUTESWAP_HPP_
00002 #define OPTFRAME_NSSEQROUTESWAP_HPP_
00003
00004
00005 #include "../Move.hpp"
00006 #include "../NSEnum.hpp"
00007
00008 using namespace std;
00009
00010
00011
00012 template<class T, class M>
00013 class MoveVVSwapIntra : public Move<vector<vector<T> >, M>
00014 {
00015 private:
00016 int i,j,k;
00017
00018 public:
00019
00020 MoveVVSwapIntra(int i, int j, int k)
00021 {
00022 this->i=i;
00023 this->j=j;
00024 this->k=k;
00025 }
00026
00027 bool canBeApplied(vector<vector<T> >* rep)
00028 {
00029 return (rep->size()>0)&&(j != k);
00030 }
00031
00032 Move<vector<vector<T> >, M>* apply(vector<vector<T> >* rep)
00033 {
00034 T aux = (*rep)[i][j];
00035 (*rep)[i][j] = (*rep)[i][k];
00036 (*rep)[i][k] = aux;
00037
00038 return new MoveVVSwapIntra(i,k,j);
00039 }
00040
00041
00042 bool equals(Move<vector<vector<T> >, M>* m)
00043 {
00044 MoveVVSwapIntra* m1 = (MoveVVSwapIntra*)m;
00045
00046 return (m1->i==i) && ((m1->j==j && m1->k==k) || (m1->j==k && m1->k==j));
00047 }
00048
00049 void print()
00050 {
00051 cout << "MoveVVSwapIntra( " <<i<<" , ( "<<j<<" , "<<k<<" ) )" << endl;
00052 }
00053 };
00054
00055
00056
00057 template<class T, class M>
00058 class NSSeqVVSwapIntra: public NSSeq< vector<vector<T> > , M >
00059 {
00060 private:
00061 int m_i, m_j, m_k;
00062
00063 public:
00064
00065 NSSeqVVSwapIntra(){}
00066
00067 Move<vector<vector<T> > , M >* move(vector<vector<T> >* rep)
00068 {
00069 if(rep->size()==0)
00070 return new MoveVVSwapIntra<T,M>(0,0,0);
00071
00072 int i = rand()%rep->size();
00073
00074 int n = rep->at(i).size();
00075
00076 if(n==0)
00077 return new MoveVVSwapIntra<T,M>(i,0,0);
00078
00079 int j = rand()%n;
00080 int k = j;
00081
00082 if(n>1)
00083 while(k==j)
00084 k = rand()%n;
00085
00086 return new MoveVVSwapIntra<T,M>(i,j,k);
00087 }
00088
00089
00090 void init(vector<vector<T> >* rep)
00091 {
00092 m_i = 0;
00093 m_j = 0;
00094 m_k = 0;
00095 }
00096
00097 Move<vector<vector<T> > , M>* next(vector<vector<T> >* rep)
00098 {
00099 if(m_i >= rep->size())
00100 {
00101 cout << "Erro!!" << endl;
00102 exit(1);
00103 }
00104
00105 int n2 = rep->at(m_i).size();
00106
00107 if(m_k<n2-1)
00108 m_k++;
00109 else
00110 if(++m_j < n2-1)
00111 {
00112 m_k=m_j+1;
00113 }
00114 else
00115 {
00116 m_i++;
00117 m_j=0;
00118 m_k=0;
00119 }
00120
00121 return new MoveVVSwapIntra<T,M>(m_i,m_j,m_k);
00122 }
00123
00124 bool hasNext(vector<vector<T> >* rep)
00125 {
00126 int n1 = rep->size();
00127 int n2 = rep->at(m_i).size();
00128
00129 if((m_i>=n1-1) && (m_j>=n2-2) && (m_k>=n2-1))
00130 return false;
00131 else
00132 return true;
00133 }
00134
00135
00136 virtual void print()
00137 {
00138 cout << "NSSeqVVSwapIntra" << endl;
00139 }
00140
00141 };
00142
00143
00144 #endif