我一直在研究滑动拼图拼图的通用版本,其中拼贴没有数字。相反,每个位置都有一个平铺或一个洞,并用布尔值表示为true或false(tile或hole)。
搜索的目的是采用具有n个图块的初始状态和具有n个目标位置的目标状态,并使用A *来找到如何移动图块以便填充每个目标位置的解决方案。以下是4x3网格的示例:
Initial State:
T F T F
F F T F
F F T T
Goal State
T T T T
T F F F
F F F F
我一直致力于不同的启发式方法来做到这一点,最成功的逻辑就是这样:
int heuristicVal = 0
for every tile (i)...
int closest = infinity
for every goal location (j)...
if (manhattan distance of ij < closest) closest = manhattan distance of ij
end for
heuristicVal += closest
end for
return heuristicVal
不幸的是,在两个或多个图块被启发式引导到同一目标位置的情况下,这仍然太慢。我尝试将heuristicVal
乘以瓷砖的数量,然后突然出现指数加速。在28秒之前出现的问题花了不到1秒钟。
编辑:事实证明,这种变化并不总能产生最佳解决方案。但是,我不明白为什么它加速了这么多,或者为什么它仍然找到了正确的(虽然不是最理想的)答案,尽管不再被允许。
答案 0 :(得分:1)
如果您破坏了可接纳性,A *将无法正常工作。请注意不再正常并不意味着你永远不会得到最佳结果 - 你不再保证得到一个。您最终还是可以更快地在解决方案上融合,但如果该解决方案不正确,那又有什么意义呢?