人机版五子棋两种算法概述
人机版五子棋是很有挑战性的。至今好像没有保证可以取胜的算法,但已经有不少写的很专业的五子棋程序了。我在编写五子棋的过程中参考了不少资料,发现人机五子棋大致有两种策略。在这儿总结一下,与大家共享。先说两种算法,然后介绍一点五子棋的专业知识。有些地方表述不清,望见谅,如有表述不清的地方,可以回帖讨论。
此类算法有一点是相同的,就是要对整个棋局或其中的有效位置进行评价。往往会使用一个分表。而评分表却很难确定,也没有所谓最好的,有人根据经验和测试,总结了不错的评分表,我在程序中都是用的别人的评分表。
第一种方法是很简单的,但是效果也是很好的。从运行结果看,这么简单的方法达到如此的水平,着实让我吃了一惊。当然,这是跟第二种算法比较的感觉。大致思路如下:
评估当前棋局中,哪个位置的得分最高。五子棋要赢,必然要有五个棋子在一起成线,那么我们就可以计算棋盘中每一个五格相连的线,一下称之为五元组。一般情况(包括专业五子棋)下棋盘是15*15的。那么应该是572个五元组。同时,针对五元组中黑子和白子的数量(可以不考虑相对位置)的不同,给该五元组评不同的分。然后每一个位置的得分就是包含这个位置的所有五元组的得分之和。 下面是我的程序中用的表示方法及其评分表。
说明:当五元组为空,分数为7,不为零的原因是,还有跟糟的情况:五元组中既有黑子又有白子,五元组也就是无效了,这时才给0分。这个评分表是我在一个老外的程序中找到的,这是我见到的几个评分表中最出色的。
- // tuple is empty
- Blank,
- // tuple contains a black chess
- B,
- // tuple contains two black chesses
- BB,
- // tuple contains three black chesses
- BBB,
- // tuple contains four black chesses
- BBBB,
- // tuple contains a white chess
- W,
- // tuple contains two white chesses
- WW,
- // tuple contains three white chesses
- WWW,
- // tuple contains four white chesses
- WWWW,
- // tuple does not exist
- Virtual,
- // tuple contains at least one black and at least one white
- Polluted
- tupleScoreTable[0] = 7;
- tupleScoreTable[1] = 35;
- tupleScoreTable[2] = 800;
- tupleScoreTable[3] = 15000;
- tupleScoreTable[4] = 800000;
- tupleScoreTable[5] = 15;
- tupleScoreTable[6] = 400;
- tupleScoreTable[7] = 1800;
- tupleScoreTable[8] = 100000;
- tupleScoreTable[9] = 0;
- tupleScoreTable[10] = 0;
至于如何有效统计这么多五元组的得分,就自己想吧,我在写的一个程序中第一次写为了便于自己和朋友理解,居然计算了两遍,但是条理清晰。这就是在可读性和效率之间来个折中了。
就这种算法,我写了一个程序,供大家参考:https://github.com/zhijie/Gobang
===============更新=========================
同时还有个中国象棋的源码 https://github.com/zhijie/ChineseChess vc版
后来学习android时,写了个android版的中国象棋,源码如下:
https://github.com/zhijie/ChineseChess4Android
第二种算法是使用正规军中的博弈算法。在极大极小值搜索中应用alpha-beta剪枝。
使用这种算法,就是估计几步之内(步数越多,时间越长,自己根据实际情况决定)放在哪个位置最有利。根据当前局面,评估每一个可以落子的位置,看看在这儿落子后的得分怎样。极大极小值搜索就是在估计自己走的时候,选得分高的,估计别人走的时候,选得分低的,这儿的低是对自己而言的,也就是假设对手选了对他最有利的位置,淡然就是让我们得分最低的位置了。然后这样假设几步,选最好的。因为这样的搜索控件往往太大了,就是用剪枝,对没有必要的走步就不用分析了。
这种算法的评分方式跟第一种不同,第一种方法是评估当前棋局的每一个位置的得分,找最优的。而这里是对假设的每一种走步的局面进行评估,选能够到达最优局面的位置落子。
这种算法属于经典的而且应用很广的算法。很多书上都有介绍。我就不多次一举了。而且我也不一定能说清。
这里给出山东师范大学董红安在2005年的硕士毕业论文中使用的的评分表
有时间我会把这种算法的五子棋写一下
下面提一下五子棋的专业知识
国内已有一些编程比赛是针对博弈的
那么就有了一些规定;在五子棋方面,比赛多使用专业五子棋比赛规则。主要是禁手,为了尽量公平,对先落子的一方(先手)下禁手,就是一些技术不能再用,用则为输。我找了一个禁手的图示
另外一点,为了使自己的程序更智能,先手一般会使用经典开局
因为根据经验,先手的某些开局赢的可能性更大。这种可能性的来源是,这种局面要有尽量多的两个子在一起的情况。这是26种经典开局,可以应用到自己的程序中
人机版五子棋两种算法概述相关推荐
- 深度优先搜索(DFS)和广度优先搜索(BFS)两种算法c++
1.BFS和DFS介绍 深度优先搜索(DFS)和广度优先搜索(BFS)是一种用于遍历或搜索树图的一种算法,在这个过程中保证图或数的每个结点被访问且仅被访问一次,再按照每个结点访问的顺序不同分为深搜和广 ...
- 剪拼子字符串——常规、另类两种算法解CSDN竞赛第八期第一小题
[点击此处跳转笔记正文] Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基 ...
- “斐波那契数列”的两种算法
"斐波那契数列"的两种算法 斐波那契数列有个规律:从第三个数开始,每个数是前两个数之和,比如: 1 1 2 3 5 8 13 21 34 55...... 现在通过两种方式(递归与 ...
- ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能
ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 estimator = PC ...
- ML之RFDT:利用RF(RFR)、DT(DTR)两种算法实现对boston(波士顿房价)数据集进行训练并预测
ML之RF&DT:利用RF(RFR).DT(DTR)两种算法实现对boston(波士顿房价)数据集进行训练并预测 目录 输出结果 实现代码 输出结果 1.两种算法的预测结果 2.回归树的可视化 ...
- 在.Net framework下遍历XML文挡树的两种算法
在阅读ASP.NET_XML深入编程技术 (PDF格式)一书的时候,发现遍历树的两种算法:深度优先和广度优先遍历文挡树,前一种需要使用递归,后者则不需要,本人大学时期数据结构学的不好,每每涉及到树,总 ...
- Fletcher-Reevers Conjugate Descent和Steepest Descent两种算法中伪代码的区别
本文主要用来比较两个算法到底差别在哪里 step Fletcher-Reevers Conjugate Descent Steepest Descent 1st1st1st 选择初始点x(1)选择初始 ...
- java进程调度怎么画图,[Java教程]进程调度的两种算法JAVA实现
[Java教程]进程调度的两种算法JAVA实现 0 2015-10-21 12:00:08 (SJF分为preemptive shortest job first(抢占式)和non-preemptiv ...
- 在一个请求分页系统中,假定系统分配给一个作业的物理块数为 3,并且此作业的页面走向为 2、3、2、1、5、2、4、5、3、2、5、2。试用 FIFO和 LRU 两种算法分别计算出程序访问过程中所发生
页面置换算法 题目: 在一个请求分页系统中,假定系统分配给一个作业的物理块数为 3,并且此作业的页面走向为 2.3.2.1.5.2.4.5.3.2.5.2.试用 FIFO和 LRU 两种算法分别计算出 ...
最新文章
- 微软2013暑期实习笔试题目第5题分析
- 直播报名 | 官方解读NVIDIA黑科技:StyleGAN的架构与实现
- 06_NoSQL数据库之Redis数据库:Redis的高级应用之登录授权和主从复制
- java ajax定义_Ajax的定义
- 排序算法Java代码实现(二)—— 冒泡排序
- 《C和指针》——宏中容易出现的错误
- 2-2:python之控制结构
- 架构之路 参考MySpace
- 技术领导者 第44讲|空降技术高管的“择业七计”
- Tenor 和numpy array 相互转换
- 电脑远程桌面连接怎么操作?
- 实习期运维工程师一些日常问题的汇总
- 13.3 跳格子游戏
- 一个有趣的反病毒软件测试
- thinkphp更新mysql数据库表_ThinkPHP 创建新表、创建数据库讲解
- 虚拟空间+AI设计是锦上添花吗?|​聊聊虚拟空间设计
- VS2003遇到问题,无法打开d3d9.h
- win7 下jlink v8固件修复
- 记录我的大疆无人机消费体验
- 在对象内部尽量直接访问实例变量 --Effictive Objective-C 抄书
热门文章
- iOS 15增加更多新的小组件
- Nginx Web 基础入门
- 图情论文笔记 | 图书情报档案机构如何助力乡村振兴?
- [推荐](穆穆推荐)如果你现在不成功,请看看你是不是选错了老板
- MATLAB 最小二乘法
- ROC:Receiver operating characteristic Curve接受者操作特征的理解
- 高配云计算机平台,云电脑真的来了!小破本也能秒变高配
- 43-高级路由:BGP 起源属性:修改为e
- 使用eagle导出PCB制造商可用的gerber文件
- BigDecimal ROUND_HALF_DOWN精度问题