Dijsktra算法应用于旅行商问题


13

我是新手(计算复杂度理论的新手),我有一个问题。

假设我们有“旅行推销员问题”,Dijkstra算法的以下应用程序能否解决?

从起点开始,我们计算两点之间的最短距离。我们到了重点。我们删除源点。然后我们计算距当前点的下一个最短距离点,依此类推...

在移动下一个可用的最短距离点时,每一步都会使图形变小。直到我们访问所有要点。

这将解决旅行商的问题。


3
请注意,TSP是NP完全的,并且Dijkstra的算法具有多项式运行时间。您建议的是P = NP的次要解决方案?问题,因此您的方法不太可能有效。注意,这种推理只是一种启发式!
拉斐尔

Answers:


24

Dijkstra的算法返回最短路径树,该树包含从起始顶点到彼此顶点的最短路径,但不一定包含其他顶点之间的最短路径,或访问所有顶点的最短路径。

这是一个反示例,其中您描述的贪婪算法无法正常工作:

反例

a[a,b,c,d,a]a[a,b,d,c,a]a,b,c,dd,a 返回起始城市。


8

正如在其他答复中已经证明的那样,您的建议不能有效解决旅行商问题,请允许我指出启发式搜索领域中已知的最佳方法(因为我看到Dijkstra的算法与人工智能领域有些相关) 。

(u,v)(v,u)

最佳方法(我知道)包括运行深度优先分支定界启发式搜索算法,其中启发式算法是最小生成树(MST)的成本。由于MST可以使用Prim算法Kruskal算法在多项式时间内进行计算,因此可以期望它在合理的时间内返回解。对于这两种算法的精彩讨论,我强烈建议您看一下《算法设计手册》。

事实上,让我强调一下,由于有人建议采用这种方法,因此在推导该问题的最佳界限方面,没有多少进展,因此我认为它是组合搜索领域的热门问题。

希望这可以帮助,


2

我不知道这里没有人会注意到在这种情况下完全不需要Dijkstra算法的应用吗?您可以通过简单地选择最近的节点来实现此贪婪算法,这就是已知的先验。Dijkstra的算法用于发现路径,但是每次只需要执行一个步骤。这显然没有找到TSP的最佳解决方案,但是许多非常好的方法也没有找到它。用于TSP的所有最佳解决方案查找器在计算方面都非常苛刻。


1

答案是否定的,这不是解决TSP问题的好方法。一个很好的计数器示例是所有点都在一条线上,如下所示:

--5 ------------------ 3 ----- 1--0 --- 2 ---------- 4

使用Dijsktra的算法,将使可怜的推销员从点0开始,首先是1,然后是2,然后是3等。这不是最佳的。

希望能有所帮助。看一看史蒂芬·S·斯基耶纳(Steven S. Skiena)出色著作《算法设计》的第一章,它更详细地解释了此示例。

TSP问题不是在两点之间找到最短的路径,而是要在所有最佳点之间建立路由。当您拥有最佳路线时,可以使用Dijsktra查找路线中每个点之间的最短路径。


2
Dijkstra是一种单源最短路径算法,但它不会“使”推销员从0开始,也不会返回路线。它仅返回最短路径树,其中包含从给定源顶点到每个顶点的最短路径。

传统上,TSP问题[ en.wikipedia.org/wiki/… ]是“给出一个城市及其成对距离的列表,任务是找到一条最短的路线,该路线只精确地访问每个城市一次并返回原城市。 ” 从技术上讲,不可能满足路径上的这些要求-您不得返回起始城市或重复城市。

但是,在一条道路上,如果我们放松这些约束中的任何一个,那么问题就变得微不足道了。

当然,Dijkstra不会使业务员从0开始。但是,原始问题中提出的算法没有指定起始顶点;因此,提出的算法可能会迫使可怜的推销员从0开始。因此,这个答案是正确的。
JeffE 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.