Fast FoldにおけるNPCの設計

確率論

概要

 多分にベータ版的な位置づけではあるけど、筆者のポーカーアプリ”Exotic Poker”においてもFast Foldのゲームがマルチプレイで実行できるようになった。ルールは以前の投稿

で提案したものと同じである。通常のリングゲームと異なり、決められた時間(30分)の間にどれだけのチップを獲得できるかをランキング形式で競うゲームである。Ring GameやMTT (Multi-Table Tournament) というよりはMTL (Multi-Table League) と言う方がより適切であるかもしれない。ルールは改良の余地が多分にありそうであるが、一旦のゲーム設計としては意味があるものになっているように思える。

 現時点において、筆者のアプリは人間のユーザのみで十分なマルチプレイのゲームができる状況にないので、NPCを用いてゲームの人数を水増しすることでゲームを開催するようにしている。この際に用いているNPCのアルゴリズムについて簡単に紹介しておこうというのが本稿の内容である。単純に、ポーカーのNPCのロジック設計について知りたいというのでもよいし、筆者のゲームでFast FoldのゲームのNPCをどうやって倒したらいいかを考えるために読んでみてもよいだろう。

 シングルゲームでは、モンテカルロシミュレーションを行って期待効用を最大化するモデルを考えていたが、マルチテーブルのゲームではサーバサイドで処理を行う必要があるため、計算コストが相当にかかってしまうことになる。そのため、なるべく単純なルールでNPCの行動が決定できるようにアルゴリズムを考える必要がある。

プリフロップ

 開催しているFast Foldのゲームはオーソドックスな6max,100bb,アンティ無しのゲームなので、定石に近い戦略を打ってくるように設計するのが良いだろう。以前の投稿で説明した通り、各ポジションのVPIPは大体以下の通りである。

UTGMPCOBTNSBBB
VPIP14%16%18%31%22%19%

このVPIP外にある手札はFast Foldで即フォールドしてしまってよいということになる。ただし、BBは開始時点でアグレッサーなのでフォールドすべきでないし、SBは手前のプレイヤーまですべてフォールドした場合、70%ぐらいのレンジでリンプインするかレイズすべきとなるので、そのレンジ内ではFast Foldしないようにする。

 UTG,MP,CO,BTNについては、手札が配られた時点で手札がハンドレンジに入っていなければ即時にFast Foldしてもよいだろう。上記のVPIPは基本的に自分の手前のプレイヤーがフォールドした場合の値であろうから、ハンドレンジを決定する際の勝率テーブルは以下の人数の表を採用する。

UTGMPCOBTN
人数6543

具体的なハンドレンジを確認したい場合は以下のページでVPIPと人数を設定して確認できる。

 SBはVPIP70%のレンジに入っていない場合はFast Foldする。反対に、そのレンジに入っているが、VPIP22%のレンジに入っていない場合は、手前でレイズするプレイヤーがいないかを確認する。いる場合はフォールドを選択し、いない場合(SBとBBしかいない場合)は、以下の行動を選択する。

  • VPIP22%のレンジ内:レイズ
  • 上記以外でVPIP70%のレンジ内:コール(リンプイン)

BBについては、手前でレイズしたプレイヤーがいる場合は2ベットまではVPIP50%のレンジでコールする。SBのみがリンプインしてきた場合は以下のように行動する。

  • VPIP19%のレンジ内:レイズ
  • それ以外:チェック

以上で2ベットまでの行動は決定できるだろう。

 3ベット以上については、機械的に以下のように定めよう。

  • VPIP表の上位1/4のVPIPレンジ(例:UTGは14%/4=3.5%):3ベットする。
  • VPIP表の上位3/4のVPIPレンジ:3ベットしないが3ベットにコールする。
  • 残り:2ベットするが3ベットされたらフォールドする。

ポジション毎に3ベットに対する行動が少しずつ異なるだろうが、おそらく平均的な行動と似通った行動になると推測できる。4ベット以上については、3ベットレンジの手札はコール、それ以外はフォールドで良いだろう(NPCは4ベット以上を打ってこない)。簡易的なルールであるが、意外にそれっぽい行動をしているように見える。

