【问题标题】:How to tell when the A* algorithm is a good option, and how to choose a good heuristic?如何判断 A* 算法何时是一个好的选择,以及如何选择一个好的启发式?
【发布时间】:2015-07-20 15:09:44
【问题描述】:

最近,我使用 A* 算法为著名的“15 谜题”编写了一个求解器,该算法使用了一个启发式函数,该函数基于每个图块到其目的地点的曼哈顿距离之和。

这让我想知道两件事:

  1. 您如何知道何时可以使用 A* 算法?除非我遇到在线教程,否则我永远不会想到 15 谜题可以这样解决。

  2. 您如何知道要使用哪个启发式函数?起初,对于 15 块拼图,我考虑了一个简单的“未定位的瓷砖总和”启发式方法。因此,如果所有棋子都没有在正确的位置,则 15 谜题的启发式可能会返回 15,而 0 表示已解决的棋盘。但不知何故,距离的总和更好。一个人怎么知道,进入它?

【问题讨论】:

  • 对我来说这看起来在 Math.se 上会更好。
  • 它可能更适合Computer Science。不过Mathematics是个不错的选择。
  • “但不知何故,距离的总和更好”——这很容易看出,因为您可以看到,对于每个单独的图块,Manhattan-distance-to-home 值始终是 至少和其他启发式一样高。如果瓷砖是家,两个启发式都给出 0;如果不是,is-displaced 给出 1,而Manhattan-distance-to-home 给出至少 1。对所有图块求和,MDTH 总和中的每个项至少与 ID 一样高,所以最后的总和也是。
  • 没有一种机械的、系统的方法可以为 A* 找到一个好的启发式方法。实际上,您所要做的就是(正如哈罗德所说)解决原始问题的松弛(即相同的问题但删除了一些约束)将为您提供有效的下限的知识。但是有无数种方法可以缓解问题,但只有其中一些(或有时没有!)同时(1)在计算上可行并且(2)通常在实践中提供良好的界限。

标签: algorithm a-star heuristics


【解决方案1】:

如果您正在探索图表以找到某种方式“最短”的路径(成本不必是“距离”,但它必须是单调的),您已经可以使用 Dijkstra 的了。乍一看,您的问题通常看起来不像寻路,因为您不打算“穿越路线”。比这更抽象。

如果你可以使用 Dijkstra 并且你有一些可接受的启发式(这是困难的部分),你可以使用 A*。

寻找启发式的常用技术是放弃对问题的一些约束。例如,如果您可以将每个图块传送到其目的地,而不管那里是否已经存在图块,则它将需要#displacements 传送。所以有第一个启发式。如果您必须滑动瓷砖但它们可以相互滑动,则每个瓷砖的成本是曼哈顿到其目的地的距离。然后你可以看看改进启发式,例如曼哈顿距离启发式显然忽略了瓷砖在移动时会相互干扰,但是有一个简单的情况,我们知道瓷砖必须在哪里发生冲突并使用更多的移动:考虑两个瓷砖(假装没有其他瓷砖)在同一行,他们的目的地也在该行,但为了到达那里,他们必须互相穿过。他们必须互相绕行,增加两个垂直移动。这给出了线性冲突启发式。甚至可以考虑更多的干扰,例如模式数据库。

【讨论】:

  • 另外,您必须小心,您的启发式算法不会计算任何移动两次或更多次。例如。使用您建议的“线性冲突”启发式方法,这可能是这两个垂直移动还可以同时交换相邻行上的某些对 - 如果是这样,您将只被允许计算 one 行的这 2 个垂直移动。或者您可以证明“固定”每一行仍然需要 2 次垂直移动无论来自相邻行的干扰——但这并不明显,因此需要证明。
  • @j_random_hacker 证明在“通过批评松弛模型的解决方案生成可接受的启发式”中给出
  • 这似乎是 Hansson、Mayer 和 Yung 于 1985 年发表的一篇论文(技术报告?)。看起来很有趣!
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 2020-04-13
  • 2020-12-28
  • 1970-01-01
  • 2012-04-12
  • 2013-05-20
  • 1970-01-01
相关资源
最近更新 更多