概要
ポーカーにおけるスタッツの情報をパラメータとして利用したNPCのモデルを開発したいというシリーズの2回目である。前回はプリフロップについて考察したが、今回はポストフロップについて考察する。現時点において、基本的にはFlop,Turn,Riverでアルゴリズムを共通として扱い、各ラウンドにおける行動の差異はモデルのパラメータで表現するものと仮定する。ポストフロップではポジションよりアグレッサー(プリフロップ(1つ前のラウンド)で最後にレイズしたプレイヤー)であるかどうかによって行動の仕方を変える。
プレイヤーの行動は誰もベットしていない状態では2択(Check, Bet)、すでにベットが行われている場合は3択(Call, Fold, Raise)とする。Bet、Raiseの倍率はパラメータとして設定し、固定した倍率を用いる(Betはポットの50%、Raiseはベット額の3倍など)。
ポストフロップにおけるプレイヤーの統計情報パラメータ
ポストフロップにおける統計情報として以下のパラメータを設定して利用する。ポストフロップで残っている人数が3人以下の場合はポジションによっても戦略が相応に変わることが多いと思われるため、2人の場合(IP (In Position)/ OOP (Out of Position))、3人の場合( IP / MP (Middle Position) /OOP)はポジションによってもパラメータを変える。
- DB (Donk Bet) : アグレッサーの行動前にベットを行う比率
- Fold to DB: DBが行われたときにFoldする比率
- Raise to DB: DBに対してRaiseする比率
- CB (Continuation Bet): アグレッサーの時にベットを行う比率
- Fold to CB: CBが行われたときにFoldする比率
- Raise to CB: CBに対してRaiseする比率
- BMCB (Bet to Missed CB): アグレッサーがチェック後にベットを行う比率
- Fold to BMCB: BMCBが行われたときにFoldする比率
- Raise to BMCB: BMCBに対してRaiseする比率
- 3Bet: Bet -> Raiseに対してさらにRaiseする比率
- Fold to 3Bet: 3 Betに対してFoldを選択する比率
アグレッサーで手前でDonk Betが行われない場合はCBに基づいて判断する。Donk Betを打ったプレイヤーがいる場合はFold to DB, Raise to DBで判定する。BMCBはあまり聞かないポーカー用語だがアグレッサーがチェックした後にベットを打つ比率を表す。アグレッサーがチェックすると常にベットするプレイヤーみたいなのを稀にみるが、そういったプレイヤーはBMCBが100%ということになるだろう。3BetはCB,DB,BMCB問わず同じパラメータで判定する。
各状態における行動は3択(Call, Fold, Raise)なので、RaiseにもFoldにも該当しない場合はCallを選択する。アクションとしてはRaise > Call > Fold、Bet>Checkの順であり、手札のうち勝率が高い順にパラメータの比率になるように行動を選択する。実装上は適当に上限を決めるが、ここでは3Bet以上は行わないものとする(3BetにCall or Foldする)。手札の強さをどのように判定するかは次節で考察する。
ハンド評価モデル
フロップ以降のプレイヤーのハンドの強さはモンテカルロシミュレーションで評価する。自身の手札と共通カードでオープンされているカードを所与とし、残りの共通カードと対戦相手の手札をシミュレーションして、ポットの獲得率の期待値で評価する。対戦相手のハンドレンジについてVPIPを指定して限定することも可能であるが、処理が複雑になるし、自分自身のハンドの強さを評価することが目的であるため、Any handと仮定して評価を行う。
この計算した期待値を\(\small p\)と表し、各ラウンド(フロップ、ターン、リバー)におけるハンドの強さのThresholdを事前に計算したラウンド毎の確率分布から分位点を計算することで求める。各ラウンドにおけるエクイティの確率分布\(\small \phi_n(p)\)はモンテカルロシミュレーションによるサンプリングで推定する(10万シナリオでそれぞれ1万回のシミュレーションで期待値を評価する場合は10億回のシミュレーション計算が必要になる)。\(\small n\)は残存プレイヤー数を表す。実際に推定した分布を図で示すと以下のようになる。プレイヤー数によって分布は変化するが以下のグラフは3人(3-way)の場合の確率分布\(\small \phi_3(p)\)である。

ただし、この分布をそのまま用いても適切なThresholdを計算できるわけではないことに注意する必要がある。プリフロップにおいてVPIPに満たない強さのハンドはFoldしてしまうため、一般にポストフロップ以降に残らない。そのため、プリフロップでエントリーする手札(VPIPの範囲に含まれる手札)のみに範囲を限定して確率分布を定める必要がある。プリフロップにおけるハンドごとに確率分布\(\small \phi_n(p|h)\)を計算しておいて、プリフロップにおけるハンドレンジに対応する範囲だけ集計して分位点を推定する。\(\small h\)はAKoなどのハンドシンボルを表す。確率分布はサンプルのヒストグラムでもよいが、集計しやすいようにGaussian Mixture Modelなどで近似したデータを持つと良いだろう。
プリフロップでVPIPの範囲に入るハンドレンジに対応する確率分布だけを集計して分位点を推定する。VPIPの範囲外のハンドはプリフロップでフォールドするので除外するようにする。ハンドの重み\(\small w_i\)は
- Off-suit: 12 / 1326
- Suited: 4 / 1326
- Pocket Pair: 6 / 1326
である。プリフロップのハンドレンジ(H)に含まれるハンドの\(\small w_i\)を用いて
\[\small \phi_n(p) = \frac{\sum_{i \in H}w_i \phi_n(p|h_i)}{\sum_{i \in H} w_i} \]
の様に集計して確率分布を求める。モンテカルロシミュレーションで求めた\(\small p\)とこの確率分布関数の分位点を比較して、行動を決定する。
まとめ
今回までの内容で、ひとまずテキサスホールデムについて手札が強い順に強いアクションを取るプレイヤーのモデルができたと考えられる。以降のシリーズでは
- オマハホールデムなどハンドレンジを個別に指定するのが現実的でないルールの場合の処理
- 必ずしも手札が強い順ではないハンドレンジ(ポラライズなど)を採用する場合の処理
- 手札の選好順位を勝率ではなく、プレイヤーの好みを反映する方法
などについて考察していこう。また、確率分布についてGaussian Mixture Modelで近似すると良いと書いたが、これについても簡単に説明する文章を用意しようと考えている。
