概要
長々とテキサスホールデムの戦略を考えてきたが、そろそろゲームにおけるNPCの行動モデルを考えたいという気がしている。ただ、やはりテキサスホールデムは当初考えていたよりゲームが複雑であり、なかなか人間らしいプレイをするNPCの行動モデルを考えるのが難しい。とりあえずプリフロップの戦略で考えなければならない構成要素を洗い出して、プリフロップにおけるプレイヤーモデルの開発ぐらいは目途がつけられるようにしたい、というのが本稿の趣旨である。
プリフロップ戦略の構成要素
プリフロップにおける戦略を構成する要素のうち、重要なファクターは以下のものであると考える。
- 手札の選好順位
- VPIP(ルース or タイト)
- ベットサイズやレイズ戦略
- スタックに応じたベット戦略
- アンティ、レーキの考慮有無
- ポジションの考慮有無、レイザーがOOP/IPかの考慮有無
- 参加人数に応じたベット戦略(マルチウェイの場合にパッシブ or アグレッシブになる)
- ブラフを使うかやその頻度
このうち、基本的なものは1.~3.であり、本稿ではこれらの構成要素を反映したモデルを考えよう。特に重要なのは、1.の手札の選好順位をどのように表現するかであり、これについて詳しくモデル化の方法を検討する。
手札の選好順位
ヘッズアップの場合とマルチウェイの場合で、SuitedやConnectedの勝利確率が相対的に変化するということを以前に述べたが、フロップ以降に参戦する人数が不確定であるため、現実にはプレイヤーによって手札の好みが分かれるだろう。フロップ以降の戦略にも依存するため、好まれる手札が必ずしも勝利確率の順にはならないこともあるかもしれない。例えば、現実のプレイヤーは以下のような好みに応じて参入する手札の優先順位を定めているかもしれない。
- ポケットペアの評価
- Suitedの評価
- Connectivityの評価(Connected, 1-Gapper, 2-Gapper, 3枚ストレート可能, Connectivityなし)
- 強い方のカードのランクの評価(ワンペアのランクの高さの重視度合い)
- 弱い方のカードのランクの評価(キッカーの重視度合い)
例えば、77とJTs、A9oと65s、K2sとQ7sでどちらを好むかなどプレイヤーによって意見が分かれる場合があるだろう。それぞれの評価が高いプレイヤーは以下のような傾向があるということになるだろう。
- ポケットペアが好きで、ポケットペアでは強気になる
- フラッシュが好きで、Suitedはとりあえずフロップが見たい
- ストレートが好きで、ランクの強さよりストレートの出来やすさが気になる
- AやKが好きで、手札にAやKがあると強気になる
- AやKがあっても、キッカーが弱いと不安になって強気にプレイできない
これらの評価項目について、スコアリングモデルを作って、スコアが高いほど優先的に参入するという風にすれば、プレイヤーの選好を反映した手札の優先順位を定めることができる。例えば、以下のようなモデルを考えればよいだろう。
- ダミー変数(ポケットペア)\(\small x_1\):ポケットペアの場合1、それ以外0
- ダミー変数(Suited)\(\small x_2\):Suitedの場合1、それ以外0
- Connectivity \(\small x_3\): Connectedの場合4、1-Gapperは3、2-Gapperは2、3枚ストレート可能は1、それ以外0
- 強い方のカードのランクの評価 \(\small x_4\):Aは12, Kは11,・・・2は0
- 弱い方のカードのランクの評価 \(\small x_5\):Aは12, Kは11,・・・2は0
このとき、パラメータ\(\small \beta_1,\cdots, \beta_7\)を与えて
\[ \small s = \beta_1 x_1+\beta_2 x_2+\beta_3 x_3+\beta_4 x_4+\beta_5 x_4^2+\beta_6 x_5+\beta_7 x_5^2 \]
のようにモデルを構築すればよいだろう。Connectivityの項目はストレートの成立確率からそれぞれの手札に以下のパラメータを付与することにする。
- \(\small x_3=4\): JT, T9, 98, 87, 65, 54
- \(\small x_3=3\): QJ, QT, J9, T8, 97, 86, 75, 64, 53, 43
- \(\small x_3=2\): KQ, KJ, KT, Q9, J8, T7, 96, 85, 74, 63, 52, 42, 32
- \(\small x_3=1\): AK, AQ, AJ, AT, A5, A4, A3, A2, K9, Q8, J7, T6, 95, 84, 73, 62
- \(\small x_3=0\): 上記以外
ランクの評価についてはCurvatureを考慮して二次関数にしておく。例えば、強い方のカードがAやKである場合には特別な評価が与えられる傾向があるため、線形モデルだと手札の強さを適切に反映できない可能性があるだろう。
上記のモデルを用いて様々なプレイヤーの好みを表現したモデルを構築できるが、手札の間には誰がどう考えても必ず成立しなければならない選好順位が存在する。例えば、ポケットペアであれば、AA > KK > ・・・> 22が必ず成り立つ。これは合理性の問題であって、好みの問題ではないだろう。役の成立確率同じであり、かつ、勝利確率がランクが高いほど高くなるのであるから、AAより77を好むプレイヤーというのは非合理的であると考えなければならない。同様にして、同じランクのSuitedとOff-suitでOff-suitの方を好むということもないだろう。87oと86o、87oと76o、A8oとK8o、K8oとK7oなどもプレイヤーの好みで逆転することは基本的にないと考えた方が良いだろう。こういったプレイヤーの好みで順位が入れ替わることがない手札の強弱はしばしばドミネートと言われる。例えば、AAはKKをドミネートしているということになる(ドミネートしているからと言って必ず勝てるわけではないことに注意する)。プリフロップでオールイン対決になったときに、”あっ、やっちまった”と思う場合は、大抵の場合で対戦相手の手札が自分の手札をドミネートしていると考えれば理解しやすいだろう。
このように考えると、いくらプレイヤーの選好を反映すると言っても、ドミネートの関係をひっくり返すような選好は適切ではないということになる。最初に挙げた5つの評価基準のうち、ポケットペアかどうかを除く項目は高い値であるほど、プラスの評価が与えられなければならないということになる。言い換えれば、\(\small \beta_2,\beta_3 \geq 0\)でなければならないし、
\[ \small \begin{align*} \beta_4 x_4 + \beta_5 x_4^2 \geq 0 \quad x_4 \in\{0,1,\cdots,12\} \\ \beta_6 x_5 + \beta_7 x_5^2 \geq 0 \quad x_5 \in\{0,1,\cdots,12\} \end{align*} \]
かつ
\[ \small \begin{align*} \beta_4 + 2\beta_5 x_4 \geq 0 \quad x_4 \in\{0,1,\cdots,12\} \\ \beta_6 + 2\beta_7 x_5 \geq 0 \quad x_5 \in\{0,1,\cdots,12\} \end{align*} \]
を満たす範囲でパラメータを定める必要があるということになる。ひとまず簡単な方法はスコアモデルの係数は必ず非負の値にしておくことだろう。
パラメータの設定例
具体的なパラメータとして以下の数値を割り当てよう。各パラメータについて0~10の11段階で評価を表現するものとして、その評価に以下の係数を掛け合わせた値をスコアとして足し上げる(各手札の勝利確率に回帰分析を適用してバランス調整した係数なので数値が小さいが、すべての係数を100倍するなどしても結果は変わらない)。
\[ \small (\beta_1, \beta_2, \beta_3, \beta_4, \beta_5, \beta_6, \beta_7) = (0.05, 0.008, 0.002, 0.0028, 0.0002, 0.0004, 0.0002) \]
例えば、ポケットペアの評価を5と設定した場合、\(\small s= s + 0.05 \times 5 \)のような形式でスコアを足し上げて、その合計が高い順にエントリーする手札を定める。
戦略毎のVPIPと手札の選好順位のパラメータの組み合わせだ様々なプレイヤーの行動を表現することができる。例えば、以下のように例を考えることができるだろう。
3bet/3bet | 2bet/3bet | 2bet/2bet | 1bet/3bet | 1bet/2bet | |
---|---|---|---|---|---|
NIT | 5% | — | — | — | — |
3better | 10% | — | — | — | — |
Loose 3better | 15% | — | — | — | — |
Tight Aggressive | 5% | 10% | 20% | — | — |
Tight Passive | 2% | 7% | 20% | — | — |
Loose Aggressive | 7% | 15% | 50% | — | — |
Loose Passive | 2% | 7% | 50% | — | — |
Limper | 2% | 7% | 20% | — | 60% |
Limp Caller | 2% | 10% | — | 60% | — |
Trap Limper | 5% | 10% | 20% | 2% | 60% |
手札の優先順位としてVPIPが低いベット戦略を優先するようにする。Trap Limperは1bet/3betが最初に優先されて、その後3bet/3betに手札が割り当てられるということになる。手札の選好順位は以下のようなパラメータの組み合わせは比較的想像しやすいだろう。
Pocket Pair | Suited | Connected | Rank (High) | Rank (Low) | |
---|---|---|---|---|---|
Pocket Pair Freak | 8 | 3 | 3 | 5, 5 | 5, 5 |
Flush Freak | 4 | 10 | 6 | 3, 3 | 3, 3 |
Straight Freak | 2 | 4 | 10 | 1, 1 | 1, 1 |
AK Freak | 3 | 3 | 3 | 8,8 | 3,3 |
Dislike Weak Kicker | 3 | 3 | 3 | 3,3 | 8,8 |
Speculator | 6 | 8 | 10 | 2,2 | 2,2 |
Rank Prioritized | 3 | 1 | 1 | 8,8 | 8,8 |
A-High Flush Freak | 3 | 8 | 3 | 8,8 | 3,3 |
実際に、VPIPを指定して、\(\small \beta_1,\cdots,\beta_7\)のパラメータを操作した場合にどのようなハンドレンジになるか表現できるプログラムを実装してみた。VPIPと\(\small \beta_1,\cdots,\beta_7\)の設定にバリエーションを設けることで、合理性を毀損することなく様々なプリフロップ戦略を採用するプレイヤーを表現できることになるだろう。
ハンドレンジというとVPIPばかり気にして、ルースなプレイヤーに対してどう対抗したらよいかなどを考えることが多い。しかし、ハンドレンジがSuitedに偏っているとか、AやKがあるときに偏っているとか、ポケットペアばかりプレイしたがるなど、様々な特徴を入れた場合にどのようにプレイしたらよいかというのも考えてみるのも面白いかもしれない。
まとめ
文章が長くなってしまったため、次回に続編を記述しようと思う。現実のプレイヤーは各手札に対してそこまで確定した行動をとっていない(気分によって強い手札でも臆病になったり、弱い手札でも強気に出てしまうことがある。対戦相手の行動から影響を受けてしまうケースもある。)し、行動に対して手札の強さを対戦相手に知られないようにするため意図的に混合戦略を用いている場合もあるだろう。
もう一つは、突然オールインしてくるケースというのもやはり行動に組み込みたい気がしている。大体、突然オールインする場合というのは以下のようなケースだろう。
- ポケットペア(AAやKK、QQ)はとりあえずオールインすることにしている(ポケペアが好きなプレイヤーは55とか33でもする場合がある)。
- 強い手札(AK,AQ,AJ,KQなど)について、フロップ以降うまくプレイする自信がないため、オールインして高い勝率に賭けることにしている。
- リンプインなど弱いアクションをしているプレイヤーが手前に多数いたため、スティールのためにオールインする。
- 自分の手前のプレイヤーが全員フォールドしている場合に、手前のポジション(BTNやSB)からブラフでオールインする。
- スタックが20~30bbしかないため、3ベットの代わりにそのままオールインする。10bb以下の場合は、オープンレイズの代わりにオールインする。(いずれの場合も、フロップ以降で結局オールインすることになる可能性が高いため)
- 直近で多くのチップを失ったため、冷静でいられなくなり、手札に関係なくオールインしてしまう。
1.と2.はベット戦略のカテゴリにAll-in/All-inみたいにしてもよいだろうが、すこし戦略が複雑であるように感じる。オープンレイズからオールインする場合もあるし、3ベットされた場合にリレイズでオールインする場合もあるだろう。3.や4.のブラフやスティールを兼ねている場合も少なくないように感じる。ポジションや特定の状況にある場合だけオールインする手札があるというふうに見るべきだろう。これらを表現する方法を次回考察しよう。