《15拼图》是模拟包含启发式算法的经典问题。该问题常用的启发式算法包括计算错误放置的方块数和查找每个方块与其在目标配置中的位置之间曼哈顿距离之和。请注意,这两种方法都是可接受的,即它们永远不会高估剩余移动次数,这确保了某些搜索算法(例如A*)的最优性。
- 您认为哪种启发式算法是合适的,
A*
似乎很好用,您有例子吗?也许是用c
或java
实现的示例?
《15拼图》是模拟包含启发式算法的经典问题。该问题常用的启发式算法包括计算错误放置的方块数和查找每个方块与其在目标配置中的位置之间曼哈顿距离之和。请注意,这两种方法都是可接受的,即它们永远不会高估剩余移动次数,这确保了某些搜索算法(例如A*)的最优性。
A*
似乎很好用,您有例子吗?也许是用c
或java
实现的示例?我的选择启发式算法是找出排列中所有逆序对的和是奇数还是偶数——如果是偶数,那么15Puzzle是可解的。
排列中逆序对的数量等于其逆置排列的数量(Skiena 1990年,第29页;Knuth 1998年)。
只有当我知道它是可解的时候,才有解决它的意义。因此,任务就是减少逆序对,问题就迎刃而解了。要找到一个解决方案,不应超过80步。
排列的公式为:
0到16的阶乘为{1、2、6、24、120、720、5040、40320、362880、3628800、39916800、479001600、6227020800、87178291200、1307674368000、20922789888000}。如果需要更多,请在WolframAlpha中搜索Range[1,20]!
如果您想了解更多信息,请阅读:15Puzzle。