Jan 28

    今天看到这里给出了一个“星际争霸是 NP-hard 问题”的一个证明。具体地说,给定一个初始布局(包括地图、双方已有资源、双方已有建筑、双方已有兵力),判断其中一方是否能获胜,这个问题是 NP-hard 的。当然,考虑到即时战略游戏的复杂性,这个结论并不出人意料;真正有趣的,则是如何巧妙地利用游戏中的元素,构造出极其精巧的初始局面,从而转化成某个已知的 NP-complete 问题。下面是原文中给出的证明。这个证明有没有什么漏洞?你还能想到哪些别的证明方法?欢迎在下面留言一同分享。

查看更多 »

Aug 10

    昨天的消息:一位 HP 的研究员 Vinay Deolalikar 宣称自己证明了 NP 问题,得出了 P≠NP 的结论。 P 是否等于 NP ,这是计算机科学领域中最困难的问题之一,也是意义最深远的问题之一,长期以来一直备受争议。如果这个问题获得解决,将会在各个科学领域中引起轰动。 Vinay Deolalikar 的整个证明有 100 多页,详细的论文可以在这里看到:

      http://www.win.tue.nl/~gwoegi/P-versus-NP/Deolalikar.pdf

    Stanford 的博士后 randomwalker 看完证明后表示,很多迹象表明,这个证明很有可能是正确的

     ---------------------------

    今天早晨的消息: Morley Davidson 、 John Dethridge 、 Herbert Kociemba 和 Tomas Rokicki 宣称,他们已经利用计算机,完美地解决了魔方问题。他们验证了,任何一种魔方的初始状态都可以在 20 步以内解出。他们将 43,252,003,274,489,856,000 种初始状态分为了 2,217,093,120 组,再利用对称性和集合覆盖将规模缩小到了 55,882,296 组。他们的程序可以在 20 秒左右求解出一组问题的解法,最终利用 Google 提供的强大的计算机,彻底解决了魔方问题。
    利用组合数学,我们能够证明,存在一种魔方初始状态,它需要至少 18 步才能解决。 1995 年, Michael Reid 找到了一种最少需要 20 步才能获解的魔方初始状态,因而将魔方问题的下界提高到了 20 。此后,数学家们猜想,任意给定一个魔方的初始状态,最多 20 步就能解决。 2008 年, Tomas Rokicki 和 John Welborn 证明了,任意一个魔方初始状态都可以在 22 步以内解决。 2010 年 7 月,这个上界终于降低到了 20 ,从而完成了对魔方最优解问题数十年来的探索。
    详细的研究成果见这里:

      http://www.cube20.org/
 

Nov 17

    在计算机复杂度理论中,P问题指的是能够在多项式的时间里得到解决的问题,NP问题指的是能够在多项式的时间里验证一个解是否正确的问题。虽然人们大多相信P问题不等于NP问题,但人们目前既不能证明它,也不能推翻它。P是否等于NP是计算机科学领域中最突出的问题,在千禧年七大难题中排在首位。科学家们普遍认为P≠NP是有原因的。让我们来看一看,如果哪一天科学家证明了P=NP,寻找一个解和验证一个解变得同样容易,那这个世界将会变得怎样?

 
    已知的NPC难题将全部获解,这将瞬间给各个科学领域都带来革命性的进展。整数规划、01规划、背包问题全部获解,运筹学将登上一个全新的高度;数据库的串行化、多处理器调度等问题也随之解决,大大提高了计算机的性能。同时,空当接龙、扫雷、数独等经典游戏也由于获得了多项式的算法而在很大程度上失去了意义。
    算法研究方向将发生全面转移。对算法的研究可能会转向围棋等NP-Hard问题。算法设计的学问与“NP问题统一解”的关系正如小学应用题与列方程解题的关系一样,将成为一种纯粹锻炼思维的游戏。

    一些新型的自动编程语言将出现,并将逐渐取代传统的编程语言。这种新型编程语言扮演着一个“判定性/最优化问题万能解决器”的角色。在新的编程语言中,你只需要用代码指明输入数据与输出数据的关系,而无需关心计算输出数据的步骤。只要这种关系是多项式时间内可计算的,编译器将自动找到解法。在新型编程语言的支持下,人们唯一需要考虑的是,如何把实际问题转化成数学模型。

查看更多 »

