Djinni  2.2
TSPTWWorld.h
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