C++ TSP问题的动态求解方法
我很难理解为什么这个算法不能返回TSP的最短路径C++ TSP问题的动态求解方法,c++,algorithm,C++,Algorithm,我很难理解为什么这个算法不能返回TSP的最短路径 vector<int> tsp(int n, vector< vector<float> >& cost) { long nsub = 1 << n; vector< vector<float> > opt(nsub, vector<float>(n)); for (long s = 1; s < nsub; s += 2) f
vector<int> tsp(int n, vector< vector<float> >& cost)
{
long nsub = 1 << n;
vector< vector<float> > opt(nsub, vector<float>(n));
for (long s = 1; s < nsub; s += 2)
for (int i = 1; i < n; ++i) {
vector<int> subset;
for (int u = 0; u < n; ++u)
if (s & (1 << u))
subset.push_back(u);
if (subset.size() == 2)
opt[s][i] = cost[0][i];
else if (subset.size() > 2) {
float min_subpath = FLT_MAX;
long t = s & ~(1 << i);
for (vector<int>::iterator j = subset.begin(); j != subset.end(); ++j)
if (*j != i && opt[t][*j] + cost[*j][i] < min_subpath)
min_subpath = opt[t][*j] + cost[*j][i];
opt[s][i] = min_subpath;
}
}
vector<int> tour;
tour.push_back(0);
bool selected[n];
fill(selected, selected + n, false);
selected[0] = true;
long s = nsub - 1;
for (int i = 0; i < n - 1; ++i) {
int j = tour.back();
float min_subpath = FLT_MAX;
int best_k;
for (int k = 0; k < n; ++k)
if (!selected[k] && opt[s][k] + cost[k][j] < min_subpath) {
min_subpath = opt[s][k] + cost[k][j];
best_k = k;
}
tour.push_back(best_k);
selected[best_k] = true;
s -= 1 << best_k;
}
tour.push_back(0);
return tour;
}
向量tsp(整数n,向量&成本)
{
长nsub=1 opt(nsub,向量(n));
对于(长s=1;s 长t=s&~(1一件看起来很奇怪的事情是,主for循环做一些事情,即使i不是子集s的一部分
换句话说,opt[17][8]将被设置为cost[0][8]。opt[17][8]表示处于节点8并且访问了节点0和4的状态(因为5=2^0+2^4)
这应该被标记为不可能,因为如果我们在节点8,我们肯定已经访问了节点8
我建议通过改变以下方式来防止这些情况的发生:
for (int i = 1; i < n; ++i) {
vector<int> subset;
for(int i=1;i
到
for(int i=1;i if((s&(1)一件看起来很奇怪的事情是,主for循环做一些事情,即使i不是子集s的一部分
换句话说,opt[17][8]将被设置为cost[0][8]。opt[17][8]表示处于节点8并且访问了节点0和4的状态(因为5=2^0+2^4)
这应该被标记为不可能,因为如果我们在节点8,我们肯定已经访问了节点8
我建议通过改变以下方式来防止这些情况的发生:
for (int i = 1; i < n; ++i) {
vector<int> subset;
for(int i=1;i
到
for(int i=1;ifor(j=
迭代子集
中的所有节点,包括起始节点。这会导致使用未初始化的值opt[t][0]
,从而导致不正确的最佳路径长度计算
最简单的修复方法是将起始节点从子集中排除:
for (int u = 1; u < n; ++u)
...
if (subset.size() == 1)
...
else if (subset.size() > 1)
for(int u=1;u1)
嵌套循环for(j=
迭代子集
中的所有节点,包括起始节点。这会导致使用未初始化的值opt[t][0]
,从而导致不正确的最佳路径长度计算
最简单的修复方法是将起始节点从子集中排除:
for (int u = 1; u < n; ++u)
...
if (subset.size() == 1)
...
else if (subset.size() > 1)
for(int u=1;u1)
感谢您的深入了解,这很有帮助。但是,算法仍然不正确(通过此添加,实际上,路径与以前完全相同)。我仍在寻找我的错误,但它似乎不那么明显!您可以发表任何其他评论吗?感谢您的洞察力,这是很有帮助的。但是,算法仍然不正确(添加此项-事实上,路径与以前完全相同)。我仍在寻找我的错误,但它似乎并不明显存在!您还可以发表任何其他评论吗?如果您希望有人帮助查明确切的问题,您能否提供一个明显不符合此代码的测试用例?请您解释一下opt[I][j]
和cost[I][j]
contains?如果您希望有人帮助确定确切的问题,您能否提供一个明显不符合此代码的测试用例?您能否解释一下opt[i][j]
和cost[i][j]
包含哪些内容?