C++中TSP的动态编程解决方案

Dynamic Programming Solution for TSP in C++

本文关键字:编程 解决方案 动态 TSP C++      更新时间:2023-10-16

我一直在尝试在C++中为 TSP(旅行销售员问题(实现动态规划解决方案。我的代码可以编译,但是当我尝试运行目标文件时,程序停止工作,我被迫关闭它。

这是代码:

int tsp(std::vector<std::vector<int>> matrix) {
   int n = matrix[0].size();
   std::vector<std::vector<int>> A;  // Vertex, Set-Size
   std::set<int> S;
   for(int i = 0; i < n; ++i) {
       S.insert(i);
   }
   for(int i = 0; i < n; i++) {
       if(S.size() == 2) {
           A[i][2] = matrix[1][i];
       }
       else if(S.size() > 2) {
           std::set<int>::iterator it;
           for(it = S.begin(); it != S.end(); ++it) {
               int s = S.size();
               S.erase(i);
               int sd = S.size();
               int k = *it;
               if((k != i) && (k != 1) && (A[i][s] > (matrix[k][i] + A[k][sd]))) {
                   A[i][s] = matrix[k][i] + A[k][sd];
               }
           }
       }
   }
   return A[1][n];
}

有人可以指出我犯了什么错误吗?

在调用std::vector之前,您需要填充operator[int]或调整其大小。向量基本上是一个保持其大小的数组。因此,任何越界访问都会导致运行时出现分段错误(如果幸运的话(或损坏您的内存。

这里有一个向量向量

,因此您需要遍历两个范围并正确填充(或调整(向量:

std::vector<std::vector<int>> A;  // Vertex, Set-Size
for(int i=size; i>0; --i)
   A.push_back(std::vector<int>);
for(int i=size; i>0; --i)
   for(int j=size; j>0; --j)
     A[i][j] = 0;

甚至更好:

A.resize(size);
for(auto& v : a)        // (since you already have c++11)
  v.resize(size, val);  // fill with val