ポストフロップ

 プリフロップで適切な手札を選択していれば、フロップ以降は適当なプレイでも(ランダムに行動を選択しても)そこそこ強いNPCになると考えられる。仮に、フロップでカードが開いた結果として弱いハンドになってベットしたとしても、ブラフとして機能するからである。しかし、人間っぽいプレイ感を出すため、いくばくかの調整は入れた方が良いだろう。具体的には、以下のような項目である。

  1. CBを打つ比率を調整する。
  2. Donk Bet/Check Raiseを打つ比率を調整する。
  3. バリューがないハンドでCalled Callをしないようにする。

何も考えずにランダムに行動するとドンクベットが目立ったり、明らかに負けているハンドでコールしてしまったりするので、それは避けるように簡易的なロジックを考える。

 将来的には、統計モデルなどを用いたモデル(ハンド評価モデル)を用いて手札の評価をするように精緻化したいが、とりあえずの簡便的な方法として以下のような行動モデルを考えよう。

  1. 自分がアグレッサーの場合、手札と共通カードで以下の役以上の役が出来ている場合はCBを打つ。
    • フロップ:Aハイのハイカード以上
    • ターン:ワンペア以上
    • リバー:トップペア以上
  2. 自分がアグレッサーではない場合、以下の場合はドンクベットする。
    • フロップ:一定確率(10%)でブラフベット(役に関係なし)
    • ターン:一定確率(10%)でブラフベット(役に関係なし)
    • リバー:ツーペア以上+一定確率(10%)でブラフベット(それ以外はチェック)
  3. チェック→ベットで自分に回ってきた場合、以下の役以上はレイズする。
    • フロップ:ミドルペア以上の役+一定確率(10%)でブラフレイズ
    • ターン:トップペア以上の役+一定確率(10%)でブラフレイズ
    • リバー:トップペア以上の役+一定確率(10%)でブラフレイズ
  4. チェック→ベットで自分に回ってきた場合、3.でレイズしなかった場合に以下の役である場合はフォールドする(それ以外はコール)。
    • フロップ:Kハイのハイカード以下
    • ターン:ハイカード
    • リバー:共通カードの3番目のランク以下のペア
  5. リレイズ以降は以下のハンド以上はコール、それ以外はフォールドする。
    • フロップ:ワンペア以上
    • ターン:トップペア以上
    • リバー:トップペア以上

大分雑な感じの戦略であるが、教科書的なアプローチに近い行動モデルになっていると思われる。繰り返し対戦して挙動を確認できるようにシングルプレイのゲームで試せるようにもしようと思う(先にそっちを実装しろよという話ではあるけど)。

ゲームの開催時間

 筆者が開発したポーカーアプリ”Exotic Poker”

において、以下の時間帯でTexas Hold’em (Fast Fold)のゲームを開催している。

  • 3:00 UTC (12:00 東京)
  • 9:00 UTC (18:00 東京)
  • 15:00 UTC (0:00 東京)
  • 21:00 UTC (6:00 東京)

多分にベータ版的な機能であるため、不具合やサーバ落ちもご愛嬌と思える人はプレイしてみてもらえれば幸いである。NPCはそれとわかりづらいようにニックネームを普通に付けているが、反応速度が明らかに速いため、おそらく察することができるだろう。

 本稿のアルゴリズムとプレイしてみると、やはり手強い感じがかなりする。プリフロップのハンドレンジがしっかりしているだけでも、相当に強いプレイヤーと感じると言われるが、それは正しい意見なのだろう。フロップ以降の戦略はまだ適当な感じがするため、その辺りを攻撃できれば勝てる要素もあるのではないだろうか。基本的な戦略を理解した人~中級者ぐらいの人がプレイすると歯ごたえがある(とはいえ勝てないこともないぐらいの)対戦相手になっているかもしれない。筆者はエムホールデムとかポーカーチェイスのせい(?)でルースすぎるプレイをするが、そのノリでプレイすると普通にボコられる気がする。タイトアグレッシブ矯正ギプスみたいな使い方もできるかもしれない。