【发布时间】:2015-07-20 15:09:44
【问题描述】:
最近,我使用 A* 算法为著名的“15 谜题”编写了一个求解器,该算法使用了一个启发式函数,该函数基于每个图块到其目的地点的曼哈顿距离之和。
这让我想知道两件事:
您如何知道何时可以使用 A* 算法?除非我遇到在线教程,否则我永远不会想到 15 谜题可以这样解决。
您如何知道要使用哪个启发式函数?起初,对于 15 块拼图,我考虑了一个简单的“未定位的瓷砖总和”启发式方法。因此,如果所有棋子都没有在正确的位置,则 15 谜题的启发式可能会返回 15,而 0 表示已解决的棋盘。但不知何故,距离的总和更好。一个人怎么知道,进入它?
【问题讨论】:
-
对我来说这看起来在 Math.se 上会更好。
-
它可能更适合Computer Science。不过Mathematics是个不错的选择。
-
“但不知何故,距离的总和更好”——这很容易看出,因为您可以看到,对于每个单独的图块,Manhattan-distance-to-home 值始终是 至少和其他启发式一样高。如果瓷砖是家,两个启发式都给出 0;如果不是,is-displaced 给出 1,而Manhattan-distance-to-home 给出至少 1。对所有图块求和,MDTH 总和中的每个项至少与 ID 一样高,所以最后的总和也是。
-
没有一种机械的、系统的方法可以为 A* 找到一个好的启发式方法。实际上,您所要做的就是(正如哈罗德所说)解决原始问题的松弛(即相同的问题但删除了一些约束)将为您提供有效的下限的知识。但是有无数种方法可以缓解问题,但只有其中一些(或有时没有!)同时(1)在计算上可行并且(2)通常在实践中提供良好的界限。
标签: algorithm a-star heuristics