• 中国象棋软件制作感想


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

    软件下载地址:https://files.cnblogs.com/lipf/%E4%B8%AD%E5%9B%BD%E8%B1%A1%E6%A3%8B.zip

  • 相关阅读:
    jQuery 基本选择器
    JavaScriptif while for switch流程控制 JS函数 内置对象
    JavaScrip基本语法
    数据库 存储引擎 表的操作 数值类型 时间类型 字符串类型 枚举集合 约束
    数据库基础知识 管理员 用户登录授权的操作
    粘包的产生原理 以及如何解决粘包问题
    socket TCP DPT 网络编程
    2018年年终总结
    Android技术分享
    No accelerator found
  • 原文地址:https://www.cnblogs.com/lipf/p/2357100.html
Copyright © 2020-2023  润新知