前言:
  本文将谈谈如何评估测试炸金花的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. Centos 7 squid 用户认证

    一.安装安装过程十分简便,只需要安装一下squid,一条命令搞定yum install squidrpm -qa | grep squidsquid-3.5.20-2.el7_3.2.x86_64 二 ...

  2. There are multiple modules with names that only differ in casing. 黄色warning

    There are multiple modules with names that only differ in casing.有多个模块同名仅大小写不同This can lead to unexp ...

  3. linux挂载数据盘步骤

    Linux添加新硬盘自动挂载硬盘的具体步骤 1.插入新硬盘,启动Linux服务器,使用fdisk -l 查看硬盘 #fdisk -l Disk /dev/sdb: 100GB, *********** ...

  4. ANG-----全方位保障您的数字资产安全

    AngelToken—你的数字资产管家 Angel Token 是基于区块链技术 作为支撑的应用 Angel Token具有可信.安全.高效的特点 既保障用户数字资产安 又给用户提供优质服务 且多方位 ...

  5. redis学习——数据持久化

    一.概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存储在内存中的数据将会丢失,在很多情况下是无法容忍这样的事情的.所以,我们需要将内存中的数据持久 ...

  6. C# 应用程序单例(禁止多开) 获取.net版本号 以及 管理员权限

    Mutex不仅提供跨线程的服务,还提供跨进程的服务.当在构造函数中为Mutex指定名称时,则会创建一个命名了的Mutex.其他线程创建Mutex时,如果指定的名称相同,则返回同一个互斥体,不论该线程位 ...

  7. Django--Managers

    Django--Managers Manager 概念: 1.Manager是Django中的数据模型,可以通过manager进行对数据库的查询操作.可以看其结构它本身是一个空的类,其主要的功能来自于 ...

  8. 用 LSTM 做时间序列预测的一个小例子(转自简书)

    问题:航班乘客预测 数据:1949 到 1960 一共 12 年,每年 12 个月的数据,一共 144 个数据,单位是 1000 下载地址 目标:预测国际航班未来 1 个月的乘客数 import nu ...

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

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

  10. jsonp实现ajax跨域

    前端 dataType为jsonp,若不指定回调函数名则默认为callback $.ajax({ url:headUrl+'/img/getImgList', type:'GET', dataType ...