如何将A *算法应用于旅行商问题?

时间:2011-03-17 20:16:36

标签: algorithm a-star traveling-salesman

  

可能重复:
  Using A* to solve Travelling Salesman Problem

我最近了解到 A * 算法可以应用于旅行商问题。我们如何确定这里的起点和目标,以及如何将权重应用于节点(什么是启发式)?

有人会向我解释如何在这里应用A *吗?

4 个答案:

答案 0 :(得分:10)

A *是Dijsktra的衍生物,我认为不能以这种方式使用。首先,TSP通常从任何节点开始。更重要的是,这些算法试图找到两点之间的最短路径,而不管访问的节点数量。实际上,它们依赖于这样一个事实,即从S到T经由某个节点A的最短路径,从S到A的路径是无关紧要的,如果它是相同的成本。

我看到这种功能的唯一方法是生成一个代表访问过的节点的新图。例如,在优先级队列中,您将放置访问的节点集和当前节点。这将导致可能检查$ n2 ^ n $个节点(这不是动态编程解决方案对TSP http://www8.cs.umu.se/kurser/TDBAfl/VT06/algorithms/BOOK/BOOK2/NODE49.HTM的运行时间)。到目前为止,并不是很好,但通过使用A *而不是Dijsktra,您可能能够找到在合理的时间内运行的启发式算法。

要实现这一点,您的起始节点将是(1,{}),结束节点将是(1,{1..n})。您将模仿原始图形的边缘权重。关于启发式的建议,你可以自己做..

答案 1 :(得分:8)

这里可以应用A *,虽然它可能不是最好的算法。

你必须离开它们之间的城市和道路图。相反,定义一个有向图,其中部分路径是节点,如果 y 可以从构造,则连接两个节点 x y x 通过在原始城市图表中添加单个“步骤”。起始节点是空路径。目标节点是访问所有城市的路径。 (此路径的最优性由启发式和A *算法本身的属性保证。)

[编辑:起初我认为路径应该是一个有序的城市列表,但我现在相信@ spinning_plate建议用一对(长度,一组城市)来表示路径就足够了]

路径成本是行进的总距离。启发式算法必须是总最小旅行长度的可接受的估计值(通常是低估的)。

这种估计的一个很好的候选者可能是TSP的快速近似(松弛问题的解决方案)。您将在尚未覆盖的城市集上为每个节点(部分路径)运行近似算法。这为算法提供了销售员仍需要去的距离的必要上限。

答案 2 :(得分:3)

  

如果我有一把锤子( A * search ),那么每个问题( TSP )都是钉子(寻路)。

是的,从理论上讲,可以将TSP问题转换为更大的图形并在其上使用 A * search 。但令人遗憾的是它没用,因为它无法扩展(参见spinning_plate的评论)。即使很小的实例也可能需要数年才能在现代硬件上解决这个问题。

TSP为NP-complete,寻路不是。

  

如果是螺丝( NP完整问题),请使用螺丝刀( metaheurstics,...... )。

使用metaheuristics(tabu search,遗传算法,模拟退火等)等算法。有关软件示例,请参阅Drools Planner,openTS,jgap,cpsolver,...

答案 3 :(得分:0)

A *是Dijkstra算法的扩展,其中考虑了遍历方向图的最优解。我不确定这是否适用于TSP问题。

TSP问题表明您希望在访问每个目的地时最小化行驶距离一次。 A *算法需要一种启发式方法来指导最佳解决方案被称为直线的方式(您必须小心A *启发式,以免过高估计与目标的距离)。该剂量不适用于TSP问题。

question还包含有关A *算法和TSP问题的信息。