Djinni
2.2
|
00001 #include "TSPTWWorld.h" 00002 #include <iostream> 00003 #include <sstream> 00004 #include <fstream> 00005 00006 using std::istream; 00007 using std::ostream; 00008 using std::getline; 00009 using std::string; 00010 using std::stringstream; 00011 using std::vector; 00012 using std::ifstream; 00013 using std::endl; 00014 using std::cerr; 00015 using std::cout; 00016 using std::back_inserter; 00017 using std::copy; 00018 00019 namespace { 00020 void consume_lines(istream& is, int lines) 00021 { 00022 string discard; 00023 while (lines--) 00024 getline(is, discard); 00025 } 00026 00027 void loadDumas(istream& is, TSPTWWorld& tsp) 00028 { 00029 string line; 00030 00031 consume_lines(is, 5); 00032 while (is) { 00033 double row[6] = { 0, 0, 0, 0, 0, 0 }; 00034 int discard; 00035 stringstream ss; 00036 getline(is, line); 00037 ss << line; 00038 ss >> discard; 00039 if (999 == discard) 00040 break; 00041 ss >> row[0] >> row[1] >> row[2] >> row[3] 00042 >> row[4] >> row[5]; 00043 vector<double> Row(row, row + 6); 00044 tsp.data().push_back(Matrix<double, 1>(Row)); 00045 } 00046 } 00047 00048 void loadSolomon(istream& is, TSPTWWorld& tsp) 00049 { 00050 string line; 00051 00052 consume_lines(is, 6); 00053 int custNum = 0; 00054 while (is) { 00055 double row[6] = { 0, 0, 0, 0, 0, 0 }; 00056 int discard; 00057 stringstream ss; 00058 getline(is, line); 00059 if (line == "") 00060 break; 00061 ss << line; 00062 ss >> discard; 00063 if (discard < custNum++) 00064 break; 00065 ss >> row[0] >> row[1] >> row[2] 00066 >> row[3] >> row[4] >> row[5]; 00067 vector<double> Row(row, row + 6); 00068 tsp.data().push_back(Matrix<double, 1>(Row)); 00069 } 00070 } 00071 } 00072 00073 TSPTWWorld::TSPTWWorld(const char* filename) 00074 { 00075 ifstream in(filename); 00076 string line; 00077 00078 data().reset(); 00079 00080 getline(in, line); 00081 getline(in, line); 00082 getline(in, line); 00083 if (line.substr(0, 2) == "!!") { 00084 loadDumas(in, *this); 00085 computeTravelTimes(); 00086 } 00087 else if (line.substr(0, 7) == "VEHICLE") { 00088 loadSolomon(in, *this); 00089 computeTravelTimes(); 00090 } 00091 } 00092 00093 TSPTWWorld::TSPTWWorld(const std::string& filename) 00094 { 00095 ifstream in(filename.c_str()); 00096 string line; 00097 00098 data().reset(); 00099 00100 getline(in, line); 00101 getline(in, line); 00102 getline(in, line); 00103 if (line.substr(0, 2) == "!!") { 00104 loadDumas(in, *this); 00105 computeTravelTimes(); 00106 } 00107 else if (line.substr(0, 7) == "VEHICLE") { 00108 loadSolomon(in, *this); 00109 computeTravelTimes(); 00110 } 00111 } 00112 00113 ostream& operator<<(ostream& os, const TSPTWWorld& w) 00114 { 00115 for (unsigned int i = 0 ; i < w.data().size() ; i++) 00116 { 00117 for (unsigned j = 0 ; j < w.data()[i].size() ; j++) 00118 os << w.data()[i][j] << "\t"; 00119 os << "\n"; 00120 } 00121 return os; 00122 } 00123