見出し画像

【ポカチェ】スタックから直接バブルファクターとICM必要勝率を求める方法

こんにちは!ARAです。
今回はスタックから直接バブルファクターとICM必要勝率を求める方法を紹介します。

と言っても、これだけだと意味がわからない方多いと思うので順を追って
説明します。


1. ICM必要勝率とは

ICM,およびバブルファクターを考慮した上での必要勝率のことです。
実際にこういう用語があるわけではないのですが、便宜上こう呼ぶことにします。

ICM必要勝率は、次のように計算します。
必要勝率をxとして、

(Foldした時の賞金期待値) <=  (勝った時の賞金期待値) x + (負けた時の賞金期待値) (1-x)

を満たす最小のx

実際には、等号を満たすxのことと考えて良いです。

イメージが湧きにくいという方は、次のシチュエーションを考えてみてください。

Q. ステージ6で序盤エニハンオールインマンが現れた。
あなたはAKを持っているが、あなたはこれにコールできるか

多くの人はFoldすると思います。
なぜなら、「このオールインに負けたら即6位だが、ダブルアップしても1位になれるとは限らない」からです。

つまり、このオールインに対し、50%の勝率では期待値が足りないということです。

とはいえ、AAなどの強いハンドは流石にコールした方がお得です。

では、賞金期待値(レート期待値)の観点から、どれくらいの勝率が必要なのでしょうか。

これを考えるのが、ICM必要勝率です。

2. 現状のICM必要勝率の計算方法

このように、ICM必要勝率は、レートを盛る上でとても重要な概念です。
ただ、厄介な問題があって、それは、現状ICM必要勝率を求めようとしたら、とても手間がかかってしまうということです。

手順を説明します。
ICMIZERというサイトがICMを自動で計算してくれるので、そのサイトを活用します。

  1.  ICMIZERで、Foldしたときの賞金期待値を計算します

  2. ICMIZERで、勝った時の賞金期待値を計算します。

  3. ICMIZERで、負けた時の賞金期待値を計算します。

  4. 電卓等で、勝った時の賞金期待値 - Foldした時の賞金期待値を計算します。

  5. 電卓等で、Foldした時の賞金期待値 - 負けた時の賞金期待値を計算します。

  6.  4で求めた値で、5で求めた値を割ります。この値がバブルファクターです。

  7. 6で求めたバブルファクターを、(1+バブルファクター)で割ります。この値がICM必要勝率です。

と、これだけの手間がかかってしまうんです。
シズマ4期1位の方はこんなにも手間のかかることをやられていたということです。
すごいですよね。

それで、私も必要勝率を計算することはやはり大切だと痛感したのですが、
現状それがあまりに大変なので、簡単に必要勝率を計算できるツールを作ろうと思いました。

(補足)
ある方からBFはante/blindを考慮しないと指摘を受けました。
その意味では、私が計算するものは厳密にはBFではないかもしれません。
ただ、ポカチェをプレイする上でante/blindは決して無視できないもので、それらを含めたものを考えるべきだと思っています。
なので、正確にはante/blindあり版BFというべきかもしれないですが、下手に言葉の厳密性に拘るのもかえって混乱を招くものと思うので、ここではそのままBFという言葉を使うこととします。

3. 作ったツール(ステージ6対応)(修正しました)

