【问题标题】:Breaking A* admissibility caused exponential speed-up?打破 A* 可接纳性导致指数加速?
【发布时间】:2013-05-27 06:12:09
【问题描述】:

我一直在研究滑动瓷砖拼图的通用版本,其中瓷砖没有数字。相反,每个位置都有一个瓦片或一个洞,并用布尔值表示为真或假(瓦片或洞)。

搜索的重点是采用具有 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 秒。

编辑:事实证明,这种变化毕竟并不总是产生最佳解决方案。但是,我不明白为什么它的速度如此之快,或者为什么尽管不再被接受,但它仍然找到正确的(尽管不是最理想的)答案。

【问题讨论】:

    标签: a-star heuristics


    【解决方案1】:

    如果您破坏了可接纳性,A* 将不再正常工作。请注意,不再正常工作并不意味着您永远不会获得最佳结果 - 您只是不再保证获得最佳结果。您也可以在解决方案上更快地收敛,但如果该解决方案不是正确的解决方案,那又有什么意义呢?

    【讨论】:

    • 当您说不再正常工作时,您的意思是可能永远找不到解决方案或可能产生次优解决方案吗?该测试的最终目标是移动视觉元素而不会相互碰撞,如果问题只是次优解决方案,那么如果权衡速度,这对我来说可能没问题。
    • @asimes 我不是指次优的解决方案。我的意思是什么。您的启发式是不可接受的(即不是启发式),您最终会找到任何东西。 A* 应该总能找到解决方案,但是如果您的启发式方法不是启发式方法,那么您所做的就不是 A*。
    • 你的意思是乘法启发式是不可接受的,对吧?我知道一个不是,但我相当肯定原来的那个会产生最佳解决方案(尽管有时速度很慢)。
    • 是的,相乘的。你原来的那个对我来说看起来不错,虽然我没有费心去证明它。我想你已经这样做了。
    猜你喜欢
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多