149 TSP::TSP(vector<Eigen::Vector2d> nodes, vector<vector<double>> weights){
155 graph =
new double*[n];
156 for (
int i = 0; i < n; i++) {
157 graph[i] =
new double[n];
158 for (
int j = 0; j < n; j++) graph[i][j] = 0;
161 cost =
new double*[n];
162 for (
int i = 0; i < n; i++) {
163 cost[i] =
new double[n];
166 path_vals =
new double*[n];
167 for (
int i = 0; i < n; i++) {
168 path_vals[i] =
new double[n];
172 adjlist =
new vector<int>[n];
175 for (
int i = 0; i < nodes.size(); i++)
177 struct City c = { nodes[i].
x(), nodes[i].y() };
182 for (
int i = 0; i < n; i++)
183 for (
int j = 0; j < n; j++)
184 graph[i][j] = weights[i][j];
192 inFname = in; outFname = out;
198 graph =
new double*[n];
199 for (
int i = 0; i < n; i++) {
200 graph[i] =
new double[n];
201 for (
int j = 0; j < n; j++) graph[i][j] = 0;
204 cost =
new double*[n];
205 for (
int i = 0; i < n; i++) {
206 cost[i] =
new double[n];
209 path_vals =
new double*[n];
210 for (
int i = 0; i < n; i++) {
211 path_vals[i] =
new double[n];
215 adjlist =
new vector<int> [n];
223 for (
int i = 0; i < n; i++) {
226 delete [] path_vals[i];
237 inStream.open(inFname.c_str(), ios::in);
240 cerr <<
"Can't open input file " << inFname << endl;
241 getchar(); getchar(); getchar();
245 while ( std::getline(inStream, unused) )
254 inStream.open(inFname.c_str(), ios::in);
256 cerr <<
"Can't open input file " << inFname << endl;
257 getchar(); getchar(); getchar();
263 while (!inStream.eof() ) {
264 inStream >> c >> x >> y;
266 struct City c = {x, y};
324 double **graph = tsp->
graph;
332 for (
int i = start; i <= end; i++) {
333 for (
int j = i; j < tsp->
n; j++) {
349 int amount = (n /
THREADS) * 0.2;
350 int x = (n /
THREADS) - amount;
355 for (
int i = 0; i < half; i++) {
361 int remainingThreads =
THREADS - half + 1;
362 int extraToEach = rem / remainingThreads;
364 for (
int i = half; i <
THREADS; i++) {
366 pos += (x + extraToEach - 1);
370 end_idx[THREADS-1] = n - 1;
372 int rc;
void *status;
376 pthread_t *thread =
new pthread_t[n];
380 pthread_attr_init(&attr);
381 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
383 for (
long t = 0; t <
THREADS; t++) {
387 rc = pthread_create(&thread[t], &attr,
F, (
void*)&data[t]);
389 printf(
"ERROR; return code from pthread_create() is %d\n", rc);
390 getchar(); getchar(); getchar();
396 pthread_attr_destroy(&attr);
397 for (
long t = 0; t <
THREADS; t++) {
398 rc = pthread_join(thread[t], &status);
400 printf(
"ERROR; return code from pthread_join() is %d\n", rc);
401 getchar(); getchar(); getchar();
415 double* key =
new double[n];
416 bool* in_mst =
new bool[n];
417 int* parent =
new int[n];
420 for (
int v = 0; v < n; v++) {
433 for (
int i = 0; i < n - 1; i++) {
436 int v = minKey(key, in_mst);
442 for (
int u = 0; u < n; u++) {
443 if (graph[v][u] && in_mst[u] ==
false && graph[v][u] < key[u]) {
448 key[u] = graph[v][u];
454 for (
int v1 = 0; v1 < n; v1++) {
458 adjlist[v1].push_back(v2);
459 adjlist[v2].push_back(v1);
472 double min = DBL_MAX;
474 for (
int v = 0; v < n; v++)
475 if (mstSet[v] ==
false && key[v] < min) {
488 for (
int r = 0; r < n; r++) {
490 if ((adjlist[r].size() % 2) != 0 ) {
503 std::vector<int>::iterator tmp, first;
509 while (!odds.empty()) {
510 first = odds.begin();
511 vector<int>::iterator it = odds.begin() + 1;
512 vector<int>::iterator end = odds.end();
515 for (; it != end; ++it) {
517 if (graph[*first][*it] < length) {
518 length = graph[*first][*it];
523 adjlist[*first].push_back(closest);
524 adjlist[closest].push_back(*first);
542 vector<int> *temp =
new vector<int> [n];
543 for (
int i = 0; i < n; i++) {
544 temp[i].resize(adjlist[i].size());
545 temp[i] = adjlist[i];
552 while (!stk.empty() || temp[pos].size() > 0 ) {
554 if (temp[pos].size() == 0) {
558 int last = stk.top();
567 int neighbor = temp[pos].back();
569 temp[pos].pop_back();
570 for (
unsigned int i = 0; i < temp[neighbor].size(); i++)
571 if (temp[neighbor][i] == pos) {
572 temp[neighbor].erase (temp[neighbor].begin() + i);
585 bool* visited =
new bool[n];
586 memset(visited, 0, n *
sizeof(
bool));
590 int root = path.front();
591 vector<int>::iterator curr = path.begin();
592 vector<int>::iterator next = path.begin()+1;
593 visited[root] =
true;
596 while ( next != path.end() ) {
598 if (!visited[*next]) {
599 path_dist += graph[*curr][*next];
601 visited[*curr] =
true;
604 next = path.erase(next);
609 path_dist += graph[*curr][*next];
624 make_hamilton(circuit, pathLength);
638 make_hamilton(path, length);
641 twoOpt(graph, path, length, n);
642 twoOpt(graph, path, length, n);
643 twoOpt(graph, path, length, n);
644 twoOpt(graph, path, length, n);
645 twoOpt(graph, path, length, n);
653 twoOpt(graph, circuit, pathLength, n);
662 ofstream outputStream;
663 outputStream.open(outFname.c_str(), ios::out);
664 outputStream << pathLength << endl;
665 for (vector<int>::iterator it = circuit.begin(); it != circuit.end(); ++it) {
667 outputStream << *it << endl;
670 outputStream.close();
673 ofstream ofs(
"data/OfflineOutput/tsp.m");
674 for (vector<int>::iterator it = circuit.begin(); it != circuit.end(); ++it) {
675 ofs <<
"plot([" << cities[*it].x <<
", " << cities[*it + 1].x <<
"], [" << cities[*it].y <<
", " << cities[*it + 1].y <<
"]); hold on;" << endl;
676 ofs <<
"text(" << cities[*it].x <<
", " << cities[*it].y <<
", '" << *it <<
"'); hold on;" << endl;
683 for (vector<int>::iterator it = circuit.begin(); it != circuit.end()-1; ++it) {
684 cout << *it <<
" to " << *(it+1) <<
" ";
685 cout << graph[*it][*(it+1)] << endl;
687 cout << *(circuit.end()-1) <<
" to " << circuit.front();
689 cout <<
"\nLength: " << pathLength << endl << endl;
693 for (vector<int>::iterator it = circuit.begin(); it != circuit.end(); ++it)
698 for (
int i = 0; i < n; i++) {
700 for (
int j = 0; j < (int)adjlist[i].size(); j++) {
701 cout << adjlist[i][j] <<
" ";
710 for (vector<City>::iterator it = cities.begin(); it != cities.end(); ++it)
711 cout << i++ <<
": " << it->x <<
" " << it->y << endl;
double twoOpt(double **graph, vector< int > &path, double &pathLength, int n)
double get_distance(struct City c1, struct City c2)
int minKey(double key[], bool mstSet[])
void fillMatrix_threads()
TSP(string in, string out)
void make_hamilton(vector< int > &, double &)
void euler(int pos, vector< int > &)
struct thread_data * data