中国象棋博弈程序研究与实现

 

 今年5月份到6月份比较清闲,因为刚换工作,外包Microsoft。刚进入微软工作,需要alias等等一系列东东,办理这些花了大概两个星期,所有一直没有事情干,于是花了3天的时间写完了mini英汉字典,本来想再细化功能的,但是由于

1、主要功能已经齐全;

2、想要写界面方面的代码需要一些时间去研究;

3、对英汉字典的需求没有更深入的分析;

4、在查询字典资料时看到了博弈树,置换表等等技术。

出于以上原因对英汉字典的探索告一段落。于是5月底到6月中旬的时间一边做工作,一边研究中国象棋的智能博弈算法,但是由于最近比较忙,没有写相关文章,所以这几天有空慢慢补上。对于中国象棋的研究可以借鉴国际象棋的研究,其中我遇到的一些关键的难点是理解最小最大原理,Alpha-beta-search算法,着法产生等等。

最小最大原理是计算机鼻祖冯诺依曼提出来的。他的算法的基础是假设玩家每次走棋都能选择最佳的着法,这样通过类似换位思考的方式,假设己方走一步棋,对方会走几步,算出每种走法的得分。每个玩家尽量使自己的得分最高,从而选择得分最高的走法。最大最小中,最大者一方的得分用正数表示,另一方用负数表示。假设当前走棋的玩家是最大者,他要使自己的得分尽量多,那么采用正负表示后,最大者只要产生自己当前所有可以走的着法,然后依次尝试走这些着法。在每尝试走一招时,最大者调用最小者来获取走此招时最小者的得分,然后取反就是自己能得到的分数。然后在所有着法中选择使自己得分最高的那个着法就可以了。最小者获取得分的方式与之相同。可见该算法是一个多层递归。

其伪代码如下所示:

 int 最大最小搜索算法(搜索深度)

{

         如果达到最大深度, 返回当前局面的评价得分。

          产生当前所有着法

          走每一步着法

          {

                   如果当前着法使自己被将死

                             撤销该着法,然后继续走下一着

                   改变当前玩家为对方

                   获取该着法自己的得分(先获取对方在该着法下的得分,然后取反即是自己的得分,即负的最小最大搜索算法(深度 减1))

                   如果该着自己的得分比以往最佳得分还要高

                             设置最佳得分为当前得分;

                              记录当前着法;

                   撤销当前着法

            }

            返回最佳着法的得分

 

}

       最早实现的该算法运行在第一台计算机 ENIAC上,它能思考8层。它战胜了一位20几岁刚学象棋的姑娘(第一例机器智能战胜人类:))。最小最大搜索算法如果思考的深度足够深(全部局面),那么计算机肯定可以战胜人类,但是由于计算的数据量指数增长,b^N(b当前局面的着法,N深度),对于b=35,N=10,就是2251875390625(2万亿级别)。所以它的效率是非常慢的。

        为了能显著提高计算机的棋力,曾经出现过多种方法,一种是模拟人类棋手的思考方式,进行智能思考,一种是提高硬件速度。然而alpha-beta通过截断,丢弃不必要的局面的计算,大大改善了计算机的棋力。

        (由于时间太晚了,待续。。。 目前我的RobotChineseChess已经完成了初级智能走棋,alpha-beta迭代搜索,慢慢慢慢的迭代搜索中....现在停在通过RC4密码流算法实现置换表的阶段。期间想转向用面向对象的方式架构,但是写了一半发现架构的不好,又反复回了面向过程+全局变量访问器等方法,想要效率,又要时一个类只负责单一工作,类的职责不好划分) 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值