我写了代码来解决TSP(旅行推销员问题)使用DP,但我不知道如何跟踪路径,给出解决方案。
这是代码:
static int tsp(std::vector<std::vector<int>> const& dist, size_t current, uint64_t mask, std::vector<std::vector<int>>& dp) {
if (mask == ((size_t)1 << dist.size()) - 1)
return dist[current][0];
if (dp[mask][current] != -1)
return dp[mask][current];
int result = INT_MAX;
for (uint64_t i = 0; i < dist.size(); ++i) {
uint64_t val = (uint64_t)1 << i;
if (mask & val)
continue;
int sub = dist[current][i] + tsp(dist, i, mask | val, dp);
result = std::min(result, sub);
}
dp[mask][current] = result;
return result;
}
int main()
{
std::vector<std::vector<int>> dist{
{0, 10, 41, 31},
{10, 0, 30, 19},
{41, 30, 0, 20},
{31, 19, 20, 0}
};
std::vector<std::vector<int>> dp(1 << dist.size(), std::vector<int>(dist.size(), -1));
std::cout << (tsp(dist, 0, 1, dp) == 90);
}
字符串
我试图通过std::vector<int>& path
作为tsp
参数和工作时,我有更好的结果比当前的i
节点path[i] = current
,但它不工作.我认为它不工作,因为最好的结果在某个时刻不是最好的整个解决方案(例如,整个解决方案可能会访问节点在不同的顺序,他们不能被重新访问).
你可能想知道这段代码是如何检查节点是否被访问的。我通过位掩码来完成,过程可能看起来像这样(对于4个节点A,B,C,D):
main
:
的
预期路径为:0-1-3-2-0
(成本等于90)
那么,在TSP问题中,如何跟踪给出最优解的路径呢?
1条答案
按热度按时间ppcbkaq51#
您可以添加一个参数(我们称之为
link
),用于收集给定掩码和节点的最佳邻居。因此它将具有与dp
相同的类型。然后在
tsp
运行之后,您可以使用此数据结构来重建路径。下面是你的代码和必要的补充:
字符串
请注意,您的代码假设0是起始节点(请参阅基本情况),因此我在
getpath
中使用了相同的假设。