炸金花游戏(3)--基于EV(期望收益)的简单AI模型
前言:
炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的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模型的更多相关文章
- 炸金花游戏(4)--炸金花AI基准测试评估
前言: 本文将谈谈如何评估测试炸金花的AI, 其实这个也代表一类的问题, 德州扑克也是类似的解法. 本文将谈谈两种思路, 一种是基于基准AI对抗评估, 另一种是基于测试集(人工选定牌谱). 由于炸金花 ...
- 200行代码搞定炸金花游戏(PHP版)
<?php/* * 游戏名称:炸金花(又名三张牌.扎金花) * 开发时间:2009.1.14 * 编 程:多菜鸟 * 来 源:http://blog.csdn.net/kingerq/archi ...
- 基于语法树和概率的AI模型
语法树是句子结构的图形表示,它代表了句子的推导结果,有利于理解句子语法结构的层次.简单说,语法树就是按照某一规则进行推导时所形成的树. 有了语法树,我们就可以根据其规则自动生成语句,但是语法树本身是死 ...
- XidianOJ 1044 炸金花
题目描述 炸金花是一个风靡全球的扑克游戏,不少人因为这个游戏发了家,而更多的人则输得倾家荡产.为了帮助赌徒们戒掉它,现在决定派你去写一个程序,帮助赌徒们更好的认识这个游戏. 炸金花在这里被简化成这样一 ...
- 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
高层游戏引擎——基于OGRE所实现的高层游戏引擎框架 这是意念自己的毕业论文,在一个具体的实践之中,意念主要负责的是物件和GUI之外的其他游戏系统.意念才学疏陋,望众位前辈不吝赐教.由于代码质量不高. ...
- 自己写的微信小程序炸金花简单版
app.json: { "pages":[ "pages/index/index" ], "window":{ "navigati ...
- 炸金花的JS实现从0开始之 -------现在什么都不会(1)
新年结束了.回想起来唯一留下乐趣的就是在家和朋友玩玩炸金花. 遂有此文. 对不起,我这时候还没有思路. 让我捋一捋. ... ... 捋一捋啊... ... 好了.今天先这样吧: (1)先整理出所有的 ...
- 品鉴同事发来的炸金花的PHP程序代码
今天同事发来了一个炸金花的PHP程序,这个代码实现了两个人通过各自的三张牌进行权重计算,得到分数进行比较得到谁的牌大,我觉得里面还有一些问题,代码如下: <?php /** 每张牌的分值为一个2 ...
- 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...
随机推荐
- printf()、sprintf()、vprintf()、vsprintf()(转)
转自http://sumsung753.blog.163.com/blog/static/14636450120112151092934/ 一.printf() printf()函数优点在于可以格式化 ...
- Public_1.bat
:: targetset targetFileName=Public_2set targetPath=./:: sourceset sourceFileName=Public_1@echo ui ru ...
- mysql中用limit 进行分页有两种方式
代码示例:语句1: select * from student limit 9,4 语句2: slect * from student limit 4 offset 9 // 语句1和2均返回表stu ...
- pycharm与python环境配置
一.安装python开发环境 在win7的64位系统上安装,然后用cmd命令提示行输入python,出错,网上给出了解决方案,也操作成功了,但是比较麻烦,没关系,安装Anaconda3即可(默认安装即 ...
- 给出一百分制成绩,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。
import java.util.Scanner; public class test5 { public static void main(String[] args) { // TODO Auto ...
- 开源HUSTOJ
hustoj -- 请一定认真看完本页再动手安装,以免无谓的折腾!====== 根据你选择的发行版不同,从下面三个脚本里选一个来用. <b>不要相信百度来的长篇大论的所谓教程,那些都是好几 ...
- oracle数据库自学笔记(持续更新中……)
以前的项目都是使用mysql数据库开发的,如今进了新的公司,开始接触到了Oracle数据库,而自己以前没有接触过,就自己挤时间来学习一下. 一.关系型数据库的概念 关系型数据理论由E.F.Codd博士 ...
- Https 单向验证 双向验证
通讯原理 participant Client participant Server Client->>Server: 以明文传输数据,主要有客户端支持的SSL版本等客户端支持的加密信息 ...
- 浅谈利用同步机制解决Java中的线程安全问题
我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...
- kali linux 配置嵌入式开发环境
kali linux 2018.2 x64 一.支持i386库 如果你是64位的Kali Linux系统,用如下命令添加i386架构支持到你的开发环境. dpkg --add-architecture ...