8-puzzle 可解性的证明 & 最优解性的证明

问题来自Coursera上Princeton所开Algorithms Part I第四周的作业:http://coursera.cs.princeton.edu/algs4/assignments/8puzzle.html

这一次作业要求用Priority Queue实现一个经典的A*搜索算法,来找到一个8-puzzle问题的解(或者在有限时间内发现它的无解性)。

作业要求里对算法的描述很细致,基本照做就能做出来。

https://github.com/jasonlovescoding/Coursera-Princeton-Algorithm

1. Note that we do not count the blank square when computing the Hamming or Manhattan priorities.) Consequently, when the goal board is dequeued, we have discovered not only a sequence of moves from the initial board to the goal board, but one that makes the fewest number of moves. (Challenge for the mathematically inclined: prove this fact.)

证明,当目标节点从PQ中退出时,我们找到的不仅是一个解,而且是步数最少的一个解。

这个性质与MinPQ的数据结构互相联系,算法中每次退出的节点都是最小评分的,我们所用的评分是“曼哈顿距离+步数”。假设我们退出一个目标节点时,在MinPQ中还存在着一个所用步数更少的目标节点,由于目标节点的曼哈顿距离是0,这两个节点(现在退出的,和没找到的那个)的评分都是步数。我们退出的节点的评分是最小的,那么不可能有评分更小的目标节点在MinPQ中,也就是说,我们这次退出的目标节点的步数一定是最小的。(类似也可以证明使用hamming距离+步数作为评分,得到的也是最小步数解)


2. Detecting unsolvable puzzles. Not all initial boards can lead to the goal board by a sequence of legal moves, including the two below:

 
  
1 2 3 1 2 3 4 4 5 6 5 6 7 8 8 7 9 10 11 12 13 15 14 unsolvable unsolvable
To detect such situations, use the fact that boards are divided into two equivalence classes with respect to reachability: (i) those that lead to the goal board and (ii) those that lead to the goal board if we modify the initial board by swapping any pair of blocks (the blank square is not a block). (Difficult challenge for the mathematically inclined: prove this fact.)

这是一个非常重要的性质:8-puzzle问题中凡是无解的图,将除了空白栏之外的任意两个格子交换,都能得到可解图。而可解图通过一次交换得到的是无解图。

这个性质与“逆序对数”有关。如果我们把这个二维数组以一维的眼光线性地去看,无论是把0(0代表空格)竖直交换,还是水平交换,逆序数的奇偶性都不会变化。

水平交换很显然成立。下面是竖直交换的情况,相当于把x于右相邻元素交换两次。我们知道交换一次改变奇偶性,两次就变回来了。

(,x,y,z,)(,y,z,x,)

而任意两个非0项的交换相当于在这个一维序列中的一次交换,改变了奇偶性。

很显然目标的逆序数是0为偶数,也就是说,凡是逆序数为奇数的图,在8-puzzle都是无解的。

但是如何证明偶数一定可解呢?

。。。貌似要用到抽象代数的置换群等知识 等这学期学了再解释

一个简单的证法需要利用到下面的变换。在某一行下方的一个空格的帮助下,abc可以变为cab而不影响其他任何格子。

完全相似地在列上也可以变换,如果空格在某行上方,完全相似也可以。

8-puzzle 可解性的证明 & 最优解性的证明_第1张图片

那么,无论初始状态,把1搬运到第一列,然后列旋转把1转移到第一格,类似把2搬运到第二列旋转、把3搬运到第三列旋转,这样就让1 2 3到达该到的位置上。

然后把7和8两个数搬运到第三行,旋转使得7 8分别在第七格和第八格(由于一个无关格的存在,即便一开始8在7的前面或者最后8在第九格,通过简单的变换这也是可以做到的。

例如 4 8 7 (空格在7上方)--> 7 4 8 (空格在8上方)-> 7 8 口(4在8上方) )

在这之后空格在第九格,4 5 6 在第二行,这时如果逆序数为偶数,必然可以通过旋转使得4 5 6到达应该在的位置上。

对于15-puzzle乃至更多,证明见
http://www.cs.bham.ac.uk/~mdr/teaching/modules04/java2/TilesSolvability.html

你可能感兴趣的:(课程学习报告,Java)