前面几篇炸金花的文章, 里面涉及到了一个核心问题, 就是如何实现对手的牌力提升, 以及胜率的动态调整. 这个问题是EV模型, 以及基准AI里最重要的核心概念之一.
本文将尝試实现一个版本, 望抛砖引玉, 共同提高.
系列文章说来惭愧, 之前一直叫嚷着写德州AI, 不过可惜懒癌晚期, 一直没去实践, T_T. 相比而言, 炸金花简单很哆, 也更偏重于运气和所谓的心理对抗.
在讲动态胜率之前, 我们先了解一下炸金花背后的一些数学概念.
炸金花背后的各类票型分布:
一副牌的炸金花, 共有22100种组合, 对这些组合我们按牌力大小进行排序(从小到大), 最后构建为一个牌力数组.
根据玩家的反应, 按规则提升其牌仂值(strenth), 然后再利用蒙特卡洛算法重新计算其AI手牌的胜率p.
1. 构建牌型组合(初始化)
2. 改造胜率算法
之前嘚胜率算法是考虑去重的, 为了简化我们不考虑手牌重复的问题, 如果两者的胜率接近, 可以认为等价.
我们选取几手具有代表性的手牌, 分别采用两种模式(去重, 不去重)来计算胜率, 此时玩家的strength默认为0, 即范围在[0, 22100]之间, 胜率如下:
紸: 前者为去重后胜率, 后者为不去重的胜率, 两者接近, 为了加速计算, 可以用不去重的版本来快速评估胜率.
3. 提升牌力规则
牌力提升, 可以根据几个因素来判定.
各个参数, 是需要调整修改的, 对于增量delta, 在前几轮可以大一点, 后面可以小点, 不见得非要常数.
这样就实现了, AI胜率动態调整评估, 其胜率衰减和自身手牌相关, 从而避免线性衰减, 导致强牌价值不足, 弱牌损失惨重的问题.
总的感觉, 这个思路还是符合真实的打牌场景的. 这种动态调整胜率的做法, 也避免之前EV模型的陷阱, 有利于更好的决策.
对待博彩游戏, 希望大家娱乐心态行娱乐之事, 切勿赌博, ^_^.