我使用广度优先搜索构建了一个8拼图求解器。我现在想要修改代码以使用启发式。如果有人能回答以下两个问题,我将不胜感激:
可解性
我们如何确定8拼图是否可以解决? (给定起始状态和目标状态)
这就是维基百科所说的:
不变量是所有16个方格加上的排列的奇偶性 出租车距离的平价(行数加上数量) 列右下角的空方块。
不幸的是,我无法理解这意味着什么。理解起来有点复杂。有人可以用更简单的语言解释它吗?
最短解决方案
鉴于启发式,是否可以保证使用A *算法提供最短的解决方案?更具体地说,打开列表中的第一个节点是否总是具有深度(或运动次数如此之大),这是打开列表中所有节点深度的最小值?
启发式是否满足上述陈述的某些条件是真的?
编辑:可接受的启发式方法如何始终提供最佳解决方案? 我们如何测试启发式是否可以接受?
我将使用列出here
的启发式方法Manhattan Distance
Linear Conflict
Pattern Database
Misplaced Tiles
Nilsson's Sequence Score
N-MaxSwap X-Y
Tiles out of row and column
来自Eyal Schneider的澄清:
答案 0 :(得分:6)
我只会提到可解决性问题。需要一些排列背景。
排列是有序集的重新排序。例如,2134是列表1234的重新排序,其中1和2交换位置。置换具有奇偶性;它指的是倒数的奇偶性。例如,在下面的排列中,您可以看到正好存在3个反转(23,24,34):
1234
1432
这意味着排列具有奇数奇偶校验。以下排列具有偶数奇偶校验(12,34):
1234
2143
当然,身份置换(保持项目顺序)具有均衡性。
如果我们从第一行开始将它看作行的串联,那么15拼图(或8拼图)中的任何状态都可以被视为最终状态的排列。请注意,每个合法移动都会更改排列的奇偶性(因为我们交换了两个元素,并且涉及它们之间的项的反转数必须是偶数)。因此,如果您知道空方必须经过偶数步骤才能达到其最终状态,那么排列也必须是偶数。否则,你将以最终状态的奇数排列结束,这必然与它不同。与空方块的奇数步数相同。
根据您提供的维基百科链接,上述标准对于可以解决的特定谜题来说已经足够且必要。
答案 1 :(得分:3)
A *算法 保证找到(如果有多个相同的短的那个)最短的解决方案,如果你的启发式总是低估实际成本(在您的情况下,需要移动到解决方案的实际数量)。
但是在飞行中我无法为你的问题找到一个好的启发式方法。这需要一些思考来找到这样的启发式。
使用A *的真正艺术是找到一种始终低估实际成本的启发式算法,但尽可能少地加快搜索速度。
这种启发式的第一个想法:
答案 2 :(得分:0)
我将尝试回答与“最短解决方案”部分相关的问题。如果启发式是可允许的(即,永远不会过高估计到最近目标的路径成本),则保证A *树搜索算法是最优的(即,如果存在,则找到最短路径)。形式上,如果对于每个节点n,0< = h(n)< = h *(n),则启发式h是可接受的,其中h *(n)是从n到达最近目标的确切成本。
然而,A *树搜索最终可能会进行指数级重复的工作。我们需要一种方法来关闭扩展节点,以便它们不会再次展开,从而产生图搜索算法。只有当使用的启发式是一致的时,A *图搜索才是最佳的,即,它逐渐估计路径成本,因此沿路径的启发式值永远不会减少。形式上,如果对于每个节点n和对于n的每个后继s,启发式h是一致的,h(n)<= h(p)+ cost(n,p)。
曼哈顿距离是8拼图问题的一致启发式算法,A *图搜索,如果有启发式的话,它将配备曼哈顿距离,确实会找到最短的解决方案。
我已经写了A *搜索的详细解释,并在这里使用A *提供了N-puzzle问题的python实现:A* search explanation and N-puzzle python implementation
答案 3 :(得分:0)
对于任何一个人来说,我将尝试解释OP如何得到价值对以及他如何确定突出的那些,即反转,因为我花了几个小时来弄明白。首先是对。 首先采取目标状态并将其想象为一维数组(例如A) [1,2,3,8,0,4,7,5]。该数组中的每个值在表中都有自己的列(一直向下,这是该对的第一个值。) 然后在数组中向右移动1个值(i + 1)并再次向下移动,第二对值。例如(状态A):第一列,第二个值将开始[2,3,8,0,4,7,5]下降。第二栏,将开始[3,8,0,4,7,5]等。
现在可以进行反转。对于2对值中的每一个,在起始状态中找到它们的 INDEX 位置。如果左 INDEX &gt;右 INDEX 然后它是一个反转(突出显示)。前四对状态A是:(1,2),(1,3),(1,8),(1,0)
1是索引3
2是在索引0
3> 0如此倒置。
1是3
3是2
3> 2如此倒置
1是3
8是1
3> 2如此倒置
1是3
0是7
3&lt; 7所以无倒置
对每对进行此操作并计算总反转次数。 如果偶数或两者都是奇数(曼哈顿距离的空白点和总反转) 那么它是可以解决的。希望这有帮助!