最近我问了一个 question on Stack Overflow 寻求帮助解决一个问题。这是一个旅行商问题,我有多达 40,000 个城市,但我只需要访问其中的 15 个。
有人指出我使用带有优先级队列的 Dijkstra 为我需要访问的 15 个城市制作连接矩阵,然后使用 DP 在该矩阵上执行 TSP。我之前只使用了 O(n^2) 的 Dijkstra。在试图弄清楚如何实现 Dijkstra 之后,我终于做到了(足以将 40,000 个城市的 240 秒优化到 0.6)。但现在我被困在 TSP 部分。
以下是我用于学习 TSP 的 Material :
我有点理解算法(但不完全),但我在实现它时遇到了麻烦。在此之前,我已经对 dp[int] 或 dp[int][int] 数组进行了动态编程。但是现在当我的 dp 矩阵必须是 dp[subset][int] 时,我不知道该怎么做。
我的问题是:
编辑:
经过更多研究,我偶然发现了斯坦福大学的一些竞争性编程竞赛讲座,并设法找到了 TSP here(幻灯片 26-30)。关键是将子集表示为位掩码。尽管如此,这仍然使我的其他问题没有得到解答。
是否可以对该算法进行任何更改以允许多次访问一个城市。如果可以做到,这些变化是什么?否则,我应该尝试什么?
最佳答案
我认为您可以使用动态解决方案并向每对节点添加具有最短路径的第二条边。另见这个问题: Variation of TSP which visits multiple cities 。