吴昊品游戏核心算法 Round 18 —— Zen Puzzle Garden关卡的NP完全性证明(吴昊 译)
好了,在Glow Puzzle完结之后,再来说说前面的游戏——Zen Puzzle Garden,这里提到一个人,就是Sevenkplus,顾昱洲,人称顾神,上周的时候我很碰巧地加入了POJ的组委会,并很碰巧地遇到了真人版的顾昱 洲童鞋,并很碰巧地加了他,一些都是那么偶然(有图片可以证明的哦!)。所谓Sevenkplus,意思就是7k+,7K+的意思是代码长度 (length)为7KB以上,也就是大约350行左右。在ACM中一般的代码行数都是低于150行的,所以偶尔一个7K+是一个很恐怖的事情。
那段Zen Puzzle Garden的逻辑代码比较复杂,目前我还在请教老师,希望可以全面搞懂,在研究这款游戏的AI的时候,我不经意地发现了一篇论文,是在道客巴巴上面找的。这篇论文是英文的,目前还没有人翻译过来,所以,我只好自己翻译咯。
Zen Puzzle Garden是NP-完全的
Robin Houston,Joseph White,Martyn Amos
(吴昊 译)
关键词:计算复杂度,NP-完全,谜题(我想到尼亚了)
1.介绍
Zen Puzzle Garden(ZPG)是发生在一个二维的方形隔点上的一个单机的解谜游戏,被叫做花园(Garden)。方块可以是沙子,石头或者空地(可以行走的区 域)。这款游戏的任务是移动一个僧人,围绕着这个广场移动,来覆盖所有的方块。僧人可以自由地在空地上面移动。在沙地上的时候,僧人只能沿着冯诺依曼邻域 中移动(例如:对角的移动是不允许的)。在沙子上走动的时候,这个僧人继续朝着其笔直的方向移动,直到他碰到了一个可以行走的方块(他会移动到那个上 面),一个覆盖着沙子的方块或者一个石头(在这两种情况下,他停止移动)。这个僧人在沙子上面移动的时候不会停下来。一个花园的例子被描述为图1的形式, 同时给出了一个样本解。
虽然这个问题已经被实验地(基于一种类似于蒙特卡洛的方法)研究过,到目前止,还没有存在过关于其时间复杂性的正式的证明。我们现在宣称,决定ZPG的解的复杂性是NP完全的。
定理1:决定一个Zen Puzzle Garden实例的解是NP完全的
接下来,我们为接下来的一个NP完全问题构造出一个证明,给出一个立方平面图,它包含一二汉密尔顿回路嘛?我们构造一个对应于任意一个立方平面图的ZPG花园,我们所构建的任何一个花园将会存在一个解决方案,当且仅当对应的图表中有一个汉密尔顿回路。
2.证明
为了建立一个反映了一个立方平面图G的ZPG花园,我们首先在一个格子中画出这张图。这往往以这样一种方式完成——格子的面积是图的尺寸的二次方。我们按 照如下的方式将格子转换成ZPG花园。每一个格子的方块被转换成了一个7*7的砖瓦,是由石头,沙子,或者是可以行走的区域组成的。格子中的每一个方块是 由一条直边,一个拐角,或者一个三个事件边交汇的一个节点组成的。前面两种砖瓦被描述为图2的形式,这可以根据需要进行旋转操作。
结点砖瓦以这样一种方式被构建,无论是哪个沙地首先被覆盖,我们总是可以覆盖掉剩下的沙地,并从剩下的几个方向的任意一个出来(如图3)。
在图4中,我们展示了一个立方平面图,同时给出了它的ZPG展示。起始结点被涂成红色,其中,汉密尔顿回路被加粗地显示了出来。
在ZPG的展示中,起始结点可以看成是由两片瓦合成的,占据了位置(3,6)和(3,5)。最顶层的砖瓦被完全地描述为可行走的方块,这是僧人被初始放置 的位置,下面的砖瓦是一个简单的“出入口”砖瓦,被描述在图4的第三幅图中。这片砖瓦是一个被模拟的节点砖瓦,其中,两个最上层的石头已经被转换成沙子。 第一个被覆盖的沙地只能是这两个的其中之一,最后一个被经过的沙地也必定是另外一个。这样有利于出去,也有利于退回到起始的节点。任何一个解决方案必须通 过所有的其他节点有且仅有一次,所以,任何的对ZPG问题的解决方案都必然存在一个图中的汉密尔顿回路。
我们从[3]中得知一个具有n个结点的立方平面图可以被一个网格的面积O(n^2)所实现,这个网格的实现可以被计算为时间复杂度O(nlogn),所以 从立方平面图到ZPG花园的地图(游戏界面)是多项式类型的。给出一个解答,它可以被轻易地在多项式时间中找到,因为一个解决方案将不会大于这个花园的解 决(就是上面所述的那种),这就完全地证明了ZPG的关卡是NP-完全的。