Webサイトを作るのは色々と大変(というか割に合わない)なので、LINEbotで、スタックを入力をするだけで、バブルファクターと必要勝率を計算してくれるものを作りました。(もし、これ以外に良い公開方法があれば教えてくださると嬉しいです!

ちなみにこのLINEbotはステージ6用です。
7節に、シズマや一般のPrize配分に対応した計算ツールも公開しているのでシズマや一般のトーナメント用に使いたい方はそちらを利用してみてください。
また、シズマとの比較は5節に書いているので参考にしてみてください。

⚠️【注意】⚠️
このツールは、公開後計算にミスがあることがわかったため、修正を加えています。使い方も、公開時とは変わっているため注意してください。

このQRコードを読み込むと、LINEbotを追加できます。

簡単に使い方を説明します。

1番最初に自分のスタックを入力します。
そのあとはポジション順に入力してください。
例:ポジション順に[10,5,3(自分),6,]の場合→3,10,5,6
ただし、単位は⚪︎BBです。
(アンティ/SB/BBを0.25/0.5/1で設定しているため)

また、スタックは、プリフロップのアンティ、ブラインドを支払い終わった時点(すでにPotにこれらが入っている)のものを入力してください。
(実際にcallするか悩むのは支払い終わったあとなので、おそらくこっちの方が使い勝手が良い)

最後に、自分がSBだったら1、自分がBBだったら2、それ以外だったら0を入力してください。

すると、入力した順に、他のプレイヤーからオールインを受けた時のバブルファクターと必要勝率を計算することができます。

例えば、画像の1番目の入力
「10 5 3 0」
とその応答メッセージを見てください。

これは、自分のスタックが10BBで、SBでもBBでもないとき、
スタック5BBのプレイヤーのオールインに対するバブルファクターが0.97
スタック3BBのプレイヤーのオールインに対するバブルファクターが0.89

スタック5BBのプレイヤーのオールインに対する必要勝率が0.49
スタック3BBのプレイヤーのオールインに対する必要勝率が0.47
(%表記に直すなら100倍)

ということを意味しています。

同様に画像の2番目の入力
「10 5 3 1」
とその応答メッセージは

自分のスタックが10BBで、自分がSBのとき、
スタック5BBのプレイヤーのオールインに対するバブルファクターが0.76
スタック3BBのプレイヤーのオールインに対するバブルファクターが0.77

スタック5BBのプレイヤーのオールインに対する必要勝率が0.43
スタック3BBのプレイヤーのオールインに対する必要勝率が0.43

ということを意味しています。

最後に、画像の3番目の入力
「10 5 3 2」
とその応答メッセージは

自分のスタックが10BBで、自分がBBのとき
スタック5BBのプレイヤーのオールインに対するバブルファクターが0.76
スタック3BBのプレイヤーのオールインに対するバブルファクターが0.42

スタック5BBのプレイヤーのオールインに対する必要勝率が0.43
スタック3BBのプレイヤーのオールインに対する必要勝率が0.30

ということを意味しています。

また、試しに
「150 150 150 150 150 150 0」
と入力し、その応答メッセージを見ると、
みんなが150BB持ちの時、150BBのオールインには大体68%の勝率が必要であることがわかりますね。

AKは、エニハンに対する勝率が65~67%ほどなので、ギリギリ必要勝率がたりてないことがわかります。

(補足)BBからオールインをされることはないので、
BBとのバブルファクターと必要勝率は、自分がオールインしてBBにコールされたときのバブルファクターと必要勝率と考えてください

4. 実践例

では、使い方がわかったところで、実戦での活用を考えてみましょう。
このcall/foldよかったんかなぁって振り返りに使えます。

CO(7.2BB)のプレイヤーがAIしてきました。あなたはこれにコールすることができるでしょうか。

あなたは、ショートの2倍以上のスタックを持っています。
バブルファクターも小さそうですし、コールしても良さそうな気もします。

では、計算結果を見てみましょう。
「20.7 7.2 7.4 9.6」と入力します。

大体46%ということがわかりました。

微妙ですね。
ギリギリ足りない、あるいは本当にcall下限といったところだと思います。

こんな感じで、迷った場面の振り返りを行うことができます

参考のため、Nash均衡とも比較してみましょう。


COのオールインに対してSBのコールレンジは、
13.4%, 44+ A6s+ A8o+ KJs+
だそうです。

あ、KQo入ってない・・・

_:(´ཀ`」 ∠):

・・・
・・・・・・・
・・・・・・・・・

(まさかイキりコールしたなんて言えない・・・)

単純な必要勝率を見ても、均衡解を見ても、KQoでのコールは微妙ってことがわかりました!

5. 注意事項

最後に注意事項をまとめておきます。

・このLINEbotはステージ6に対応したものです。(賞金期待値をステージ6のPrizeから計算している)
シズマの4〜6盤面のときとは誤差がでます。(3人盤面以下の時は一致)
おそらく、
4人盤面 ステージ6よりバブルファクターと必要勝率が大きい
5人盤面 同じくらい?
6人盤面 多分だけどシズマの方がバブルファクターと必要勝率が小さい

こんな感じだと思います。

・入力するスタックが小数第一位までになってる&出力される結果は小数第二位までになってるのでそこで多少の誤差は生まれる。

・アンティを0.25bbに固定しているので、例えば950/1900/3800の時は問題ないが、630/1250/2500のときなどは誤差が生じる。

他にもあれば思いつき次第追記していきます。

最後まで読んでくださり、ありがとうございました!

6. Webサイト上で登録なしで使える方法

Linebotは使いづらいというかたも多いかと思うので、Google Colaboratoryの方でPythonコードを公開します。

プログラムに、

#ここに 、スタックを入力してください

stacks = [150,150,150,150,150,150]

という部分があるので、ここにスタックを入力してください

そしたら、▶️みたいなボタンが左側にあるので、それを押してください。
そしたら、計算することができます。

【追記】

フォロワーの方から意見をいただいてこちらだと表の形で出力することにしました。

このような形で、縦がcallする側で横がPush側です。
例えば、スタック5bbを持つプレイヤーBが、スタック10bbを持つプレイヤーAのオールインにコールする時のバブルファクターは1.528、必要勝率は大体60%です。

また、pot= の部分を調整することで、オープンにレイズオールインを返された場合など、より広いシチュエーションに対応できるようにしました。

7. シズマや一般のPrize配分に対応した計算ツール

3~6節で紹介した計算ツールは、ステージ6対応で、シズマや分散ICM、一般のトナメ用には使えないものでした。

実際に「シズマでは使えないのか」とご質問を頂いたので、一般のPrizeに対応した計算ツールも作ることにしました。

プログラムの下の方に、

# スタックとプライズを入力してください

stacks = [150, 150, 150,150,150,150]

prizes = [6,5,4,2,1,0]

という部分があるので、ここにスタックとプライズを入力してください。

シズマであれば[6,5,4,2,1,0]で大丈夫です。
ただ、プレイヤーの人数とプライズの数を揃えないといけないので、
残り5人の時は[6,5,4,2,1]
残り4人の時は[6,5,4,2]
残り3人の時は[6,5,4]
残り2人の時は[6,5]
としてください。

結果の見方はステ6用の計算ツールと同じです。

ただ、6人のときに実行に18秒かかる。
7人以上の時は実行に何秒かかるか分からないという難点があるので改善中です。

シズマは6maxで、6人盤面でバブルファクターや必要勝率を計算すべき盤面はそこまで多くないので、シズマ用に使う分にはそこまで問題ないかもしれないです。

一般のトナメも6人以下の時は役に立ちそうです。
FTは10人くらいいそうなので10人の時まで計算できるととても良いと思っています。

今はステ6用のツールと同じ形式にしていますが、計算量削減のために今後仕様が変わるかもしれません。

処理速度改善のために、アドバイスをくださった方、ありがとうございました!(最初に書いた時は40秒でした)

(追記)
こちらもステ6用と同様表の形式で出力するように変更しました。
そのため、計算量が増えて6人以上の計算ができなくなりました。
今の所、6人盤面は頻度が少ない割に大変なので一旦このままにしていますが、
要望が多かったら6人以上の計算も検討します。



この記事が気に入ったらサポートをしてみませんか?