スタッツを複製するNPCモデル(1回目)

確率論

概要

 現在筆者のポーカーアプリ”Exotic Poker”のiPhone版を開発しているのであるが、やる気が起きていない。既存機能のコピペを作っているということでClaude Codeなども使いつつやっているが、丸投げで開発というのも難しいし、後でメンテナンスできなくなるような気がする。順調にいけば6月頃にリリースしたいが、きっと順調にいかないので7,8月頃になるだろう。一方で、Android版の現状のNPCのアルゴリズムがショボい気がするので、新しいNPCのアルゴリズムを考えて追加していこうと思う。

 以前、ポーカーにおけるHUDの情報をまとめた際に、スタッツを指定してそれになるべく近くなるように行動するNPCのアルゴリズムを考えたいということを述べた。現実のスタッツは対戦相手の行動にも依存するため自分だけの行動で必ずしも決定されないが、ある程度定めた比率になるようにアクションを選択するアルゴリズムを考えることはできるだろう。このアルゴリズムについて実現するために何が必要かを考えていこう。

 現時点で何を組み込めばよいかのイメージが無いので時間がかかりそうであるが、地道にパーツを考えていくことで最終的に完成できれば良いだろう。これが実装できれば、かなり人間らしい行動をするNPCを相手にゲームを行うことができるようになることが期待できる。スタッツを適切に指定すればある程度GTOに近い戦略を採用するNPCと対戦できるというところまで行ければ、1人で練習する用のアプリとして扱いやすいゲームになるだろう。

で考察したアルゴリズムを拡張して、シングルプレイでも対戦できるようにしようというのが基本的な方針である。次回以降シリーズで追加した投稿へのリンクはここで追加していくことにする。

ハンドの評価方法

 すでにモンテカルロ法によるハンドの強さを評価するアルゴリズムが実装されているのでこれを利用する。ハンドの評価は基本的にポジションに依存しない形式で評価し、ポジションに依存した戦略はスタッツを利用して反映するようにする。また、ブラフを積極的に利用する方法(弱い手札でも強気のアクションを示すことで、対戦相手に強気のアクションに対してFoldを選択しづらくさせたり、強い手札をFoldさせる戦略)などは後々考察したいが、基本的には勝利確率が高い順に強めのアクションを採用するロジックを最初に実装する。ソーシャルゲームやFast Foldのゲームなど対戦相手がコロコロ変わるためにブラフの価値が低めなゲームにおいては、ある程度正当化される戦略と考えることができる。

プリフロップ

 一般的に、スタッツでプリフロップにおける戦略を決定する要素として重要な指標はVPIP,PFR,3Bet,F23Bの4つだろう。それぞれの指標は以下のアクションの比率を表す。

  • VPIP: 自分自身のアクションなしに対してコール+レイズする比率
  • PFR: (他のプレイヤーも含めて)アクションなし、もしくは、リンプインに対してレイズする比率
  • 3Bet: 2betに対してRaiseする比率
  • F23B: 3betに対してFoldする比率

VPIPとPFRがややこしいのであるが、VPIPが自分自身のアクションについてのみしか条件付けがないのに対して、PFRはあくまで最初のレイズを行う比率という点で他のプレイヤーの行動に依存しているという点に注意が必要である。一般的には、VPIP>PFRであるが、分母が一致していないため、サンプル数が少ないと逆転することもありそうである。

 一方で、NPCの行動を全体的に定めるためにはこれらの指標だけでは不足であり、もう少しパラメータを追加する必要がある。Open Raiseに対してどの程度Foldするかや、3Betに対してFold以外の選択をどの程度の比率で選ぶかが必要になる。具体的に追加すると以下の通りである。100bb戦ぐらいだと、5betは大体オールインになるので上限を5betにする。

  • F22B: Open Raise (2bet)に対してFoldする比率
  • 4Bet: 3betに対してRaiseする比率
  • F24B: 4betに対してFoldする比率
  • 5Bet: 4betに対してRaiseする比率
  • F25B: 5betに対してFoldする比率

これらの比率で判定を行い、そこに含まれないハンドについてはCallを選択するものと仮定すればよい。表でまとめると以下の通りである。上位\(\small x\)%以内に勝率が入るハンドという意味で\(\small x\)を定義する。

RaiseCallFold
Non Openx ≦ PFRPFR < x ≦ VPIPx > VPIP
Open Raise (2Bet)x ≦ 3Bet3Bet < x < 1-F22Bx ≧ 1 – F22B
3Betx ≦ 4Bet4Bet < x < 1-F23Bx ≧ 1 – F23B
4Betx ≦ 5Bet5Bet < x < 1-F24Bx ≧ 1 – F24B
5Bet x < 1-F25Bx ≧ 1 – F25B

条件として、5Bet ≦ 4Bet ≦ 3Bet ≦ PFR ≦ VPIP、F25B ≧ F24B ≧ F23B ≧ F22B ≧ 1-VPIPという制約は必要だろう。単純化としてPFR=1-F23B,3Bet=1-F24B,・・・みたいにしてもよいが、一般的にはPFRするけど3BetはFoldする手札とPFRで3Betにもコールする手札は同じではないだろうと思われるため、別々に設定できた方が良いと思われる。

プレイヤー数やポジションの影響の反映

 これは以前考察したことがあり、以下のページの内容を用いる。

スタックやアンティの影響の反映

 一般によく知られているスタッツの適正値(VPIP=20%など)は、100bb戦のアンティが0のゲームの数値であり、スタックやアンティが異なればこの適正値は異なるものであることに注意する必要がある。スタックが少なくなるほどVPIPや3Betは高めになるし、アンティが大きいほどVPIPが高くなる。これらは適当な掛け目表を用意してゲームの状況に応じて戦略を切り替えるようにする必要があるだろう。

まとめ

 プリフロップにおける戦略をまとめたが、設定した値の通りにスタッツが観測されるという意味ではないということに注意する必要がある。あくまで、上位\(\small x\)%の手札について、このように行動すると定めたものであるから、3betなどは設定値と異なることが一般的だろう。例えば、3Betは6~8%が適正値と言われるが、これに対応する設定値はx=3~4%ぐらいと推測される。スタッツの3Betは分母が3betが可能な機会であるが、これはすべての手札に対して生じる機会ではないためである(自分が先にFoldしてしまえば、その分だけ分母が小さくなる)。この辺りのパラメータ設定はゲーム設計者がうまく設定してあげる必要があるのだろう。

 本稿の内容でプリフロップにおける戦略は確定できると考えられる。次回以降はポストフロップの戦略について考察していく。