【百纳BetaGo】基于蒙特卡洛搜索树的二人明牌斗地主博弈(二)
来源:互联网 发布:seo和竞价排名 编辑:程序博客网 时间:2024/04/28 01:45
前文链接:点击打开链接
前文已经提到MCTS算法取得了较为明显的成果,究其原因是算法会根据模拟出的获胜场次来选择当前动作中后续胜率最高的动作。然而mcts算法的局限性也正是这个原因引起的,因为mcts在模拟胜场的过程中并没有关于牌力的概念,就会导致只要符合出牌规则的出牌方式它都会选择去尝试,这样就会出现一些小牌能管却不管,起手出炸弹或者管牌的时候拆炸弹等等不合理的行为。也正是由于这个原因,纯粹基于mcts思想的算法虽然能够在最开始就达到较强的AI水平,但是后续的提升空间却有限(mcts算法的提升方法很粗暴:直接增加其模拟次数就可以达到优化的效果)。
如果将斗地主AI的最终目标比喻为一场格斗比赛,那么纯基于mcts的算法就像一个力大膀粗却没有脑子的壮汉,那么,如何在mcts的基础上尽可能的保存mcts算法优越性的同时改善其局限性呢?我们先必须搞清楚局限性出现的原因(我们再以壮汉举例):
一是由于内存限制,我们不可能复刻AlphaGo的做法对每一步都进行千万级模拟,然而值得高兴的是由于斗地主游戏和扑克游戏的方式规则差异性,我们可以在保证进行足够模拟的基础上尽可能的降低对机器的压力,方法很简单:原始的mcts算法是对每一步模拟规定具体的模拟次数,而我们发现在地主第一手出牌的时候由于选择的多样性,(在假定总模拟次数为1000的基础上)基本上很多分支的模拟次数都不会超过10(结果并不具备模拟代表性),这样就会出现模拟结果胜率相同的分支,而mcts则会在这些分支中随机选择一种,而如果不改变策略直接无脑增加总模拟次数,付出的代价提高了,但分到每个分支上的模拟次数却并不会有明显的提高,况且在后续的管牌情况中并不需要那么多的模拟次数,那么如何满足双方需求呢?我们的解决办法是将总模拟次数限制改为分支模拟次数限制,即设定出每个分支的模拟次数,这样既满足了出牌情况较多时的模拟要求又在分支较少时节省了内存。
二是由于算法自身限制,由于mcts并没有对牌力的认知而,只是纯粹的根据可出牌型进行尝试(包括一些很蠢的分支比如起手炸弹等等),如果将斗地主AI的最终目标比喻为一场格斗比赛,那么纯基于mcts的算法就像一个力大膀粗却没有脑子的壮汉,虽然赋予他足够的智商是很困难的的,但是我们至少可以做到能够让他具备一些基本的分辨能力,那么如何让mcts能在进行模拟之前就丢弃这些分支呢?显然mcts本身对此事无能为力的,我们的处理方法有两种:一是引入规则分类,即自己制定出一套规则价值体系,将手牌拆分组合,取前n种组合中所有出现过的牌型作为mcts的搜索分支而不再是所有可出牌型而是经过价值体系筛选后的牌组,然后将其作为模拟分支。二是直接通过经验对明显很差的分支直接进行限制甚至对某些残局情况下抛弃mcts进行强制干预。这两种方法的优缺点都显而易见,前者有着对效率的巨大提升且很大程度上保证了较差分支的存在过于依赖价值体系,而后者则对人为经验的要求很高,如果进行干预函数的设计者对斗地主游戏的认知不够,那么最终实现出来的效果可能微乎其微。经过测试我们发现前一种方法比后一种方法的实际效果要好。
经过剪枝改进二人明牌的AI水平已经达到90%,这些在明牌上的经验对于开发后续的二人斗地主暗牌有着很积极的意义。
作者:刘聪@百纳(武汉)信息技术有限公司
- 【百纳BetaGo】基于蒙特卡洛搜索树的二人明牌斗地主博弈(二)
- 【百纳BetaGo】基于蒙特卡洛搜索树的二人明牌斗地主博弈
- 斗地主-(二)
- J2ME的游戏堆积二(入门篇---斗地主)
- UE4 局域网斗地主(二)
- 斗地主牌型判断实现(二)
- NOIP2015 斗地主 解题报告(搜索)
- (noip 2015 斗地主)<搜索+贪心>
- 【noip2015】斗地主(搜索+剪枝)
- NOIP2015 斗地主 (搜索剪枝)
- 【noip2015】【搜索】斗地主
- 基于android平台的斗地主AI
- java——棋牌类游戏斗地主(webddz1.0)之二
- cocos2dx《单机斗地主》源码解剖之二 把一副扑克牌打乱(洗牌)
- java学习笔记(二十五)模拟斗地主发牌与洗牌
- QQ斗地主记牌器(流星程序集之二)
- Noip2015 斗地主【搜索】【贪心】
- UOJ NOIP2015 斗地主 [搜索]
- JDK并发包(concurrent)
- zip+密码暴力破解
- openlayers3同时加载矢量地图和卫星地图
- 史上最全的MonkeyRunner自动化测试从入门到精通(10)
- [LeetCode] 70. Climbing Stairs java
- 【百纳BetaGo】基于蒙特卡洛搜索树的二人明牌斗地主博弈(二)
- RESETLOGS,NORESETLOGS
- Ubuntu16.04下Qt交叉编译开发环境搭建
- HTML+CSS——初学笔记(三)
- JS实现点击网页判断是否安装App
- Seajs&requirejs 简介
- [LeetCode] 89. Gray Code java
- JAVA集合类汇总
- js中的面向对象入门