前言:
炸金花這款遊戲, 從技術的角度來講, 比德州差了不少. 因此他的AI模型也相對簡單一些. 本文從EV(指望收益)的角度, 來嘗試構建一個簡單的炸金花AI.html
相關文章:
德州撲克AI--Programming Poker AI(譯).
系列文章說來慚愧, 以前一直叫嚷着寫德州AI, 不過惋惜懶癌晚期, 一直沒去實踐, T_T. 相比而言, 炸金花簡單不少, 也更偏重於運氣和所謂的心理對抗.
系列文章:
1. 炸金花遊戲的模型設計和牌力評估
2. 炸金花遊戲的勝率預估
3. 基於EV(指望收益)的簡單AI模型
4. 炸金花AI基準測試評估
5. 動態收斂預期勝率的一種思路python
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增量, 咱們以下定義:spa
delta(EV) = EV(下次輪到本身行動前) - EV(本次行動前) = p * ∑ d' + (2p - 1) * d
注: EV(下次輪到本身行動前)是個預估值, 由於不肯定本次操做後, 其餘玩家後續的操做, 這邊作個平均值, 認爲後續玩家全都跟注(check).
這樣delta(EV) > 0, 則AI更傾向於check/raise, 若delta(EV) < 0, 則AI更傾向於提早結束戰鬥, 會選擇PK或者pack.設計
這樣AI決策的僞代碼基本以下:htm
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到最大, 把別人嚇走, 致使最終的指望收益不高.blog
模糊策略的引入:
任何基於規則的AI, 同等條件下其行動策略是固定的. 爲了避免被別人利用規則漏洞, 須要引入必定的模糊策略.
在該策略下, AI的行爲決策, 有必定的隨機模糊性, 能夠按8/2原則, 進行具體的執行.
好比手拿差牌, 能夠主動進行raise, 起到嚇唬的做用.遊戲
更多的工做:
1. 玩家用戶畫像的創建
2. see執行最佳時機
3. 隱含收益和利益最大化策略
4. 策略平衡和心理戰引入get
總結:
本文只是給出炸金花的一種AI實現思想, 是基於EV(指望收益)模型的. 下文將給出具體的代碼, 以及面對基準測試集, 其模型能達到的效果.
對待博彩遊戲, 但願你們娛樂心態行娛樂之事, 切勿賭博, ^_^.io