前言:
  炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI.

相关文章:
  德州扑克AI--Programming Poker AI(译)
  系列文章说来惭愧, 之前一直叫嚷着写德州AI, 不过可惜懒癌晚期, 一直没去实践, T_T. 相比而言, 炸金花简单很多, 也更偏重于运气和所谓的心理对抗.
  系列文章:
  1. 炸金花游戏的模型设计和牌力评估 
  2. 炸金花游戏的胜率预估
  3. 基于EV(期望收益)的简单AI模型
  4. 炸金花AI基准测试评估
  5. 动态收敛预期胜率的一种思路

EV模型:
  在EV模型中, 有如下几个概念, 手牌胜率p, 总底池pool, 玩家自身的累计总下注bet.

EV = p * (pool - bet) - (1 - p) * bet
= p * pool + (2p - 1) * bet

  当EV>0时, 则表明玩家倾向于盈利, 若EV<0, 则表明玩家更倾向于输, 此时最优策略是pack, 及时止损. 但是EV是结果偏向, 并不是动作决策偏向的. 因此我们引入delta(EV), 即EV增量的概念, 来帮助AI进行具体的行动(check/raise/pk/pack/see)决策.
  假定n为当前没弃牌的玩家总数, d为当前玩家的本轮下注筹码, d'因玩家是否see而引入的一个d的变化值.
  对于EV增量, 我们如下定义:

delta(EV) = EV(下次轮到自己行动前) - EV(本次行动前) = p * ∑ d' + (2p - 1) * d

  注: EV(下次轮到自己行动前)是个预估值, 因为不确定本次操作后, 其他玩家后续的操作, 这边做个平均值, 认为后续玩家全都跟注(check).
  这样delta(EV) > 0, 则AI更倾向于check/raise, 若delta(EV) < 0, 则AI更倾向于提前结束战斗, 会选择PK或者pack.

  这样AI决策的伪代码基本如下:

	if EV(当前轮) > 0:
# 选择check/raise后, 最大的delta(EV)的action
delta(EV) = max(delta(EV) <- check, raise)
if delta(EV) > 0:
do check/raise
if delta(EV) <= 0:
do pk/pack
else if EV(当前轮) <= 0:
do pack/pk

  

模型修正:
  原先的EV模型是有陷阱的, 比如当前手牌胜率超过50%时, 此时EV>0, delta(EV)>0, AI会一直决策check/raise, 一旦遇到钢板会输的很惨. 究其原因是模型胜率是平均胜率, 其并没有根据对手的行为而动态调整范围.
  解决方案, 即根据每一轮次, 根据玩家的行为(raise/pk结果), 逐渐提升剩下玩家的手牌强度, 重新计算胜率P, 这样胜率P是递减的, 这样就逃出了此前的模型陷阱.
  至于胜率P如何重新计算, 这就是一个开放性的问题, 总之提升对手手牌的范围, 而不是加入胜率衰减因子, 这个方向是对, 就看这个度如何把握了.
  在EV模型中, 还需要引入隐含收益, 即在手牌非常强大的前提下, 需要埋伏, 不能直接raise到最大, 把别人吓走, 导致最终的期望收益不高.

模糊策略的引入:
  任何基于规则的AI, 同等条件下其行动策略是固定的. 为了不被别人利用规则漏洞, 需要引入一定的模糊策略.
  在该策略下, AI的行为决策, 有一定的随机模糊性, 可以按8/2原则, 进行具体的执行.
  比如手拿差牌, 可以主动进行raise, 起到吓唬的作用.

更多的工作:
  1. 玩家用户画像的建立
  2. see执行最佳时机
  3. 隐含收益和利益最大化策略
  4. 策略平衡和心理战引入

总结:
  本文只是给出炸金花的一种AI实现思想, 是基于EV(期望收益)模型的. 下文将给出具体的代码, 以及面对基准测试集, 其模型能达到的效果.
  对待博彩游戏, 希望大家娱乐心态行娱乐之事, 切勿赌博, ^_^.

  

  

