【发布时间】:2014-08-06 19:48:44
【问题描述】:
最近我向question on Stack Overflow 寻求帮助以解决问题。这是一个旅行推销员问题,我有多达 40,000 个城市,但我只需要访问其中的 15 个。
有人指示我使用 Dijkstra 和优先队列来为我需要访问的 15 个城市制作连接矩阵,然后使用 DP 在该矩阵上执行 TSP。我以前只使用过带有 O(n^2) 的 Dijkstra。在试图弄清楚如何实现 Dijkstra 之后,我终于做到了(足以从 240 秒优化到 40,000 个城市的 0.6 秒)。但现在我被困在 TSP 部分。
以下是我学习 TSP 所用的资料:
我有点理解算法(但不完全),但我在实现它时遇到了麻烦。在此之前,我使用 dp[int] 或 dp[int][int] 的数组进行了动态编程。但是现在当我的 dp 矩阵必须是 dp[subset][int] 我不知道该怎么做。
我的问题是:
如何使用动态规划处理子集? (C++ 中的示例将不胜感激)- 我链接的算法是否允许多次访问城市,如果不允许,我应该更改什么?
- 我是否应该改用另一种 TSP 算法? (我注意到有几种方法可以做到这一点)。请记住,我必须得到准确的值,而不是近似值。
编辑:
经过更多研究,我偶然发现了斯坦福大学的一些竞争性编程竞赛讲座,并设法找到了 TSP here(幻灯片 26-30)。关键是将子集表示为位掩码。不过,这仍然让我的其他问题没有答案。
是否可以对该算法进行任何更改以允许多次访问一个城市。如果可以做到,这些变化是什么?不然怎么办?
【问题讨论】:
-
我不是很肯定,但我很确定你不能使用 Dijkstra 的算法来获得旅行商问题的精确解(除非你想要一个贪婪的近似值)。请记住,Dijkstra 是多项式的,您的答案需要是指数的。
-
@PatrickCollins 我没有使用 Dijkstra 来获得 TSP 的精确解决方案。我刚刚提到我使用 Dijkstra 来生成我将用于 TSP 的连接矩阵。我打算用动态编程来做TSP。请仔细阅读
-
啊,好吧,我误解了——我以为您希望使用 Dijkstra 算法作为 TSP 实现的一个步骤。 (如果您正在寻找贪婪的近似值,这将是要走的路)
-
听起来您需要访问 15 个 given 城市,但请说清楚。您当前所拥有的内容可以很容易地解释为“找出 15 个城市中 TSP 最短的子集”。
标签: c++ algorithm dynamic-programming traveling-salesman