如何判断A *算法何时是一个不错的选择,以及如何选择一个好的启发式算法?

时间:2015-07-20 15:09:44

标签: algorithm a-star heuristics

最近我为着名的" 15拼图"写了一个解算器。使用A *算法,使用基于曼哈顿距离的总和,每个瓦片到目的地点的距离总和。

这让我想到了两件事:

  1. 你怎么知道A *算法何时使用?除非我遇到在线教程,否则我绝不会猜到15拼图可以通过这种方式解决。

  2. 您如何知道使用哪种启发式功能?首先,对于15拼图,我考虑了一个简单的"瓦片的总和不在位置"启发式。因此,如果所有部分都没有位于正确的位置,那么15个拼图的启发式可能会返回15,而0则表示已解决的板。但不知何故,距离的总和更好。如何知道,进入它?

1 个答案:

答案 0 :(得分:2)

如果您正在探索图表以找到某种方式的路径"最短的" (成本不必是"距离",但它必须是单调的),你已经可以使用Dijkstra了。你的问题通常看起来就像乍一看路径一样,但是,你并没有计划在路线上旅行"。它比那更抽象。

然后,如果您可以使用Dijkstra ,您可以使用一些可接受的启发式(这是困难的部分),您可以使用A *。

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