前言:
  本文将谈谈如何评估测试炸金花的AI, 其实这个也代表一类的问题, 德州扑克也是类似的解法. 本文将谈谈两种思路, 一种是基于基准AI对抗评估, 另一种是基于测试集(人工选定牌谱). 由于炸金花/德州是一类信息不完全的游戏, 而且运气在局数少的情况下, 占据很大比例, 波动有些大. 因此基于测试集来评估, 可能更好, 更准确.
  总而言之, 好的AI, 在优势下赢得越多, 在劣势下输得越少, ^_^.

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

基准AI的选定:
  基准AI来评估新AI的好坏, 这个有点绕, 感觉像先有鸡, 还是先有蛋的问题. 但应该属于迭代发展的例子, 就好像最老一代的C编译器由汇编编写, 然后用C语言编写新一代的C编译器, 继而在用c语言开发再新一代的C编译器...., 最终C语法支持越来越强, 性能越来越强大.
  对于这个基准AI, 我们可以如下设定基础规则:
  1. 随机选择see操作
  看牌see的最佳时期, 这个难以定论, 这边引入随即决策看牌, 几回合后强制看牌.
  2. 提升对手手牌范围, 明注每操作一轮提升, 明注主动raise提升, PK胜利提升.

玩家默认牌力为高high/弱对子
玩家明注check一轮, 牌力 += 1
玩家明注raise, 牌力 += 2
玩家主动pk胜利, 牌力 += 1
玩家被动pk胜率, 牌力 += 2

  3. 根据手牌胜率, 决定check/raise/pk/pack

p >= 0.65, 选择check/raise
p >= 0.5 && p < 0.65, 60%选择pk, 40%选择check
p >= 0.4 && p < 0.5, 70%选择pk, 30%选择pack
p >= 0.2 && p < 0.4, 30%选择pk, 70%选择pack
p <= 0.2, 选择pack

  任何有一定均衡性的游戏, 都有风格相克的问题, 所以基准AI对抗也有过拟合的问题.

基于测试集:
  这需要人工选一些有代表意义的牌谱, 牌谱覆盖正反case, 同时能满足一定的概率分布, 这个测试牌谱需要领域专家来完成. 除了牌谱选定外, 对每个牌谱, 需要人为的设定阈值条件和策略规则.这边的牌谱以及规则设定都是基于理性的.
  1. 正向case
  AI手牌牌力强, 敌方手牌牌力弱/稍弱, 这些情况下, AI能取得到的最大价值.
  2. 反向case
  AI手牌牌力弱, 敌方手牌牌力强, 这些情况下, AI能尽量的少输.
  这边举几个列子吧, 确实这个挺难以展开的.
  AI手牌为同花, 测试牌谱为弱对子, AI需要谨慎的处理raise, 因为一旦raise, 会导致对方提前pk或者pack, 这样能取到的价值较少了.
  AI手牌为同花, 测试牌谱为顺子, AI在谨慎处理后, 发现对方牌力不小, 可以raise, 提高可获取的价值.
  这边做个小广告吧, poker logic, 这边的测试来评估玩家水平, 进而衍生为评估AI, 这种方式我觉得是评估AI强弱的正道.

  

总结:
  本文谈到了两种方式去评估AI, 一种是基于基准AI, 一种是就要牌谱测试集, 我个人更倾向于第二种. 由领域专家选定的牌谱在指导和评估AI的能力, 更具说服力.
  对待博彩游戏, 希望大家娱乐心态行娱乐之事, 切勿赌博, ^_^.

