这是从贴吧转过来的帖子,原作者女神拉克西丝。化工网也有人转过去。这篇帖子虽然没有什么犀利厉害的观点,但正如标题所说,是一篇漫谈性质的文章,所以,细细看下去,对拓宽眼界提高棋软方面的知识还是很有帮助的。我个人的归纳是,人脑的体系以趋向化繁为简为主,不管怎么复杂的东西,人的体系可以使它简化成模块形式存储在大脑,以备随时调用。计算机体系则相反,但是现今也出现了向人的体系靠拢的趋势,假如有一天真的实现了这种技术,例如棋软残局库的智能模块的智能检索调用,那么,棋软的真正威力才能真正恐怖可怕。闲言不赘了,原文有点长,大家自己慢慢看吧,体会也许自有不同。
昨天发了一次,至今未通过审查,今天把几个敏感词去掉了,再试试。
原作者的话:本文是纯粹的漫谈性质,有人喜欢看结论,我可以提前说明白:根本就没有什么结论。
1.局面和变化
数学的思维都是从定义开始的,有时候看到有人在局面和变化这两个概念上纠缠不清,所以我一开始要先把这两个概念给解释一下。
通俗点说,棋谱上通常都是画一幅图,然后写一串着法,这幅图叫做一个“局面”,而这一串着法叫做一路“变化”。局面是一些点,而变化是连缀这些点的线。
【思考题】几何入门问题:4条直线互不平行,一共有几个交点?过4个点中任意两点作直线,一共可以做几条?
这个思考题只是个玩笑,只是为了形象的表示局面和变化的关系。
有人在不知不觉中混淆了这两个概念,说起“变化”时,有时候真正想表达的是“局面”的含义。但是我这里但凡提到变化,就是指变化,不是说局面。
说到穷举法,一般最先问的问题是:象棋有多少变化?准确的说是两个问题:象棋有多少种局面?象棋有多少路变化?
至于这两个问题答案是什么,它们又在多大程度上有意义,这是后话。
2.穷举法的最初设想
早在很久很久以前,我既没有看过任何棋谱,也不知道有什么棋软,我就有过一种想法:能不能写出一本书,介绍下象棋必胜或不败的方法,对方每一步棋都有多种不同的走法,而这本书上要针对每种走法都给出一种最正确的应着。这样一来只要把这本书背下来,就天下无敌了。
现在看来这个想法很幼稚,现在象棋书很多,每本书所能介绍的东西连冰山一角都算不上,我所设想的东西哪是记在书上就能记得下来的?
最早接触的棋软就是红白机上的那个象棋游戏,很多人应该都知道吧。不仅仅是下棋,我也会去思考,它在编程上是怎么实现的?
我最初的想法就是像上面说的那样,在里面存储了类似于那本书的东西。只不过作者没有完全找到最正确的应着,所以它有时候还是会输棋。
可是这个游戏里还有个双人对弈的功能,而且双人对弈里还有一个让程序代走的功能。
这样一来就更麻烦了,像刚才说的那样存储那么一本书都不够用了,因为两个人乱走,走出了那本书的范围,这时候让程序代走,它仍然能给出一种走法,所以我想它可能存储了更多的东西,那么是什么呢?我的想法是:它存储了象棋中所有可能出现的局面,然后每种局面记着一步走法。
归结起来,以上这些内容就是存储法,具体的又分为:基于变化的存储法、基于局面的存储法。
存储法是最低级的方法,略微懂点编程以后,就知道其实完全没必要这么做,因为还有计算法。
不过我这时候所想的计算只局限于暴力计算。每走一步棋,分析有那些可能的走法,然后把每种走法一直算到底,发现按照哪些走法走下去能赢,哪些走法走下去能输,最后选出最好的走法出来。
存储法和暴力计算法就是我对于棋软最初的理解方式,大概很多人都有过类似的想法,这些在贴吧的帖子里可以看出端倪来。
归根结底,这些都是笨办法,一个挑战的是存储空间,一个挑战的是运算速度。
现在棋软所用的算法比这聪明多了,后面再说。
而关于局面数、变化数的讨论也大概从这里开始。这两个问题对于计算机穷举法或许有一点意义,对于人来说是没有什么意义的,即使象棋的变化比现在扩大10000倍,或者缩小10000倍,对于人来说也没什么区别,因为人所能遇到的、所能掌握的都只是其中的一点点而已,更重要的是,人的思维不同于计算机,下棋时根本也不需要关心这个问题。
3.合法与非法,有意义与无意义
当然不是说随便把棋子一摆就可以构成一个局面,也不是说棋子随便乱走就能构成一路变化,毕竟象棋是有规则的,只有不违反规则的局面和变化才算是合法的。
如果棋盘上出现三个马,或者没有帅,或者士象过河等等,这些都是不可能出现的,属于非法局面,如果出现马二进五、兵一退一、炮隔二子打士等等,就属于非法变化。还有一个很重要的规则:不允许送将或不应将,出现这种情况也算非法局面或者非法变化。
一般支持摆子功能的棋软都要对非法局面有一定处理能力。有些棋软是完全随便摆,把将摆在九宫外面它也照常计算;有些棋软还是有限制的,想把将摆到九宫外面也摆不上去,但是如果摆一个双车同时将军的局面,它也不会判断出这是非法局面。至于非法变化,那是不会出现的了,没有那个棋软会把时间浪费在计算马二进五的变化上,除非是双人对弈,如果判断机制不完善,有可能出现不应将的情况。
当然这些只做简单说明,一般说局面和变化的时候,都默认是合法的。
在合法与非法之上,时常被人提及的是有意义和无意义,经常有人说“这个局面是没有意义的”或者“这种变化是没有意义的”。我不接受这种说法,数学讲究要有严格的定义,编程讲究要有判断的准则,从这种意义上讲,“有意义”这个概念本身是无意义的。
首着帅五进一有意义吗?有人说没意义,因为谁下棋都不会这么走。那么为什么不会这么走呢?因为它是败着。为什么又说它是败着?说到底还是因为对帅五进一的后续着法做了些推演,所以才得出这个结论。既然已经推演了这么多,又怎么能反过来说它没意义呢?
最早的时候编棋软的人认为首着帅五进一没有意义,所以不去管它,结果这步棋成了对付棋软的好方法,差一点的棋软直接死机,好一点的还能走棋,但是走的一塌糊涂。
所以讨论这些问题的时候,只讲合法与非法,不讲有意义无意义。
4.有穷?无穷?
首先毫无疑问,象棋的局面数肯定是有穷的。因为一共只有90个点,32个棋子,且不说合法非法,就算把棋子随便往棋盘上摆,也不会有无穷种摆法。
至于变化,这个就有点复杂了。
其实这个问题可以换一种问法:一盘棋的回合数有没有上限?很明显,如果回合数有上限,那么变化就有穷。如果回合数没有上限,那么变化就无穷。
说起回合数上限,就该说到自然限着了:如果连续若干回合双方没有吃子,一方可以提和,另一方不得拒绝。这个回合数一般定为60。这么一来,回合数上限就是31×60=1860。
有人说这个自然限着是非本质的,改成30或者改成120都不会改变象棋的本质。这种说法是对是错也很难判断了。不过我要说的是另一个角度的问题:如果到了自然限着,双方都不提和会怎么样?有人可能以为裁判会判和棋,但事实上,裁判在这个问题上执行的是不申诉不受理原则。
也就是说,一盘棋可能的回合数是没有理论上限的,那么变化就是无穷的。
虽然变化是无穷的,但是计算机在计算的时候,却可以通过巧妙的算法,借助有穷的局面,把计算步骤变成有穷,这是另一回事。
5.棋软已经实现穷举法了吗?
前面提到了我早年对于棋软的两种理解:存储法和暴力计算法,这两种方法本质都是穷举法。后来就知道这种想法的幼稚,因为它一没有必要,二没有可能。
但是,有些人因为对于象棋和棋软都不够了解,对于棋软的理解仍然局限在穷举法。
在这些方面,象棋和西洋棋是很类似的。当年西洋棋冠军卡斯帕罗夫输给了“更深的蓝”,这件事情被很多人解读为“计算机已经破解西洋棋”,。
象棋也是类似,目前棋软已经发展到很多人下不过的程度,于是也被人解读为“计算机已经破解象棋”。
贴吧曾经有一个帖子,说棋天大圣只有60M,连最好的棋手都只能和它战平,也就是说象棋的变化只要60M就能涵盖。(当然这是不是为棋天大圣做广告暂且不谈。)
这些人在得出这些结论的时候都用了一个前提:棋软要想战胜人,就要算尽全部的变化。事实当然不是这样,因为人也没有掌握象棋的全部变化,棋软也没有掌握象棋的全部变化,棋软所掌握的只要比人多就够了,没有必要都算尽。
那么棋软是怎么计算的呢?在很大程度上说,棋软是在模拟人的思维方式。
人一方面记忆了一些棋谱,比如说记布局,记残局定式。相应的,棋软也有开局库和残局库。另一方面就要靠计算,但是绝对不是一直算到终局,而是算几个回合,然后判断局面是优势还是劣势。相应的,棋软也是算几个回合,然后判断优势还是劣势。
不过有一点,人在判断优势劣势的时候,靠的是经验和直觉,棋软当然做不到这一点,所以它就只能用一些线性的算法来判断局面优劣。这个判断优劣的算法对于棋软是很重要的,它构成了棋软棋力中很重要的一部分。
6.人和计算机思维方式的差别
人和计算机不同,计算机的思维方式是线性的,而认识非线性的。人的计算速度比计算机慢了不知多少,但是在下棋的时候思考时间却未必比计算机长。
有那么一类特殊的残局,如果给人心算,可以很快算出来,但是给棋软分析,往往就算不出来。
如果是在局面很简化的情况下,人的思考方式可能是:“连冲5步兵,然后……”,这时候,“连冲5步兵”的计算量丝毫不比“冲1步兵”的计算量大。可是对于计算机就不一样了,它要一步一步的计算,计算量不是5倍的关系,而是5次方的关系。
当然棋软也在进步,有些原来算不出来的现在已经能算出来了,但是仍然有许多算不出来的正在等着它。
有时候,一个局面有走车、走马、走炮等多种选择,人可能潜意识里就告诉自己:“这棋怎么可能走车和炮呢?肯定要走马。”然后就专心的思考走马之后的变化去了。可是计算机却不管,既然有这么多种走法,它就要每种都算算看,然后说不定就发现“这儿有一个巧手”——走炮。当人看到计算机的计算结果时,不禁感叹:“我怎么都没想过这棋还能走炮?”
人的漏着往往就是这么产生的,按照从前的说法,这叫做“犯了经验主义的错误”,但是计算机不会这样。
经常有种说法:棋软的中局水平很高,而残局水平就很差。可是就不觉得很奇怪吗?棋盘上的棋子减少了,计算量也就会减少,怎么可能水平反而下降呢?
原来,这里所说的水平高低是相对于人而言的,虽然棋软的残局水平比中局水平要高,但是它的中局水平仍然比人要高,而残局水平仍然比不上人的水平。
所以,不是棋软的残局水平差,而是说人中局水平差。
人的残局水平其实是凝结了很多人的经验,有些例胜的残局可能要走几十个回合,但只要有个固定的套路,前人总结好,后人还是很好掌握的。可是对于棋软来说,要计算几十个回合谈何容易?