前言:
  炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的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. react - next.js 引用本地图片和css文件

    1. 图片 把图片放在/static/文件夹中,在component中用img tag: <img src={'../static/icon.png'} /> 2. css 把css文件放 ...

  2. mysql 循环、游标

    mysql 循环只能在存储过程.代码记录 CREATE DEFINER=`front`@`%` PROCEDURE `a_1`() BEGIN -- 声明变量,接收游标循环变量 DECLARE _co ...

  3. 刷题upupup【Java中Queue、Stack、Heap用法总结】

    [Queue] 先进先出(First-In-First-Out),LinkedList实现了Queue接口.它只允许在表的前端进行删除操作,而在表的后端进行插入操作. add()       增加一个 ...

  4. SSM框架中如何简便上传文件表单

    此种方式上传文件相对简单,以下均经测试成功,才提供到此. 以下为单个文件上传方式 分析:本次的工作目的是根据一级标题产生对应的二级标题,在每个二级标题下对应一个(file字段)新闻文件,当点击新闻文件 ...

  5. vue-router路由讲解

    此文章用来系统讲解vue-router路由 安装 只介绍npm安装 npm install vue-router --save 项目所需依赖 在main.js或者app.vue中导入 import V ...

  6. 本地代码上传到git

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...

  7. 第二天:python的函 数、循环和条件、类

    https://uqer.io/community/share/54c8af17f9f06c276f651a54 第一天学习了Python的基本操作,以及几种主要的容器类型,今天学习python的函数 ...

  8. Factorial(hdu 1124)

    Description The most important part of a GSM network is so called Base Transceiver Station (BTS). Th ...

  9. 8ci

  10. 洛谷P2886 [USACO07NOV]牛继电器Cow Relays

    题意很简单,给一张图,把基本的求起点到终点最短路改成求经过k条边的最短路. 求最短路常用的算法是dijkstra,SPFA,还有floyd. 考虑floyd的过程: c[i][j]=min(c[i][ ...