【问题标题】:Heuristics for the Asymmetric Traveling Salesman非对称旅行推销员的启发式
【发布时间】:2026-02-02 01:00:01
【问题描述】:

我正在使用 A* 来解决不对称旅行推销员问题。 我的状态表示有 4 个变量:

1 - 访问过的城市(列表)

2 - 未访问的城市(列表)

3 - 当前城市(整数)

4 - 当前成本(整数)

但是,即使我找到了许多路径构造算法,例如最近邻、k-opt 等,我也找不到适合 A* 的启发式算法,即采用状态的 ah(n) 函数作为输入并返回与该状态的质量相对应的整数。

所以我的问题是,有这样的启发式方法吗?有什么建议吗?

提前致谢

【问题讨论】:

    标签: algorithm artificial-intelligence a-star heuristics traveling-salesman


    【解决方案1】:

    包含所有未访问顶点和当前顶点的子图的最小生成树的权重是完成当前路径的成本的下限。它可以与 A* 算法一起使用,因为它不能高估剩余距离(否则,剩余路径的权重小于最小生成树的权重,并且跨越给定的顶点,这是矛盾的)。

    虽然我从未尝试过,所以我不知道它在实践中的效果如何。

    【讨论】:

    • 但是,我们可以创建一个具有非对称 TSP 的最小生成树吗?
    • @LuísPedroBorges 无论如何,这是一个下限。图是有向的这一事实只会增加答案。
    【解决方案2】:

    总是有:h(n) = 0 总是有效的。没用,把A*变成Dijkstra,但绝对可以接受。

    另一个明显的:让h(n)成为从当前城市回到起点的最短边。仍然是一个巨大的低估,但至少它不一定是零。这显然是有效的,最终必须关闭循环,并且(鉴于此部分路线)没有更短的方法可以做到这一点。

    你可以在这里更聪明一点,例如你可以使用线性规划(为每个边创建两个变量,每个方向一个,然后为每个城市创建一个约束,强制输入边的总和为 1 和约束迫使退出边的总和为一,权重显然是距离)找到从当前节点回到起点的长度的低估,同时触及未访问城市集中的每个城市。当然,如果您这样做,您不妨放弃 A* 并使用通常的整数线性规划技巧。 A* 在这里似乎不太合适(尤其是在开始时,分支因子太高,启发式还不足以指导它),但我还没有尝试过,谁知道呢。

    此外,鉴于 LP 提供的解决方案,您可以通过使用一些简单的技巧(以及整本书都写过的一些高级技巧,但我们不要去那里,如果您想了解,请阅读书籍) )。例如,LP 喜欢做的一件事是形成许多小三角形。这将在本地满足度数限制,并保持一切美好而简短。但这不是一次旅行,强迫它更像是一次旅行将使启发式更高=更好。要删除子游览,您可以在分数解决方案中检测它们,然后强制子图中的条目数至少为 1(它可能在某些时候必须超过 1,所以不要强制它正好是 1) 并通过添加相应的约束并再次求解来强制退出的数量至少为 1。还有更多技巧,但这应该已经给出了一个非常合理的启发式方法,比使用任何 over 估计启发式方法并将它们除以最坏情况的高估因子更接近实际成本。问题在于,启发式通常非常好,比他们的最坏情况因子要好得多,然后除以最坏情况因子真的会扼杀启发式的质量。

    【讨论】:

    • 感谢您的提示!
    最近更新 更多