前言:
我也是突然心血来潮, 想写写炸金花这类游戏的AI实现. 本文算是这一系列的第二篇, 主要写炸金花的胜率预估, 主要基于蒙特卡罗的思想, 胜率是炸金花AI的核心决策数据, ^_^.
相关文章:
德州扑克AI--Programming Poker AI(译).
系列文章说来惭愧, 之前一直叫嚷着写德州AI, 不过可惜懒癌晚期, 一直没去实践, T_T. 相比而言,***简单很多, 也更偏重于运气和所谓的心理对抗.
系列文章:
1. 炸金花游戏的模型设计和牌力评估
2. 炸金花游戏的胜率预估
3. 基于EV(期望收益)的简单AI模型
4. 炸金花AI基准测试评估
5. 动态收敛预期胜率的一种思路
蒙特卡罗(Monte Carlo):
该算法属于模拟统计, 通过大量的随机模拟, 来达到/接近精确解的方法, 简单有效.
它的一个最有名的例子, 就是模拟求解PI(圆周率), 在2*2的正方形中区域中, 随机生成大量的点, 最后PI满足如下公式:
圆面积/正方形面=圆内覆盖的点数/全部点=PI/4
这边不再具体阐述了, 具体可以参考博文: 蒙特卡罗(Monte Carlo)方法计算圆周率π
胜率预估:
手牌胜率预估, 我们假定一副牌(52张), 玩家数N(2~6)之间变化, 在经历足够多的模拟随机发牌后, 手牌的胜率趋于真实值.
伪代码如下(炸金花没有平局, 这里把牌力相等, 认为输):
# 假定随即模拟10000局, 其他玩家n个
sim_n = 10000
player_n = 其他玩家数
hand_cards = 玩家自己的手牌
# 玩家胜利的次数
win_n = 0
for i in range(sim_n):
players <- 随