远古人工智能,用博弈树实现的五子棋博弈系统

  • 博弈树之我见
  • 估值函数
  • 如何择点下棋
  • 决策树使用
  • 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.

攻城狮成长日志(五):远古人工智能,用博弈树实现的五子棋博弈系统(附原码)相关推荐

  1. 攻城狮久坐腰疼需要一把好的人体工学椅,附双11人体工学椅开箱体验

    目录 一.人体工学是啥? 1.办公室病 2.Ergonomics 3.人体工学椅子的优势 二.如何选择人体功能学椅子? 1.我觉得品牌和销量是避免掉坑的基石. 2.当然是预算 3.需要有前倾调整功能 ...

  2. Copy攻城狮辛酸史:含泪“一分钟”跑通MindSpore的LeNet模型

    摘要:一个Cope 攻城狮用切身实例告诉你: Cope代码体验一时爽,BUG修改花半天. 前言:此文为r0.7-beta的操作实践,为什么我的眼里常含泪水,因为我对踩坑这件事爱得深沉.谨以此文献给和我 ...

  3. 【软考】软件攻城狮考试(四)——面向对象

    一.攻占第二城~~ 前一篇<[软考]软件攻城狮考试(三)--软工>小编已经征服了这个国家,已经收获了很多的知识,接下来又是一个劲敌--面向对象,这个国家依旧是一个没有太大的实力,但是国土面 ...

  4. 硬件攻城狮最常用的五个购物网站分享

    2020年5月29日,周五,天气晴,距离周末双休还有半小时,闲暇之余,给广大硬件攻城狮分享一下鄙人常用的五个购物网站 NO.1 鄙人最常用也是最方便的网站  深圳嘉立创商城 网址:https://ww ...

  5. 【挨踢人物传】tao61:做一个许三多式的IT攻城狮(第2期)

          告诉你一个群体,一个在光怪陆离的IT圈混迹的群体.他们自称程序猿(媛).攻城狮.挨踢民工,一面乐观的自嘲,一面努力的工作.提起他们,你也许想到了张江男,想到了眼镜.T恤.牛仔裤.运动鞋.双 ...

  6. 秋招攻略—如何成为一名图像算法攻城狮(上篇)—知识学习篇

    秋招攻略-如何成为一名图像算法攻城狮(上篇)-知识学习篇 从6月份开始一直到现在,5个月的秋招历程让我成长了许多,最终收到了华为.荣耀.vivo.科大讯飞.奥比中光.汇川等10余家公司的图像算法off ...

  7. 一位Java开发攻城狮的自我修养之项目篇

    攻城狮的自我修养之项目篇 基础知识 Java基础 SpingBoot SpringCloud LeetCode题库 大数据 项目实战 商城系统 权限管理系统 脚手架系统 人事管理系统 论坛系统 博客系 ...

  8. 联合Java攻城狮社区,推出Java技能树有奖征文活动,期待你的加入

    目录 一.立志存高远,笃行践初心 二.如何学习Java? 三.哪吒造Java技能树 1.CSDN官方技能树 2.哪吒造山寨版Java技能树 3.技能树评委 4.通过打榜赢取精美礼物 5.如何参与Jav ...

  9. 【网易云信招聘啦】216位攻城狮,呼唤7个好基友

    Hi,猿 过年了 年终奖拿了没 老板给加薪没 耿耿于怀的你 是否各种隐忍沮丧 以下代表,你属于哪一个? 猿A 公司是创业公司,还未盈利,为了产品上线,付出很多,能力提升了很多.不过,项目不赚钱,没人在 ...

  10. 十年北漂,一个软件“攻城狮”到职业养鸡人的心路历程

    本人(武建亮)IT屌丝出生, 2005年到北京,2006年开始正式成为程序员,曾任某公司的技术总监. 2011年开始创业,曾做过电子商务网站.礼品网.智慧旅游相关的创业项目. 2014年底,再一次创业 ...

最新文章

  1. 开源生态也难逃“卡脖子”危机?中国AI开发者的警醒和突围
  2. 刷个B站的功夫就能把Python学了,微软放出短视频入门课,资料登上GitHub热榜第一...
  3. js经典校验之注册与登录校验
  4. mysql gno( )_MySql笔记(一)
  5. 二进制编译安装mysql_MariaDB通用二进制编译安装详解
  6. ORACLE经常使用系统查询
  7. 高中生兴趣班c语言,C语言电脑编程兴趣班测试题目资料.doc
  8. 会动的图解!GMP模型里为什么要有P?背后的原因让人暖心
  9. mosquitto支持websocket的使用方法
  10. vue.js入门环境搭建
  11. 海滨学院计算机基础知识,北京交通大学海滨学院计算机基础考试卷-网络应用基础...
  12. 解决vm安装过程显示无人参与应答文件包含的产品密钥无效
  13. 初中信息技术考试:Python试题及答案
  14. linux远程控制木马,Kali Linux-使用Shellter生成远控木马并进行持久化控制
  15. 关于服务器磁盘配额超出的问题解决(报错源码是Disk quota exceeded)
  16. 飞流直下兄弟连,疑似项目化云烟
  17. 微信小程序云开发数据库操作
  18. Docker/Podman使用入门---从容器构建镜像 提交镜像到服务器UCloud dockerhub
  19. 免费分享:5本安卓开发经典书籍,Android 7编程入门经典(第4版),Android底层驱动分析和移植,底层驱动分析和移植
  20. 平安居家养老服务上市

热门文章

  1. 微信小程序-wxs实现时间格式化过滤器(正则)
  2. windows 7远程桌面和被远程连接电脑启动远程桌面服务
  3. VBA字典数组转置维度变化
  4. android图案解锁忘了怎么解,安卓手机解锁图案忘了怎么办?手机解锁密码忘了怎么办?...
  5. 定义结构体变量的三种方法
  6. python取字母以及数字随机数
  7. buctoj-python 2022.6.19
  8. c语言单片机仿真keil,如何在keil中仿真stm32单片机
  9. 如何在vue项目中增加网页logo
  10. js 日语索引 日文排序