炸金花游戏(3)--基于EV(期望收益)的简单AI模型的更多相关文章

  1. 炸金花游戏(4)--炸金花AI基准测试评估

    前言: 本文将谈谈如何评估测试炸金花的AI, 其实这个也代表一类的问题, 德州扑克也是类似的解法. 本文将谈谈两种思路, 一种是基于基准AI对抗评估, 另一种是基于测试集(人工选定牌谱). 由于炸金花 ...

  2. 200行代码搞定炸金花游戏(PHP版)

    <?php/* * 游戏名称:炸金花(又名三张牌.扎金花) * 开发时间:2009.1.14 * 编 程:多菜鸟 * 来 源:http://blog.csdn.net/kingerq/archi ...

  3. 基于语法树和概率的AI模型

    语法树是句子结构的图形表示,它代表了句子的推导结果,有利于理解句子语法结构的层次.简单说,语法树就是按照某一规则进行推导时所形成的树. 有了语法树,我们就可以根据其规则自动生成语句,但是语法树本身是死 ...

  4. XidianOJ 1044 炸金花

    题目描述 炸金花是一个风靡全球的扑克游戏,不少人因为这个游戏发了家,而更多的人则输得倾家荡产.为了帮助赌徒们戒掉它,现在决定派你去写一个程序,帮助赌徒们更好的认识这个游戏. 炸金花在这里被简化成这样一 ...

  5. 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架

    高层游戏引擎——基于OGRE所实现的高层游戏引擎框架 这是意念自己的毕业论文,在一个具体的实践之中,意念主要负责的是物件和GUI之外的其他游戏系统.意念才学疏陋,望众位前辈不吝赐教.由于代码质量不高. ...

  6. 自己写的微信小程序炸金花简单版

    app.json: { "pages":[ "pages/index/index" ], "window":{ "navigati ...

  7. 炸金花的JS实现从0开始之 -------现在什么都不会(1)

    新年结束了.回想起来唯一留下乐趣的就是在家和朋友玩玩炸金花. 遂有此文. 对不起,我这时候还没有思路. 让我捋一捋. ... ... 捋一捋啊... ... 好了.今天先这样吧: (1)先整理出所有的 ...

  8. 品鉴同事发来的炸金花的PHP程序代码

    今天同事发来了一个炸金花的PHP程序,这个代码实现了两个人通过各自的三张牌进行权重计算,得到分数进行比较得到谁的牌大,我觉得里面还有一些问题,代码如下: <?php /** 每张牌的分值为一个2 ...

  9. 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...

随机推荐

  1. Spring Boot Actuator [监控与管理]

    1. 如何添加 2. actuator 的原生端点(API) 2.1 应用类配置 2.1.1 http://localhost:8080/actuator/conditions 2.1.2 http: ...

  2. Mybatis中#与$区别

    #{}:使用 #{} 格式的语法会导致 MyBatis 创建 PreparedStatement 参数占位符并安全地设置参数(就像使用 ? 一样) ${}:使用 ${} 会在sql语句中插入一个不转义 ...

  3. 苹果手机的SB系列(4)你让我除了退出还能按哪个键

    我不知道,他们哪里来的自信,自己的机子就不死机?不设置重新启动? 看看下面这个界面,我按哪个键,全部是灰色的! 今天还有一事纪念,0.4m高的坠地,外屏碎掉了.

  4. .net core WebApi ManualResetEvent实现并发同步

    ManualResetEvent,即手动重置事件,通过信号量来判别当前线程是否应该阻塞或继续执行.使用方式与ManualResetEventSlim差不多,ManualResetEventSlim只是 ...

  5. systemd的日志管理进程journald

    使用Journalctl查看并操作Systemd日志 systemd拥有强大的处理与系统日志记录功能.在使用其它工具时,日志往往被分散在多套系统当中,由不同的守护进程负责处理. Journal的实现归 ...

  6. java基础2(二)

    Servlet 注意: servletConfig可以获取配置文件(xml文件)中配置的servlet对象的初始化参数. url-pattern 缺省servlet 注意:tomcat目录下有一个默认 ...

  7. Linux系统的磁盘管理

    Linux系统的磁盘管理有三个命令:df.du.fdisk. df:列出Linux中所有文件系统的整体磁盘使用量: du:对文件和目录所占用磁盘空间的查看: fdisk:用于磁盘分区时列出所有的磁盘. ...

  8. java跟oracle如何计算时间差

    java计算时间差: //计算入职时间 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");String date = ...

  9. Python PIL

    Python PIL PIL (Python Image Library) 库是Python 语言的一个第三方库,PIL库支持图像存储.显示和处理,能够处理几乎所有格式的图片. 一.PIL库简介 1. ...

  10. oracle 同义词synonym

    在A用户下,想访问B用户下的表,一遍需要用 “用户名.表名 ”的格式进行访问.如果想不加用户名,直接访问,需要建同义词. 同义词语法如下: CREATE [PUBLIC] SYNONYM synony ...