您的位置:首页 > 其它

中国象棋软件制作感想

2012-02-18 14:29 295 查看
小时候大概四五年级的时跟着我姥爷学下象棋,到后来上高中的时候可以下过我姥爷了,感觉很得意,我姥爷说人老了,脑子不好使了…就象我现在写的这个软件一样,它是我写出来的,历时一个月,到现在我完全不是他的对手了,很多时候跟它下,都能知道它下一步走什么,感觉自己有很大的优势,可就是不管怎么努力都不能把优势转成胜势!最后一点一点的我的攻势被瓦解,然后输掉整盘棋!我绝对是个初学机器博弈的菜鸟,但我象棋水平还不算太业余,结果我输给了自己做的程序,我就在想,要是全人类中的顶尖高手会不会做出挑战全人类无敌的软件呢?很可怕,人的一切智慧的行为都是博弈的行为!说下初学机器搏弈的心得,有共同兴趣的同志可以一起探讨,我无尝提供我做的这个象棋的源代码,不过没我给你解释们很难看的懂,不是太难,而是太乱,哈哈!一个完整的程序要有:局面的表示,由于运算量巨大,要使用一维数组,二维的话运算时间几乎为平方倍!棋子的表示,建意使用整型类型,还是为了速度,我曾花了大概十几天的时间来加快运算速度,这是件蛋疼的事情!还有用一个二维数组来关联一个局面中红黑方棋子的位置,这在走法生成时将节约大量时间,我的程序中没有用到这个,我的程序目前只搜到六层,就是深度,七层的话大概每走一部运算40多秒,这是无法忍受的!再就是走法生成涵数,先找到一个本方棋子,根据棋子类型生成所有符合规则的走法。再就是搜索引擎,就是个基于历史启发的阿尔发贝塔搜索涵数,基本思想就是:把能走的都走一遍试试,然后就是让对方把能走的都走下,这样下去,从最底层的那一步往上倒推,再该程序走的那些走法里选对程序最有利的走,再该对方走的时候对方肯定会选对程序最不利的走发走,这样展开就会找到最好的走发,然后让程序走这个走发,举个例子:比如开局,程序用红子,有四十五种走发,从里面取一种走,然后让对方走他所有能走的中的一种,平均也是四十多种,这样程序走一步,对手走一步就会有大越四十乘四十种可能,这就是所谓的深度为二,深度为三就是当对手走一步之后再让程序走一步,这样深度为三大越就会有四十乘四十乘四十等于64000种可能,为四就是2560000种,指数增长的东西是可怕的,除了上帝谁都追不上,这就是为何我们做这类程序到处都会讲效率!回到原来的例子,最后就是让程序从这2560000种可能种选出最好的情况走,怎么选择?如何让程序知道哪种情况对自己有利?这就是局面评估涵数,好的评估涵数能避免搜索部分大量无畏的搜索从而节约时间,回头我们再说阿尔发贝塔怎么来加快搜索。我们知道过河的兵比不过河的兵贵重,当头兵比边兵贵重,在九宫中心的兵甚至比一个马还要贵重,这样每种棋子就会有一个与绝对位置相关的价值,称为子力价值,我的程序直接照搬了开源的象眼软件的子力价值表,当然还有很多因素决定一个局面的好坏,我没有做研究,我把这个任务交给了搜索引擎,我们回头说搜索,试想下,如果我们的搜索深度为八大概有几种可能?6553600000000种!这样个天文数字既使计算机素度很快了也要很长时间,我们假设一秒可以评价五十万种情况的好坏,要评价完这么多种情况大约需要207813年,那时候你都成化石了!那该怎么办?剪枝!这么多情况中有很多是不用评价好坏的,比如对方将军,我们就没必要考虑毫无关系的棋子该怎么走,由那几种毫无关系的走发延伸出来的所有走发都不用考虑,因为你选择他们的话对方就会吃掉你的将,你就挂了!就是说我们知道那些走发很不好就行了,没有必要知道到底有多坏!这就是阿尔发贝塔剪枝,我们没必要考虑那些已经足够坏的情况了。但是这有一个问题,如果我们已经考虑了所有情况才开始剪枝,那将是毫无意义的!因为我们已经花了大量时间去考虑所有情况了,但要是我们刚搜索没多久就可以剪枝了,那就会剪掉大量不用考虑的情况,节约大量时间!这就是说待搜索的情况的排序是关键,如何排序?根据什么排序?历史启发!有些比较好的走发的后续走发中往往会有更好的走发(对对手来说就是坏),我们就优先搜索他就会尽量早的剪枝,一个多次被搜索到并认为是好的走法我们就优先搜索他,这就是所谓的历史启发!总的来讲就这么多,但这还不行,还有许多细东西,这只是个框架,比如将军的时候你就得多往后想几步,看会不会将死,就是深度要在原来的基础上加一,这就是将军延伸,还有胡相吃子就是换子的时候也要延伸,这就是兑子延伸,再就是检测重复,有很多都是询环出现的,我们没必须都考虑,还有就是迭代加深实现时间控制!我考,感想都快写成教程了!有这方面兴趣的加我QQ377693703共同学习下哈

软件下载地址:http://files.cnblogs.com/lipf/%E4%B8%AD%E5%9B%BD%E8%B1%A1%E6%A3%8B.zip
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: