我正在尝试使用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步)。
我试过两个版本。虽然划分的距离为实现的目标提供了更好的最终路径成本,但它访问更多节点=>花费的时间比没有分开的花费的时间多。计算它的正确方法是什么?我应该使用哪一个?
答案 0 :(得分:1)
对我来说,这个问题的可接受的启发函数是什么样子并不明显,所以我不会说“使用除以2的函数”。但我会告诉你,你提出的天真功能是不可接受的,因此不会给你带来好的表现。为了使A *正常工作,使用的启发式方法必须是可接受的;为了可以接受,启发式必须绝对总是给出乐观的估计。这个没有,因为你在你的例子中突出显示的原因。
(虽然现在我想到了,除以2似乎是一种强制接受的合理方式。我只是不会承诺。)
答案 1 :(得分:0)
您的启发式不可接受,因此您的A *无法保证每次都能找到最佳答案。允许的启发式方法绝不能高估成本。
比将启发式成本除以3更好的启发式方法是:不是将每个字母的距离D添加到其最终位置,而是添加ceil(D / 2)。这样,一个字母1或2,得到1值,3或4,得到2值,等等。