炸金花游戏(4)--炸金花AI基准测试评估的更多相关文章

  1. 炸金花游戏(3)--基于EV(期望收益)的简单AI模型

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

  2. Java五子棋小游戏(控制台纯Ai算法)

    Java五子棋小游戏(控制台纯Ai算法) 继续之前的那个五子棋程序 修复了一些已知的小Bug 这里是之前的五子棋程序 原文链接 修复了一些算法缺陷 本次增加了AI算法 可以人机对战 也可以Ai对Ai看 ...

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

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

  4. 测开之路三十三:Flask实现扎金花游戏

    访问http://localhost:8888/game随机获取一张扑克牌.豹子(炸弹):三张点相同的牌.例:AAA.222.顺金(同花顺.色托):花色相同的顺子.例:黑桃456.红桃789.最大的顺 ...

  5. [Unity3D]Unity3D游戏开发之怪物AI

    大家好.欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei.        在上一篇文章中,我们基本上实现了一个 ...

  6. 简单3d RPG游戏 之 003 怪物AI

    游戏中,怪物会自动的往玩家所在地点走去,那需要创建一个C#脚本EnemyAI,包含两个功能: 1. 怪物旋转自己对准玩家 2. 怪物向前移动,追逐玩家 public class EnemyAI : M ...

  7. cocos2d-x游戏开发系列教程-坦克大战游戏之敌方坦克AI的编写

    在上篇我们完成了子弹和地图碰撞的检测,在这篇我们将完成敌方坦克AI的编写. 具体思路是屏幕中保持有四个敌方坦克,然后坦克随机方向运动,并且子弹消失后1秒发射一次 1.我们新建一个敌方坦克的AI类来控制 ...

  8. 《棋牌游戏服务器》斗地主AI设计

    设计目标 要取得良好效果,首先要搞清楚一个问题:我们想得到一个什么样的斗地主AI?我们的AI是用在手游产品当中,在真实玩家不足时为用户提供陪玩服务,这个目标决定了这个AI要具备以下两个核心特点:1.执 ...

  9. XidianOJ 1044 炸金花

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

随机推荐

  1. springBoot 随笔(一)

    服务化的世界,越来越多应用拆分为微服务,有些为了业务而拆,也有为了技术而拆,也有什么都不知道就瞎拆的,反正就是要微服务. 以下为一个认识springBoot的简单过程 1/eclipse 新建 mav ...

  2. 关于Python的一些看法

    我是一个学新闻传播的编程新人,对于电脑这一方面,我是真的有一些一窍不通啊~选择Python语言程序设计的原因也是因为出于Python对未来专业可能会起到帮助考虑(因为未来我的专业会涉及到一些大数据抽查 ...

  3. golang开源项目qor快速搭建网站qor-example运行实践

    最近想找几个基于Go语言开发的简单的开源项目学习下,分享给大家,github上有心人的收集的awesome-go项目集锦:github地址 发现一个Qor项目: Qor 是基于 Golang 开发的的 ...

  4. Hibernate的增删改查(事务)

    Hibernate的事务: 1. 设置事务隔离级别都是用  自己进行存储的 二进制      十进制 read uncommitted   读未提交        0001         1 rea ...

  5. SoapUI之http接口测试

    SoapUI是一个开源测试工具,可以进行webservice/http协议的功能.负载.安全性测试.SoapUI pro是SoapUI的商业非开源版本,实现的功能会更多一点.一般的测试场景,用开源版本 ...

  6. lua 基础 之 坑一样的地方

    -- local 局部-- local表=全局表,是同一个表,这主要是由于lua的表机制是匿名的,相当于函数的指针,local foo = foo,-- 即使本地foo没有在全局_G注册,还是引用的是 ...

  7. c#连接db2数据库

    .net项目要连接db2数据库,是要安装客户端的,否则是连接不上的: 若出现“未在本地计算机上注册‘ibmdadb2’提供程序” 解决办法: 1.先找到安装后的ibmdadb2.dll文件复制到c:\ ...

  8. jqgrid自定义列表开发=》实现高级查询

    标题已指出本文要说的三件事,首先是主角jqgrid,将应用在自定义列表中,重点介绍如何实现高级查询. 使用jqgrid实现自定义列表分为两大步骤,首先是要根据业务完成jqgrid的对象定义,即列表的描 ...

  9. python中文件读写

    读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...

  10. 记录前台js判断,如果为空,給议空的占位

    这个主要是根据所有的值,按顺序输出,如果没有值,就给予空的占位, //页面加载的时候获取左边和右边的所有游客id       var array_left_start = new Array();   ...