攻城狮成长日志(五):远古人工智能,用博弈树实现的五子棋博弈系统(附原码)
远古人工智能,用博弈树实现的五子棋博弈系统
- 博弈树之我见
- 估值函数
- 如何择点下棋
- 决策树使用
- Alpha-Beta剪枝
- 总结
博弈树之我见
想必各位都听说过人工智能,但未必听说过博弈树.其实博弈树属于比较传统的一种人工智能算法,其一般被运用到对弈的游戏中.通过对棋局作估值,采用极大极小搜索的办法,近似的搜索出最佳的棋局方式,进而模仿人类的下棋方式.
碰巧课设需要设计一个棋类的对弈系统,就刚好将这个算法稍稍了解并记录了下来.
估值函数
使用博弈树的前提是少不了设置估值函数,估值函数指的是,对应当前棋局,你觉得好不好?有多好?将这个设成一个具体的量值.那么就五子棋来说如何判断一个棋局好不好呢?方法如下:
首先是对棋型我们需要提供一个对应的分值.例如,在五子棋中,五个子相连称为“长连”,将其分值设为100000,对于四子相连且没有被封堵的,称为“活四”,对“活四”我们也赋予一个分值1000…当设定完以后,我们采用遍历的方式,搜集整个棋盘的横竖正斜负斜的所有的信息,组合成字符串.通过正则匹配的手段判断是否存在对应的棋型,将分值相加做到评估局面的效果
正则匹配对应的棋型:
如何择点下棋
在有了决策树以后,我们是可以开始下棋了,但是我们想一想,一个棋盘有15*15个点,我们如何去选择一些最佳的点呢?我采取的方法是用对已经下的点周围下的决策,来选取点.具体的策略如下图:
这样既可以保证当前的择点有效,同时也能够让搜索最小化降低时间复杂度.
决策树使用
关于决策树,同我们数据结构中学的树其实类似的你不废话么 唯一不同的是,由于决策树模拟的是双方轮流下棋的决策,因此,需要采用极大极小循环决策,即在己方情况我想获得最大的分值,在对手下的时候我想让他尽可能下的烂.基于这个我们写出了下面的代码:
public float Alpha_Beta(int depth,String color,String anothercolor,Vector<Integer> points,float alpha,float beta) {/*进行alpha和beta剪枝以及递归的过程*/if (depth == MaxDepth) {/*如果到达了递归深度,直接返回当前局面的值就好了*/return Counting_Points(color,anothercolor)-2*Counting_Points(anothercolor,color);}if(depth%2 == 0) {for(int k=0;k<points.size()-1;k+=2) {int i=points.get(k);int j=points.get(k+1);board[i][j] = super.color; Vector<Integer> newpoints = Found_Points();float s = Alpha_Beta(depth+1,anothercolor, color, newpoints,alpha,beta);alpha = Math.max(s, alpha);board[i][j] = 0;if(alpha>=beta) {/*如果该节点的下确界大于父节点的上确界,则直接剪枝*/return alpha;}}return alpha;}else {for(int k=0;k<points.size()-1;k+=2) {int i=points.get(k);int j=points.get(k+1);board[i][j] = super.anothercolor;Vector<Integer> newpoints = Found_Points();float s = Alpha_Beta(depth+1,anothercolor, color, newpoints,alpha,beta);beta = Math.min(s, beta);board[i][j] = 0;if (alpha>=beta) {/*如果节点的上确界小于父节点的下确界,则直接剪枝*/return beta;}}return beta;}}
在上面的代码注释中我们可以看到,我使用了剪枝的操作,那么剪枝又是什么呢?
Alpha-Beta剪枝
剪枝其实是为了加快不必要的搜索,由于是交踢采用极大极小决策的树,必定存在着情况如:1.父节点的极小值大于子节点的极大值,2.父节点的极小值大于子节点的极大值.因此这些搜索就没有必要接着进行下去了,即已经可以采取剪枝的策略了.如下图就是一个剪枝的实例:(图片出自转载)
图中的B节点的极小值已经大于C节点的第一个检索值,即存在min>max的情况,故直接搜索了下一棵树
总结
至此,基本的博弈树算法已经介绍完了,对于博弈树的算法优化其实还有很多可用,例如我从论文中看到的使用些许棋谱实现的启发式搜索,通过载入一些已经存在的棋局实现对应的局面,可以加强Ai的智能,其余的优化算法各位可以看我引用的那些论文和博客,都是确实对优化和理解算法实用的干货.
最后,我个人的系统原码也已经放在了我的GitHub上,各位有兴趣可以下载参考,只是记得给我点个star就很好啦.
最后,还得感谢我的组员实现的前端界面和数据库,虽然算法很重要但没有我的队友白凤,夜默,罗同学,也不可能有这个完整的系统.
GitHub原码
基于α-β剪枝算法的智能五子棋
阿尔法α-贝塔β剪枝
[1] 程宇, 雷小锋. 五子棋中Alpha-Beta搜索算法的研究与改进[J]. 计算机工程, 2012, 38(17):186-188.
[2] 张明亮, 吴俊, 李凡长. 五子棋机器博弈系统评估函数的设计[J]. 计算机应用, 2012, 32(07):1969-1972.
[3] 严小卫, 莫建文. 智能五子棋的设计与实现[J]. 广西师范大学学报(自然科学版), 1999(4):11-14.
[4] 王长飞, 蔡强, 李海生. 智能五子棋算法的设计实现[J]. 系统仿真学报, 2009(04):132-135.
攻城狮成长日志(五):远古人工智能,用博弈树实现的五子棋博弈系统(附原码)相关推荐
- 攻城狮久坐腰疼需要一把好的人体工学椅,附双11人体工学椅开箱体验
目录 一.人体工学是啥? 1.办公室病 2.Ergonomics 3.人体工学椅子的优势 二.如何选择人体功能学椅子? 1.我觉得品牌和销量是避免掉坑的基石. 2.当然是预算 3.需要有前倾调整功能 ...
- Copy攻城狮辛酸史:含泪“一分钟”跑通MindSpore的LeNet模型
摘要:一个Cope 攻城狮用切身实例告诉你: Cope代码体验一时爽,BUG修改花半天. 前言:此文为r0.7-beta的操作实践,为什么我的眼里常含泪水,因为我对踩坑这件事爱得深沉.谨以此文献给和我 ...
- 【软考】软件攻城狮考试(四)——面向对象
一.攻占第二城~~ 前一篇<[软考]软件攻城狮考试(三)--软工>小编已经征服了这个国家,已经收获了很多的知识,接下来又是一个劲敌--面向对象,这个国家依旧是一个没有太大的实力,但是国土面 ...
- 硬件攻城狮最常用的五个购物网站分享
2020年5月29日,周五,天气晴,距离周末双休还有半小时,闲暇之余,给广大硬件攻城狮分享一下鄙人常用的五个购物网站 NO.1 鄙人最常用也是最方便的网站 深圳嘉立创商城 网址:https://ww ...
- 【挨踢人物传】tao61:做一个许三多式的IT攻城狮(第2期)
告诉你一个群体,一个在光怪陆离的IT圈混迹的群体.他们自称程序猿(媛).攻城狮.挨踢民工,一面乐观的自嘲,一面努力的工作.提起他们,你也许想到了张江男,想到了眼镜.T恤.牛仔裤.运动鞋.双 ...
- 秋招攻略—如何成为一名图像算法攻城狮(上篇)—知识学习篇
秋招攻略-如何成为一名图像算法攻城狮(上篇)-知识学习篇 从6月份开始一直到现在,5个月的秋招历程让我成长了许多,最终收到了华为.荣耀.vivo.科大讯飞.奥比中光.汇川等10余家公司的图像算法off ...
- 一位Java开发攻城狮的自我修养之项目篇
攻城狮的自我修养之项目篇 基础知识 Java基础 SpingBoot SpringCloud LeetCode题库 大数据 项目实战 商城系统 权限管理系统 脚手架系统 人事管理系统 论坛系统 博客系 ...
- 联合Java攻城狮社区,推出Java技能树有奖征文活动,期待你的加入
目录 一.立志存高远,笃行践初心 二.如何学习Java? 三.哪吒造Java技能树 1.CSDN官方技能树 2.哪吒造山寨版Java技能树 3.技能树评委 4.通过打榜赢取精美礼物 5.如何参与Jav ...
- 【网易云信招聘啦】216位攻城狮,呼唤7个好基友
Hi,猿 过年了 年终奖拿了没 老板给加薪没 耿耿于怀的你 是否各种隐忍沮丧 以下代表,你属于哪一个? 猿A 公司是创业公司,还未盈利,为了产品上线,付出很多,能力提升了很多.不过,项目不赚钱,没人在 ...
- 十年北漂,一个软件“攻城狮”到职业养鸡人的心路历程
本人(武建亮)IT屌丝出生, 2005年到北京,2006年开始正式成为程序员,曾任某公司的技术总监. 2011年开始创业,曾做过电子商务网站.礼品网.智慧旅游相关的创业项目. 2014年底,再一次创业 ...
最新文章
- 开源生态也难逃“卡脖子”危机?中国AI开发者的警醒和突围
- 刷个B站的功夫就能把Python学了,微软放出短视频入门课,资料登上GitHub热榜第一...
- js经典校验之注册与登录校验
- mysql gno( )_MySql笔记(一)
- 二进制编译安装mysql_MariaDB通用二进制编译安装详解
- ORACLE经常使用系统查询
- 高中生兴趣班c语言,C语言电脑编程兴趣班测试题目资料.doc
- 会动的图解!GMP模型里为什么要有P?背后的原因让人暖心
- mosquitto支持websocket的使用方法
- vue.js入门环境搭建
- 海滨学院计算机基础知识,北京交通大学海滨学院计算机基础考试卷-网络应用基础...
- 解决vm安装过程显示无人参与应答文件包含的产品密钥无效
- 初中信息技术考试:Python试题及答案
- linux远程控制木马,Kali Linux-使用Shellter生成远控木马并进行持久化控制
- 关于服务器磁盘配额超出的问题解决(报错源码是Disk quota exceeded)
- 飞流直下兄弟连,疑似项目化云烟
- 微信小程序云开发数据库操作
- Docker/Podman使用入门---从容器构建镜像 提交镜像到服务器UCloud dockerhub
- 免费分享:5本安卓开发经典书籍,Android 7编程入门经典(第4版),Android底层驱动分析和移植,底层驱动分析和移植
- 平安居家养老服务上市