Oct 12

    高中一次英语课上,英语老师问我们,如果你有机会乘坐时光机回到过去,你想利用这次机会来干啥。“人上一百,形形色色”这句老话得到了完美的验证。什么“回去看看四大美女”呀、“看看金字塔是怎么建造的”呀、“回到三年前的那个风雨交加的夜晚握住她的手深情地告诉她其实我不想让你离开我你知道你走了之后我有多么痛苦吗”之类的东西,各种稀奇古怪的想法都被我们说了个遍。我还记得当时我说的啥——一个无比实用的雕虫小技。我说,我就想回到一个星期前,然后去买彩票。发明一个新东西并不是关键,关键是你怎么去使用它。
    最奇怪的幻想总是来自于最奇怪的需求。大家有过这种经历吗?看到自己写的程序运行了半天都还没有任何结果,于是开始纠结,到底是再等一会儿呢还是强行终止了检查一下看程序写错没;犹豫了半天决定杀掉进程后,检查了半天又发现程序没有写错。于是开始怨念,早知道程序没有死循环的话刚才就多等一会儿了。此时,你会突然开始幻想,有没有什么编译器能够事先告诉你你的程序是否会无限运行下去?虽然编程判断一段代码是否会无限执行下去很可能会相当的困难,但我们仍然不排除会有某个天才程序员想出了一个比三角恋爱更加复杂的算法,花它五年的功夫为他心爱的编译器写出了这样一个强大的插件。为什么不可能呢?这个东西看上去似乎比时光旅行机更现实一些。或许我们会在某个科幻电影中看到,一个程序员在黑黢黢的屏幕上输入了几个数,敲了一下回车,然后屏幕上立即用高亮加粗字体显示“警告:该输入数据会导致程序无限运行下去,确定执行?(Y/N)”。如果有一天,这一切真的成为了现实,那么你能利用这个玩意儿来做些什么实用的、有价值的事情?如果我说你能靠这玩意儿发大财你相信么?

查看更多 »

Jul 4

    曾经看到过自动扫雷软件,当时我就在想,扫雷游戏是否有什么牛B的多项式算法。最近才看到,扫雷问题居然是一个NP完全问题,并且这个定理有一个简单、直观而又神奇的证明。在这里和大家分享一下整个证明过程。
    首先,扫雷一定是NP问题,它显然可以在多项式的时间里验证一个解。接下来,我们需要把一个已知的NP完全问题归约到扫雷问题上去。我们将给出一种把逻辑电路问题归约到扫雷问题的方法,这样的话我们就可以利用扫雷问题解决逻辑电路问题,从而说明逻辑电路问题不比扫雷难。我们将把逻辑电路问题转换成一种对应的扫雷布局,就像画画一样把逻辑电路画在扫雷的棋盘上。如果你还不知道什么叫NP完全问题,什么叫逻辑电路问题,你可以看一看我的这篇文章

   
    上图就是一条带有Boolean值的线路。注意到x和x'中有且仅有一个有雷。如果(沿线路方向)前一个格子有雷,我们就说这条线路状态为True;反之如果后一个格子有雷,那么这条线路所传递的Boolean值就是False。每条线路的起始端都如下图左所示,其中符号*表示该格里必然有雷,x和x'中同样是有且仅有一个有雷,但到底是哪一个里面有雷谁也说不清楚。线路是可以拐弯的,如下图右所示,这可以保证转角后Boolean值相同。
   

查看更多 »

