Djinni
2.2
|
00001 #ifndef TSPTWWORLD_H 00002 #define TSPTWWORLD_H 00003 00004 #include <iostream> 00005 #include <string> 00006 #include <vector> 00007 #include <cmath> 00008 #include <sys/types.h> 00009 00012 00021 template <typename T, const int N> 00022 class Matrix 00023 { 00024 public: 00025 typedef T value_type; 00026 Matrix() { } 00027 Matrix(std::vector<Matrix<T, N-1> > matrix) : _matrix(matrix) {} 00028 #ifdef USE_BOUNDS_CHECKING 00029 const Matrix<T, N-1>& operator[](const u_int32_t n) const { return _matrix.at(n);} 00030 Matrix<T, N-1>& operator[](const u_int32_t n) { return _matrix.at(n); } 00031 #else 00032 const Matrix<T, N-1>& operator[](const u_int32_t n) const { return _matrix[n]; } 00033 Matrix<T, N-1>& operator[](const u_int32_t n) { return _matrix[n]; } 00034 #endif 00035 u_int32_t dimensions() const { return Matrix<T,N>::DIMENSIONS; } 00036 void reset() 00037 { 00038 for (u_int32_t i = 0 ; i < _matrix.size() ; i += 1) _matrix[i].reset(); 00039 } 00040 u_int32_t size() const { return _matrix.size(); } 00041 void push_back(Matrix<T,N-1> matrix) { _matrix.push_back(matrix); } 00042 void resize(const u_int32_t n) { _matrix.resize(n, Matrix<T,N-1>()); } 00043 00044 protected: 00045 static const u_int32_t DIMENSIONS = N; 00046 std::vector<Matrix<T, N-1> > _matrix; 00047 }; 00048 00049 00051 00060 template <typename T> 00061 class Matrix<T, 1> 00062 { 00063 public: 00064 typedef T value_type; 00065 Matrix() : _matrix() { } 00066 Matrix(std::vector<T> vec) : _matrix(vec) {} 00067 #ifdef USE_BOUNDS_CHECKING 00068 const T& operator[](const u_int32_t n) const { return _matrix.at(n); } 00069 T& operator[](const u_int32_t n) { return _matrix.at(n); } 00070 #else 00071 const T& operator[](const u_int32_t n) const { return _matrix[n]; } 00072 T& operator[](const u_int32_t n) { return _matrix[n]; } 00073 #endif 00074 u_int32_t dimensions() const { return Matrix<T,1>::DIMENSIONS; } 00075 void reset() { _matrix.clear(); } 00076 u_int32_t size() const { return _matrix.size(); } 00077 void push_back(std::vector<T> vec) { _matrix.push_back(vec); } 00078 void resize(const u_int32_t n) { _matrix.resize(n, T()); } 00079 protected: 00080 std::vector<T> _matrix; 00081 static const u_int32_t DIMENSIONS = 1; 00082 }; 00083 00084 00086 00090 class TSPTWWorld 00091 { 00092 public: 00093 TSPTWWorld(const std::string& filename); 00094 TSPTWWorld(const char* filename); 00095 virtual ~TSPTWWorld() {} 00096 00097 const Matrix<double, 2>& travelTimes() const 00098 { return _timeMatrix; } 00099 const std::vector<double>& lowDeadlines() const 00100 { return _lowdeadlines; } 00101 const std::vector<double>& deadlines() const 00102 { return _deadlines; } 00103 00105 const Matrix<double, 2>& data() const 00106 { return _matrix; } 00107 00109 Matrix<double, 2>& data() 00110 { return _matrix; } 00111 00113 const std::string& identifier() const 00114 { return _identifier; } 00115 00116 protected: 00117 Matrix<double, 2> _timeMatrix; 00118 Matrix<double, 2> _matrix; 00119 std::vector<double> _lowdeadlines, _deadlines; 00120 std::string _identifier; 00121 00122 virtual void computeTravelTimes() 00123 { 00124 u_int32_t numCustomers = _matrix.size(); 00125 _timeMatrix.resize(numCustomers); 00126 for (u_int32_t i = 0; i <= numCustomers - 1; i++) 00127 { 00128 _timeMatrix[i].resize(numCustomers); 00129 for (u_int32_t j = 0; j <= numCustomers - 1; j++) 00130 { 00131 _timeMatrix[i][j] = 00132 ::sqrt((_matrix[i][0] - _matrix[j][0])*(_matrix[i][0] - 00133 _matrix[j][0]) + (_matrix[i][1] - _matrix[j][1]) * 00134 (_matrix[i][1] - _matrix[j][1])); 00135 _timeMatrix[i][j] = ::floor(_timeMatrix[i][j]); 00136 } 00137 } 00138 for (u_int32_t i = 0 ; i <= numCustomers - 1 ; i++) 00139 for (u_int32_t j = 0 ; j <= numCustomers - 1 ; j++) 00140 for (u_int32_t k = 0 ; k <= numCustomers - 1 ; k++) 00141 if (_timeMatrix[i][j] > 00142 (_timeMatrix[i][k] + _timeMatrix[k][j])) 00143 _timeMatrix[i][j] = 00144 _timeMatrix[i][k] + _timeMatrix[k][j]; 00145 _lowdeadlines.resize(numCustomers); 00146 _deadlines.resize(numCustomers); 00147 for(u_int32_t i = 0; i <= numCustomers - 1; i++) 00148 { 00149 #ifdef USE_BOUNDS_CHECKING 00150 _lowdeadlines.at(i) = _matrix[i][3]; 00151 _deadlines.at(i) = _matrix[i][4]; 00152 #else 00153 _lowdeadlines[i] = _matrix[i][3]; 00154 _deadlines[i] = _matrix[i][4]; 00155 #endif 00156 } 00157 } 00158 }; 00159 00160 std::ostream& operator<<(std::ostream& os, const TSPTWWorld& w); 00161 00162 #endif 00163