【问题标题】:How can the A* algorithm be applied to the traveling salesman problem? [duplicate]如何将 A* 算法应用于旅行商问题? [复制]
【发布时间】:2011-07-17 17:06:43
【问题描述】:

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

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

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

【问题讨论】:

  • 什么都没有。我不是想开发任何东西,只是想很好地理解 A* 是如何应用于实际问题的。
  • 您确定它是 A* 还是广义自适应 A*,我想可以使用与 larsmans 回答中描述的方法类似的方法来应用它。 (见aamas-conference.org/Proceedings/aamas08/proceedings/pdf/paper/…
  • @Spaceghost - 嗯? “在本文中,我们展示了如何做到这一点,从而产生广义自适应 A* (GAA*),它可以在状态空间中找到最短路径,其中动作成本会随着时间的推移而增加或减少。” - 这和这个问题有什么关系?
  • 对了,有人在重复问题中找到了解决方案:stackoverflow.com/a/10247947/852592
  • 我很确定这是一个重复的,所以正确地标记为这样。将链接发布到原始链接会很好,因为这是我的谷歌搜索的第一个结果......

标签: algorithm a-star traveling-salesman


【解决方案1】:

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,除了节点应该是真正的路径而不是城市集。有关启发式的提示,请参阅我的答案。
  • @larsmans - 我在这里不是 100% 确定,但我不同意。就像在常规最短路径中一样,无论我们访问 YZT 还是 TZY 等,我们如何到达节点 X 和 {节点 Y、Z 和 T} 都与路径的其余部分无关。我们会,但是,需要存储最大值来重建路径。动态规划方法也表明这是正确的,如果我们构造一个算法 TSP(node,visited) = min TSP(node2,visited+node) + cost(node,node2) 在所有未访问过的 node2 上并记忆它,我们有o(2^n) 而不是 N!
  • 是的,我认为你是对的。 (set,length) 组合可能是算法所需的全部,它会立即为您提供必要的对称性破坏。
  • 一种可能的启发式方法是最小生成树 (MST) 加上将 MST 连接到已固定段的最短边的长度。
  • 您实际上并不需要为每个步骤创建一个新图表。只是想知道每个节点的状态(已访问/未访问),以及您的最后一步是什么,这意味着对于每个状态,您至少需要 O(n) 个状态,(仍然不是微不足道的......)......跨度>
【解决方案2】:

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

TSP 问题指出,您希望在每个目的地仅访问一次时最小化旅行距离。 A* 算法需要一个启发式方法来指导它的最佳解决方案是一条直线的方式(您必须小心 A* 启发式方法,不要高估到目标的距离)。这不适用于 TSP 问题。

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • 但这与 Dijkstra 的算法有什么不同呢?没有启发式 A* 与 Dijkstra 算法没有什么不同。
    • 我确实发布了一个可能的启发式方法,或者至少是它的草图。使用近似值将 A* 算法引导到正确的方向是一种非常普遍的做法。
    • 也许我理解错了,但是这样的内存需求不是很大吗?
    • @larsmans - 你不是刚刚得到了可接受的启发式错误的定义吗?来自 Wikipedia 的“启发式方法是可以接受的,如果它从不高估实现目标的成本”。
    • 可接受的启发式方法是从添加到集合中的最后一个城市到尚未访问过的城市的最小距离。另一个(很容易预先计算)是从最后一个城市添加到任何其他城市的最小距离。
    【解决方案4】:

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

    是的,理论上可以将 TSP 问题转换为更大的图并在其上使用 A* 搜索。但遗憾的是它没有用,因为它不会扩展(请参阅 spin_plate 的评论)。即使是小型实例也可能需要数年时间才能在现代硬件上以这种方式解决。

    TSP 是 NP-complete,寻路不是。

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

    使用元启发式算法(tabu search、遗传算法、模拟退火等)。软件示例见Drools Planner, openTS, jgap, cpsolver, ...

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2018-03-26
      • 1970-01-01
      • 2022-06-28
      相关资源
      最近更新 更多