BFS使用什么样的启发式方法来解决这个“游戏”(查找路径)?

时间:2014-05-05 21:18:20

标签: graph-algorithm path-finding heuristics

我想解决一场游戏'。 我有5个圆圈,我们可以将圆圈旋转到左边或右边(90度)。

示例:

enter image description here

enter image description here

目标:1,2,3,......,14,15,16 防爆。起始情况:16,15,14,...,3,2,1

我使用BFS查找路径,但我无法发明启发式功能(我的每个解决方案都不好)。我正在尝试曼哈顿距离和其他人...(也许想法很好,但我的解决方案有问题)。请帮忙!

3 个答案:

答案 0 :(得分:1)

您可能尝试的一个技巧是从目标状态向后进行广度优先搜索。及早停止。然后,一旦您遇到向后搜索所见的状态,您就可以终止(从初始状态向前)搜索。

曼哈顿从棋子到目标的距离总和是前向A *搜索的合适基线启发式算法。你可以通过将1-8到达他们的位置所需的转弯数加到9-16进入他们的位置所需的转弯次数来做得更好;这些状态空间中的每一个都足够小(大约五亿个状态左右)来预先计算。

答案 1 :(得分:1)

一个简单的保守(可接受)启发式方法是:

  1. 对于每个数字1< = i< = 16,找到将我放回正确位置所需的最小转数(忽略所有其他数字)
  2. 取所有这些最小值的最大值。
  3. 这等于报告定位最差"所需的最小转数。数字正确,因此永远不会高估所需的移动次数(因为同时修复所有数字和位置至少需要修复其中任何一个移动的数量)。

    但是,它可能会低估长途所需的移动次数。通过计算,对于每个数字1< = i< = 16并且对于每个车轮1< = j< = 5,可以通过计算任何一系列移动所需的车轮j的最小转数来获得更复杂的我正确。对于每个车轮j,您可以对所有数字i分别取最大值,最后将这5个最大值加在一起,因为它们都是独立的。 (这可能比以前的启发式算法少,但是你总是被允许使用两者中较大的一个,所以这不会成为一个问题。)

答案 2 :(得分:1)

您可以使用的一种启发式方法是将每个细分移动到指定位置所需的累计转数。单个值的范围从零(项目在其位置)到五(从角落到角落)。目标配置的总数为零。

必须小心使用这种启发式方法,因为从初始配置到所需配置可能需要在移动后累计转动次数增加时的步骤。

寻找解决方案可能需要进行详尽的搜索。您需要记忆或使用其他DP技术,以避免多次解决相同的位置。