May 30

    在这篇文章里,我们从信息论的角度证明了,基于比较的排序算法需要的比较次数(在最坏情况下)至少为log2(n!),而log(n!)=Θ(nlogn),这给出了比较排序的一个下界。但那里我们讨论的只是最理想的情况。一个事件本身所含的信息量是有大小之分的。看到这篇文章之后,我的思路突然开阔了不少:信息论是非常强大的,它并不只是一个用来分析理论最优决策的工具。从信息论的角度来分析算法效率是一件很有趣的事,它给我们分析排序算法带来了一种新的思路。

    假如你手里有一枚硬币。你希望通过抛掷硬币的方法来决定今天晚上干什么,正面上网反面看电影。投掷硬币所产生的结果将给你带来一些“信息”,这些信息的多少就叫做“信息量”。如果这个硬币是“公正”的,正面和反面出现的概率一样,那么投掷硬币后不管结果咋样,你都获得了1 bit的信息量。如果你事先就已经知道这个硬币并不是均匀的,比如出现正面的概率本来就要大得多,这时我们就说事件结果的不确定性比刚才更小。如果投掷出来你发现硬币果然是正面朝上,这时你得到的信息量就相对更小(小于1 bit);反之如果投掷出来居然反面朝上了,那你就得到了一个相对较大的信息量(大于1 bit)。但平均下来,我们得到的信息量是小于1 bit的,因为前者发生的可能性毕竟要大一些。最极端的情况就是,这是一枚被捣了鬼的魔术硬币,你怎么投都是正面。此时,你投了硬币等于没投,反正结果都是正面朝上,你得到的信息量永远为0。
    这个理论是很符合生活实际的。昨天晚上我出去吃饭时,坐在我后面的那个人是男的还是女的?这种问题就比较有价值,因为大家都猜不到答案究竟是什么;但要问我昨天跟谁一起出去上自习去了,问题的答案所含的信息量就变小了,因为大家都知道如果我破天荒地跑去自习了的话多半是有MM陪着一起去的。如果有网友问我是男的还是女的,那就更不可思议了,因为我不但多次在这个Blog里提到我一直想找一个合适的MM,还在AboutMe里面发了我的照片。如果某人刚操完一个MM,突然扭过头去问“对了,你是男的还是女的呀”,那这个人绝对是一个不折不扣的大傻B,因为这个问题所能带来的信息量几乎为0。
    总之,当每种结果出现的概率都相等,事件的不确定性达到最大,其结果最难预测时,事件的发生将会给我们带来最大的信息量。我们把一个事件的不确定程度叫做“熵”,熵越大表明这个事件的结果越难以预测,同时事件的发生将给我们带来越多的信息。如果在排序算法里每次比较的熵都是最大的,理论上来说这种(基于比较的)排序算法就应当是最优的。但我们一会儿将看到,我们已知的排序算法总是不完美的,每种算法都会或多或少地存在一些价值明显不大的比较。

查看更多 »

Mar 21



图片来源:http://xkcd.com/399/
号外:期待了9个多月的PSP游戏Echochrome已经发行,网上到处有下载

Feb 26

  
    有这样的一类组合游戏,对于任一个游戏局面,游戏双方的合法决策都完全一样,游戏对战双方的唯一区别就是看谁先走。这样的游戏叫做Impartial Games。像什么报数啊,取火柴啊,取石子啊,这些游戏都属于Impartial Games;而象棋、围棋等要分棋子颜色的游戏则不属于Impartial Games。共享状态的游戏几乎没有可玩性,因为游戏开始前我们就能知道谁赢谁输(如果双方均使用最佳策略)。棋局的任一状态只有两种,面对这个棋局的人要么必胜要么必败。考虑这样的一个递推关系:如果一个状态是必胜态,那至少有一种走法能走成一个必败态留给对方;如果一个状态是必败态,那它怎么走都只能走到必胜态。运用这样的关系,我们可以自底向上推出初始状态是必胜还是必败。
    近来有人提出一个名为Atropos的游戏,它就是一个即使计算机也很难办的Impartial Game,它能保证这个游戏仍然具有可玩性。游戏在一个Sperner三角形上进行,上图就是一个边长为7的Sperner三角形。游戏开始后,双方依次在白色的圆圈里涂上红色、绿色或者蓝色,已经涂过颜色的圆圈不能再涂色。另外,只要有可能,所涂的圆圈都必须紧挨着上次对方涂的那个圆圈。谁先涂出三种颜色都有的小三角形,谁就输掉这场游戏。

  
    注意这个游戏是不可能出现平局的。当所有白色圆圈全部涂上了颜色后,至少会出现一个红绿蓝小三角形。为了证明这一点,我们可以在所有的绿色和红色圆圈中间画一个箭头,红的在箭头右边,绿的在箭头左边。这些箭头一定组成了一条一条的路径,它们既不会交汇也不会分岔。但整个图的边界上进来的箭头有4个,出去的箭头只有3个,于是至少有一条路径在里面走死了,也即迎面碰上了蓝色的圆圈。这样,我们就找到了一个红绿蓝三色都有的小三角形。

    这个游戏虽然属于Impartial Games,但它仍然具有可玩性。从直觉上看,这个游戏中的先手后手几乎没有区别,谁也不占优势。这篇论文则严格证明了,判断Atropos游戏的最佳策略属于PSPACE-complete,这是所有使用多项式空间的问题中最难的一类,所有使用多项式空间的问题都可以(在多项式的时间内)约化到它。这说明,Atropos游戏没有什么很显然的“决窍”,即使利用计算机也很难确定最优决策。

在线游戏:http://cs-people.bu.edu/paithan/spernerGame/SpernerGame.html (Java Applet)
查看更多:http://cs-people.bu.edu/paithan/spernerGame/

« 更早的日志