您的位置:首页 > 大数据 > 人工智能

记在北大五子棋AI比赛后

2011-01-07 21:24 316 查看
这次的北大五子棋比赛(http://www.botzone.org/RATE/)给我的受益良多,在AI的博弈算法上算是有了初步的认识,在如何从零开始学习新知,如何组织代码重构代码,如何测试这种种的问题上都给了我许多锻炼。

1) 如何从零开始学习?

最直接的方法莫过于google一下,在过程中发现五子棋的AI资源相对于国际象棋之类的要少得多,但还是有一个网站的资源比较全http://gomocup.wz.cz/gomoku/download.php,基本上记录了所有重要的与五子棋相关的论文了。五子棋的资源相对少的另一个原因是它已被L.V.Allis 证明是具有先手必胜策略的棋类,在他的论文Gomoku and Threat-Space Search中提出了黑棋寻找Threat-Space 的方法,利用pn-search的博弈树加上db-search的落子搜索方法的Victor在黑棋全胜白棋半数胜利的情况下拿下了92年的五子棋AI世界冠军,至此之后似乎研究五子棋的进展就停滞了。

五子棋相对于国际象棋的AI还是相对简单的,数据结构,招法搜索,局面判断函数,搜索函数等等。但所谓麻雀虽小,五脏俱全。用五子棋AI来入门AI棋类游戏的博弈足够的简单,却也能对AI棋类游戏有个大致的了解了。

2) 搜索函数

博弈树的搜索程序的历史还是非常精彩的。早先的是MaxMin的思想:即我下子时要取对我利益最大化的节点(Max),而对方下子时就取对我利益最小的节点(相对的对方的利益就最大化了)。之后Knuth根据MaxMin的思想发展出了经典的AlphaBeta搜索,所谓的Alpha就是我方在搜索了前面节点时发现的最大化节点的评价值,如果后续的某个Min节点的最佳情况也小于或等于Alpha是便可不用再搜索此Min节点直接跳至下一个Min节点。相对的Beta就是Min节点的能取到的最小值,如果它下属的Max节点的最优情况大于Beta那也不用搜Max了直接跳至下一个。在这之后又发展出了NegaScout,MTD的搜索方法。都是基于空窗原理,空窗原理就是Alpha=Beta-1,将Alpha和Beta的间隔设的足够小,就将这个搜索的范围像窗一样限定在某一范围,搜索一次的速度能更快,但也可能搜索出的结果不在窗内,那么你只能根据结果再次调整Alpha, Beta的值搜索,所以这一过程可能重复多次,但根据NegaScout,MTD的测试他们的算法总体要优于AlphaBeta的速度。另外MTD和NegaScout的算法都是要基于置换表来加速的。(参考:http://www.xqbase.com/computer.htm

3) 评价函数

这里要感谢某个网站的开源五子棋评价函数给了我不少启发,可惜网站已忘了。他的方法是给某个点计算其价值然后加总所有位置的价值(Eval)。先对我方算一遍,再对对方算一遍,用我方的Eval除以对方的Eval得出是进攻还是防守(大于1就进攻,小于1就防守),之后用此权值再次进行棋盘函数的评价。得出棋盘各位置的价值。在这里我将其从大到小排序得出一个启发式落子的序列,对于我方我取10个落子点搜索,对方取5,至于为何如此,我是参考了Allis的论文,为的是让我方更具进攻性,更可能搜索到Threat-Space,但相对的防守就比较薄弱了。另外之前我是一直设各取7个落子点,用前者与后者对弈执黑或白均为前者胜。但我依然没有理论依据证明前者更优。另外,比赛时间也较紧,每步落子不超过1秒。在这里我将搜索深度设为了7。

这次比赛给我的启示非常的大。持续提高代码质量,坚持到底的勇气,如何控制大代码等等都是很值得学习的。另外如何测试程序的好坏这点我依然还是没有特别的心得,在将来的Go-moku比赛中我会更进一步的学习的。这次的比赛拿了第7,也算是不错的成绩了,最主要的是又真正体会到编程之乐,那些思考的时光,那些写代码的时光,还有那看着比赛系统judging的时光都是很美好的。下一步是持续增强代码,另外参加robocode的比赛以及回归topcoder。

P.S. Mushroom的google code开源项目http://code.google.com/p/mushroom/也是我赛后的收获之一。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: