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

时间:2023-03-09 01:12:47
炸金花游戏(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(期望收益)模型的. 下文将给出具体的代码, 以及面对基准测试集, 其模型能达到的效果.
  对待博彩游戏, 希望大家娱乐心态行娱乐之事, 切勿赌博, ^_^.