PioSOLVER:計算コストについて

本記事では
・計算に必要なメモリ
・計算にかかる時間
のことをまとめて計算コストと呼ぶこととします。Treeの設定と計算コストの関係について、いくつか重要だと思う部分を解説します。

ーーーーーーーーーー

■ボードによる違い(同型の影響)

pokerのハンドは1326種ありますが,例えばFlopが As Ks Qs の場合

・[3s2c, 3s2d, 3s2c]
・[3c2s, 3d2s, 3h2s],
・[3c2d, 3c2h, 3d2c, 3d2h, 3h2c, 3h2d]

などの組は、このFlopにおいては等しい戦略をとるとしてよいでしょう。
Flopにおいて1326種の戦略を計算する必要も,メモリに格納しておく必要もありません。PioSOLVERにおいても、このようなboardでは、計算コストが下がります.

計算コストの高いFlopは、
4s 3c 2d
のように、数とスートがどちらも3種類あるタイプのboardです。

例えば集合分析でまとめて計算させる場合などは、このようなboardに
照準を当てて必要なメモリや計算時間を見積もっておくようにしましょう。paired board等に合わせてぎりぎりメモリが足りるようにしてしまうと、計算コストが高いboardを計算させる際にメモリエラーが起きてしまいます。

ーーーーーーーーーー

■レンジによる違い

PioSOLVERでは、計算コストは両プレイヤのレンジの和集合から定まります(消費メモリだけでなく、計算速度に関してもそうなるようです)。

自然にCFRアルゴリズムを実装すると、このような現象は起こらないので、
どうしてPioSOLVERでこのようなことになるのかは不明です(効率悪い実装になっている可能性??)。

計算コストの節約の目的からは、不要なハンドは間引いてレンジの和集合を狭めると良いでしょう。代表的な使用例は、Preflop Solution rangeの類を利用するときに、ほぼ含まれていないハンドを削除しておくというものです。

たとえ重み 0.01 でも、含まれているかいないかだけが計算コストに影響しますので、Roundなどを使って間引いておくと良いでしょう。

後述の subtree configrationを利用する場合にも、重みが極めて小さいハンドが含まれてきますので、有効です。ただし、turn以降の計算で計算コストが問題になることはほとんどないのでこれは手間なだけかもしれません。

ーーーーーーーーーー

■戦略の固定

例えばOOPからレンジ全体で 50% pot CBを打たせるには、次のような方法があります。

1.node lockを使う

treeをbuildしたあと、lockしたい戦略を選択して、[lock all hands -> Set strategy and close]を選びます。この状態でいつものように「Go」から計算を開始すると、選択した戦略を固定したまま計算を行ってくれます。

※ ハンドごとに戦略を変えたり、一部のコンボのみをlockすることなどもできますが、この記事では省略。

2.force OOP betを選択する

flopアクションのごく基礎的な部分について、チェックボックスひとつで戦略の固定ができるようになっています。これは[Build Tree]よりも前の段階で選択します。

3.Remove linesを使う

こちらも、[Build Tree]よりも前の段階で記入します。

3つの方法を紹介しましたが、これらの計算コストは次のような関係です:

1. node lock > 2. force OOP bet = 3. Remove lines 

node lock のみが計算コストの観点から劣ります。戦略を指定するタイミングが[Build Tree]よりも前か、後かというところからも推測することができるかもしれません。戦略を固定してもOOPがcheckする場合も含めた大きいtree自体は維持してしまっています。メモリだけでなく計算速度も遅いです。

コンボごとの戦略の指定にはnode lockが必要ですが、レンジ全体で必ずとる、あるいは必ずとらない戦略が存在する場合には、Build Treeよりも前に間引いてしまう方が計算コストが抑えられます。

2. force OOP bet と 3. remove lines はflop betを固定したいという用途であれば全く同一ですが、一般にはremove linesを使う方ができることの幅が広がります。

例えば上の画像のような指定をすると
1行目:FlopでCBを打たれなかったらTurnで必ずBetしてくるOOP
2行目:FlopでCBを打ったらTurnでも必ずBetしてくるIP
3行目:FlopでRaiseしたらTurnでも必ずBetしてくるIP
へのexploit戦略などが確認できます。

ーーーーーーーーーー

■Build Treeのオプションいろいろ

この辺には、基本的にはRemove linesを適当な条件下で自動でやってくれる感じの設定がいろいろあるようです。個人的にはほとんど使っていませんが、[use only RAISE size if there was a raise]なども、頻度の少ないラインからの無駄な分岐を減らすのに役立つかもしれません。この辺で面白い工夫をしている方がいらしたら教えてもらえると嬉しいです。

また、特に2x等の小さなraise sizeを指定している場合には、何らかの形でbetting capをつけておくようにしましょう。意図しないような巨大なtreeになってしまう場合があります。

ーーーーーーーーーー

■Create subtree configration

flop, turn, riverのすべてで一気にいろんなbet sizeの可能性を計算しようとすると、計算コストが膨大になりすぎてしまいます。ひとまずflopの戦略を勉強するために、TurnやRiverの選択肢を間引いて計算してみましょう。

計算コストを節約したことで、手っ取り早くいい感じに計算できたとします。しかし今度はTurnやRiverのbet sizeを詳しく検証したくなってきました。

このようなときには、Turnカードを落とすところまでTreeを辿ったあとで、[Tree -> Create subtree confingration]を選択します。

選択したTurn(あるいはRiver)の情報が入力され、あとは自分でbet size等を増やしたらいつも通りBuild, GoしたらTurn以降の詳しい勉強ができます。

Turn以降に専念すると、計算コストは劇的に減少し、多少betやraiseの選択肢を増やしてもあっという間に計算できるため、非常に便利です。

面白い記事だと思ったら少額でもサポートいただけると、記事執筆の大きな励みになります。