概述 (源码在最后)
早些年,IBM研发的深蓝机器人战胜了当时的国际象棋冠军,引发了人们对人工智能的关注, 去年,谷歌的alphaGo战胜了李世石九段,又引发了一场人工智能和机器学习的热潮。随着新算法的和算法变种的出现,人工智能特别是机器学习领域又被推向了计算机行业的风口浪尖。如今人工智能已经深入到生活的各个方面,比如手机上的siri,电脑上的小娜,离我们最近的可能是各种推送的广告也越来越智能化。本文讲述一种基于机器学习的智能五子棋的实现方式,以丰富我们的业余生活。
现状:
目前网上有一些五子棋AI程序,大部分是基于最大最小树的剪枝算法,或者是一些自定义的算法,无法达到机器自我学习的目的,也基本没有禁手规则。
在不考虑禁手的情况下,五子棋的走法并不复杂,传统通过递归树的方法已经可以让机器达到很厉害的水平。
目的:
传统算法AI走棋套路固定,不灵活,下多了就没意思,而本文实现的功能机器可以随着游戏的进行改变下棋的手法,从而提高灵活性,并加入禁手功能,让游戏更有乐趣。
设计:
首先,定义一个五子的棋学习问题:
任务T:下五子棋
性能标准:人机对战中取得更高的胜率
训练经验:和人类下棋
列出这个问题后,根据米切尔的机器学习一书,我们缺少目标函数和目标函数的表示,这里目标函数是以传统的给棋盘定义一个分值的方法出。
分值包括棋盘上1子、2子、3子、4子、5子的个数,以及每颗子周围的形势、所处位置的好坏,目前我们用到了16种因素,这些因素分别记作X1,X2,X3,X4... 每一个因素都包含一个分值,记做θ1,θ2,θ3,θ4... 那么期望H的表达式写作(下面表达式省略了后面n个 ..+ θiXi):
这个函数是一个多维的一阶线性函数,由此可以看出,我们可以把五子棋的下棋方法简化成为在多维度上的分类的问题。
以上函数表示的是棋盘的实际值,那么我们怎么来获取棋局的期望值呢?有一个方法:因为这盘棋最终会得到一个输或者赢的结果,那么这个结果期望可以用作最后一步前一步的期望,依次倒推,则可以使用下一步(我下一手后,对手再下一手)的实际值作为当前的期望。
下完后,根据最小二乘法,把每一步的误差加起来,得到一个总误差J(θ):
这里,y(i)是第i步的期望输出。
我们的目的是调整θi的取值来使误差达到最小化,要求误差的最小化,实际上就是当θ变化的时候,J(θ)变化最小,即J(θ)对θ求偏导,得到其最小的变化率,就是目的所在。
根据米切尔机器学习第四章,期望向量实际上与权向量θ的关系是一个负梯度的关系,所以θ(也叫做权)的表达式:
这个公式也叫做梯度下降法则,以下是J(θ)对θ求导过程:
代入上面的梯度公式,得到:
所以对于每个权,θi := θi+ n*Xi*(E-O) ,其中 n是系数,E是期望输出,O是实际输出。
利用这个公式,每走一步都对当前棋盘形势对应的权进行调整。
算法
另外,我们需要一个算法来指导机器走棋,当然最简单的方法是对每一个位置都进行模拟下子,得到对应的期望值,然后以期望值最高的一步作为最终下的点。
这里使用的方法是使用最大最小搜索树,其原理是先模拟自己下一步棋,把下棋后的期望记下,然后在此基础上,模拟对手下棋并再次计算期望,将期望差相减,得到差值最大的一步棋。主要的伪代码如下:
遍历可走的位置:
下棋,计算期望
遍历对手可走的位置:
对手下棋,计算期望
如果下的棋超过了上一轮下棋的期望,返回 #剪枝,该位置对手期望大,肯定不能走
如果超过了上一次的期望,记下
对手遍历结束,返回本轮下棋最大期望
如果这轮期望差大于上一轮,则记下期望差,并记下下棋的位置 #要找出期望差最大的位置
遍历结束,得到期望差最大的点
使用上述逻辑,我们基本可以打败一般的对手,上述代码可以是递归的,传统的下法是让这个算法递归n次,从而下出比较牛逼的棋,而我们并没有这么做,因为如果一味递归,就减弱了机器学习的意义,而且普通人下棋只会凭感觉,并不会考虑后面n手棋。
调试和发现的问题
调试是一个麻烦的过程,首先,我们没有样本,所以先按照网上的经验给了权值一些适当的初始值,在调试过程中,发现这些权值的大小直接影响机器的抉择,某个值一定幅度的偏差会导致机器变得很傻逼。
另外,我们设计开始加入一些跟大局观相关的因素,这是创新点,让机器不走死套路。在调试的时候发现,某些因素是错误的,会导致棋盘后期权重盖过主因素,使机器变得越来越傻。另外,一些因素由于权值过高会直接影响到开局的落子。
另一个方面就是梯度下降算法自带的弊病,一是收敛速度比较慢,二是可能收敛到局部最小值,我们仅靠个人下棋训练没办法使其达到很高水平。相反,烂的下棋者会让机器因为变得容易获胜而强化烂的走棋线路。
经过几百盘的对弈调整,最终把权调整到一个相对好的值。
当然,最后发现也存在不少的问题,主要有一下几点:
1、目前对于棋盘的胜利因素考虑不够周到,使得机器有时候还是会出现一些小失误。
2、权重不够好,比如有时候机会会下双活三,而放弃堵黑棋的活三。
3、不支持手机,因为坐标问题,还不支持手机点击
改进
继续优化棋盘胜利因素,并手动导入一些训练样本,得出最好的权值。
由于坐标问题,暂时不支持手机浏览器,考虑改进支持。
另外再优化一下界面会更好,现在是一个网络版,可以直接访问网页进行游戏。点击此处进行游戏
参考文献:
1、《机器学习》 ([美]米歇尔(Mitchell,T.M.) 2014年 机械工业出版社
2、《神经网络与深度学习》吴岸城 2016年6月
3、http://blog.chinaunix.net/uid-25267728-id-4678802.html
4、http://avicha.github.io/fivechess/
源码比较乱,多多包涵 http://lazypos.pw:8080/new.rar

一种基于机器学习的五子棋实现相关推荐

  1. 论文研读-AI4VIS-可视化推荐-VizML: 一种基于机器学习的可视化推荐方法

    VizML: 一种基于机器学习的可视化推荐方法 1 论文概述 1.1 摘要 1.2 引言 2 问题陈述 3 相关工作 3.1 基于规则的可视化推荐系统 3.2 基于机器学习的可视化推荐系统 4 数据 ...

  2. 一种基于机器学习的电影推荐系统设计

    摘 要 在互联网时代下,信息量呈指数级增长.海量数据以0.1 方式编码存放在磁盘等设备中非常方便,但是对于人类来说,我们的脑容量有限,在海量数据中挑选出适合自己的信息变得非常困难.简直如大海捞针,即使 ...

  3. 基于机器学习的网络安全态势感知

    人工智能技术与咨询 点击蓝字 · 关注我们 来源:<计算机科学与应用> ,作者杨怡等 关键词: 机器学习:态势感知:关联分析:攻击场景重建 摘要: 摘要: 在传统网络防御手段抵御攻击的基础 ...

  4. 人工智能里一种实现机器学习的技术

    值得一提的是,机器学习和深度学习是有区别的.一种实现机器学习的技术,它的机器学习意味着计算机算法可以像人一样从数据中找到信息,从而学习一些法律.虽然深度学习是一种机器学习,但深度学习使用深度神经网络来 ...

  5. 基于机器学习算法的LTE高投诉小区预判方法

    摘要:将用户投诉映射到网络性能问题,并利用机器学习算法建立 4G KPI 与用户投诉之间的关联,构造基于网络性能指标的用户投诉预警模型.以用户感知层面的大数据分析结论为抓手,提升网络优化和网络运维的质 ...

  6. 一种基于Gradient Boosting的公交车运行时长预测方法

    一种基于Gradient Boosting的公交车运行时长预测方法 赖永炫1,2, 杨旭3, 曹琦4, 曹辉彬1,2, 王田5, 杨帆6 1 厦门大学信息学院,福建 厦门 361005 2 厦门大学深 ...

  7. 论题:基于机器学习的垃圾邮件过滤系统

    目录 摘要 1.引言 2.相关工作 3.数据集与特征提取 4.机器学习模型的设计与选择 5.模型优化与融合策略 6.系统实现与应用 7.结论 本文为论题:基于机器学习的垃圾邮件过滤系统的撰写思路. 摘 ...

  8. 可持续5G环境下基于机器学习的网络分片框架

    Machine Learning-Based Network Sub-Slicing Framework in a Sustainable 5G Environment 5G环境下的物联网框架 5G切 ...

  9. python lncrna_一种基于序列组成,结构信息及理化特征的lncRNA鉴定方法与流程

    本发明属于生物信息领域,尤其涉及lncRNA的鉴定. 背景技术: : 在人类基因组中,有80%的序列具有生物学功能,而编码蛋白质的序列只占基因组的不到 2%.我们将长度大于200碱基,不能编码蛋白质的 ...

最新文章

  1. 【儿童成长心理学】第一章 引言
  2. linux默认归档目录,Linux系统管理(第4章:目录和文件管理二)
  3. volatile关键字的作用
  4. html5 canvas 图像预览,html5-canvas 加载并显示图像
  5. 命令行编译和运行java
  6. redid过期策略_Redis数据过期策略详解
  7. Silverlight语音朗读
  8. window下的免安装redis
  9. 问题十:【总结】解决了问题四~问题九,vec3这个类的代码应该都能看懂了
  10. linux系统调用劫持隐藏进程,linux 下隐藏进程的一种方法及遇到的坑
  11. StringFormate使用
  12. agd插值算法_插值算法(一):各种插值方法比较
  13. Magento二次开发哪家好呢?
  14. 链游时代来临!1周12款游戏与公有区块链MagnaChain签约上链
  15. 计算机用户接入广域网的技术,第五章广域网接入技术全解.ppt
  16. 【编译原理】 实验三 LL(1)分析法(LL1分析表的自动生成)
  17. uCOSIII移植stm32c8t6
  18. “身、口、意”三业,而其中尤其以口业为重,认为口业是:患苦之门,祸累之始。
  19. 文本信息事件信息抽取的方法
  20. 求一个数的二进制中有多少了 1 的三种算法 ——Java篇

热门文章

  1. 钉钉无法同步手机日历
  2. 【Docker实战】使用Docker部署Tomcat
  3. 系统学习javaweb-06-javascript
  4. 「SQL面试题库」 No_92 餐馆营业额变化增长
  5. B站上传字幕问题解决
  6. 前端每日实战:88# 视频演示如何用 CSS 和 D3 创作火焰动画
  7. 蓝牙|BLE Mesh详解
  8. LINUX下dns的搭建(主dns和辅助dns)
  9. 如何成为CNNIC域名注册服务机构及域名注册服务机构申请书
  10. 堆漏洞挖掘——__lib_malloc函数、_int_malloc函数、__lib_free函数源码详解