编写强力黑白棋的历程

    我的决战黑白棋从开始编写到现在已经大约经历了1年的时间,其中有几次是重大改编,可以说整个数据结构完全重写了。
    决战黑白棋刚开始的时候使用的是二维数组棋盘,估值函数基于棋子位置价值加行动力、潜在行动力,搜索深度大约是中局6层+终局15层。棋力很不理想,如禁止它进行终局搜索,我自己可以不费太大精力取胜。可见其估值函数是很差的。
    其后的一次重大改写是将二维棋盘改成了一维棋盘,是速度提高了20%左右,但由于估值函数的问题,棋力并没有加强,直到我改写估值函数。
    其后的估值函数在相当长的一段时间内都是棋子位置价值+行动力+潜在行动力+稳定子。这个估值函数可以说是比较强的,加上对终局搜索的改写,终局搜索加入奇偶搜索后速度大大加快。这时的决战黑白棋可以中局搜索8、9层,终局可以达到18-20层。这样的棋力已经非常强了。人要取胜几乎是没有可能的,我下载了国内的十多个著名的黑白棋软件,只有《伤心黑白棋3.1》和shines的《黑白棋世界1.0》能够战胜我的决战黑白棋。其中《黑白棋世界1.0》和《决战黑白棋》的棋力相差无几,但《伤心黑白棋3.1》要强很多。
    很早就听说《伤心黑白棋3.1》是基于模板估值的,并且据说搜索深度最大达到了中局18层+终局20层,终局20层对我来说到没什么,但中局18层却是无法想象。想必一定采用了前期剪枝。但无论是前期剪枝还是模板估值我那时都还不懂,对于这个号称国内第一强的《伤心黑白棋3.1》一点办法都没有。
    于是开始研究模板估值的论文,期待着能够大幅度的提高棋力。关于模板估值的文档很少,中文的更是没有。只找到一篇,英文的,而且讲的也不是很详细。断断续续的看了很久也没能掌握到要领,一直也没能付诸实践。后来用了一套简单的模板估值方法,基本思想是用各个模板的胜率来估值。但是实践效果非常差,8层搜索的棋力和我自己差不多。最后只好作罢。
    不久前,在stkim的blog上看到说有Booby Reversi的算法,当时很是吃惊,Booby Reversi是一个日本人编写的,棋力虽比不上《伤心黑白棋3.1》,但比我的决战黑白棋要强很多了。但是并没见过Booby Reversi公开算法或代码之类的。后来才知道是Booby Reversi有个Java版本的,可以反编译。于是我也反编译了一次,很复杂,又没有注释,完全看不懂。不过没费多大劲就把他改编成了C语言的,试了一下棋力,和预想的差不多,比《伤心黑白棋3.1》要差,但比我原来的决战黑白棋要强。现在我拿这个算法在GGS上可以打到1600分左右,原来只有1400多分。
    但当时毕竟没看懂这个算法,很遗憾。现在看来,他可能也是统计了大量的棋局,然后分析、逼近。只是不清楚他用了哪些参数来估值的。但由于对这个程序的分析,我几乎是突然间明白了模板估值的参数计算,就是通过统计大量的棋局,然后分析、逼近。当时真的很高兴,只用了周末的一天就把程序编写出来了。当时预计这个程序要连续运行4天左右,于是满怀期待的等待……2天后,程序结束了,比我预计的快,后来分析其原因,大概是因为模板中有很多在统计的棋局中从来没有遇到过,这样速度会快很多,但同时会导致模板参数计算精确度下降。后来试验了棋力,很失望,比Booby Reversi要差很多,比shines的《黑白棋世界1.0》也要差。没想到从未遇到的模板会如此大的影响整体棋力。第一次模板估值就这样失败了。
    目前我正在进行第二次模板参数的计算,主要区别是每个阶段的模板参数要和前后两个阶段的局面相关,估计效果会好一些,但计算还没结束,只能等待……但预计棋力也不会有大幅度的提高,因为我已经知道这个方法的弱点,并想到了新的方法。

你可能感兴趣的:(黑白棋研究,编程随笔)