中国象棋博弈程序研究与实现
来源:互联网 发布:京东装修和淘宝一样吗 编辑:程序博客网 时间:2024/05/16 13:47
今年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密码流算法实现置换表的阶段。期间想转向用面向对象的方式架构,但是写了一半发现架构的不好,又反复回了面向过程+全局变量访问器等方法,想要效率,又要时一个类只负责单一工作,类的职责不好划分)
- 中国象棋博弈程序研究与实现
- 中国象棋的人机博弈程序
- 中国象棋的人机博弈程序
- Java中国象棋博弈程序探秘[6]——游戏与界面
- 中国象棋程序的设计与实现(零)--原始版源码
- 中国象棋程序的设计与实现(一)--项目截图
- 中国象棋程序的设计与实现(二)--源码
- Java中国象棋博弈程序探秘[5]——搜索算法
- Java中国象棋博弈程序探秘[1]——博弈程序开发概述
- 中国象棋程序
- 中国象棋程序的设计与实现(三)--2012本科毕业论文等重要文档资料
- 中国象棋程序的设计与实现(四)-- 一次“流产”的写书计划
- 中国象棋程序的设计与实现(五)--回答CSDN读者的一些问题
- 中国象棋程序的设计与实现(七)--心得体会和开发日志
- 中国象棋程序的设计与实现(八)-如何构造一个棋子(車馬炮等)
- 中国象棋程序的设计与实现(九)–棋子点,棋子的小窝
- 中国象棋程序的设计与实现(十)--棋盘的定义和绘制
- 中国象棋程序的设计与实现(十一)--第2次回答CSDN读者的一些问题
- SOJ 4042 计算几何+三分
- VB控件数组的操作技巧(混合文本)
- Android原理揭秘系列之动态墙纸
- linux下svn命令大全
- 用C#编写简单的“图像滚动展示动画效果”
- 中国象棋博弈程序研究与实现
- 高质量C++编程学习笔记
- [wxPython学习]使用PubSub机制来更新视图
- android 札记二 在批处理和shell script中运行android
- SPI通信协议
- Ext 点滴
- Oracle 建立表空间
- error code
- ByteToStr