前言:
炸金花這款游戲, 從技術的角度來說, 比德州差了很多. 所以他的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(期望收益)模型的. 下文將給出具體的代碼, 以及面對基准測試集, 其模型能達到的效果.
對待博彩游戲, 希望大家娛樂心態行娛樂之事, 切勿賭博, ^_^.