【问题标题】:A* search algorithm heuristic functionA* 搜索算法启发式函数
【发布时间】:2012-11-25 03:16:06
【问题描述】:

我正在尝试使用 A* 算法找到任意长度的滑块拼图的最佳解决方案。

滑块拼图是一种游戏,白色 (W) 和黑色 (B) 棋子排列在具有单个空白区域 (-) 的线性游戏板上。给定棋盘的初始状态,游戏的目的是将棋子排列成目标图案。

例如,我目前在板上的状态是 BBW-WWB,我必须达到 BBB-WWW 状态。 瓷砖可以通过以下方式移动: 1. 滑入相邻的空白空间,成本为 1。 2. 跳过另一块瓷砖进入空白区域,费用为 1。 3. 以 2 的成本跳过 2 个图块进入空白区域。

我已经实现了一切,但我不确定启发式函数。它计算当前状态下放错的瓷砖到目标状态下最近放置的相同颜色的瓷砖的最短距离(最小成本)。

考虑到当前状态 BWB-W 和目标状态 BB-WW 的给定问题,启发式函数给出的结果为 3。(根据最小距离:B=0 + W=2 + B=1 + W= 0)。但是达到目标的实际成本不是 3(移动错位的 W => 成本 1 然后错位的 B => 成本 1)而是 2。

我的问题是:我应该以这种方式计算最小距离并且不关心高估,还是应该将其除以 2?根据棋子的移动方式,一个棋子可以以相同的成本克服两倍(参见移动 1 和 2)。

我尝试了两个版本。虽然分割的距离为实现的目标提供了更好的最终路径成本,但它访问更多的节点 => 比未分割的节点花费更多的时间。计算它的正确方法是什么?我应该使用哪一个?

【问题讨论】:

    标签: artificial-intelligence a-star heuristics


    【解决方案1】:

    对我来说,这个问题的可接受启发式函数是什么样的并不明显,所以我不会承诺说,“使用除以二的函数。”但是我会告诉你,你想出的幼稚函数是不可接受的,因此不会给你带来好的性能。为了使 A* 正常工作,使用的启发式必须是可接受的;为了被接受,启发式必须绝对总是给出一个乐观的估计。这不是,正是您在示例中强调的原因。

    (虽然现在我想起来了,除以二似乎是一种合理的强制受理方式。我只是不打算承诺。)

    【讨论】:

    • 我愿意承诺除以 2。您能做的最好的事情就是以 1 个成本移动 2 个空间。因此,除以 2 为您提供了一个最佳情况,这是可接受且一致的。
    【解决方案2】:

    您的启发式方法不可接受,因此不能保证您的 A* 每次都能找到最佳答案。可接受的启发式算法绝不能高估成本。

    比将启发式成本除以 3 更好的启发式方法是:不是将每个字母的距离 D 添加到其最终位置,而是添加 ceil(D/2)。这样,一个字母 1 或 2 的距离,得到一个 1 的值,3 或 4 的距离,得到一个 2 的值,依此类推。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多