考え方設計
イントロ
多分本編じゃないわりにつらつら書くので内容のみ知りたい場合、次の見出しまで飛ばしてください
Poker勉強してたら急に自分の趣味と仕事での得意な部分ってのが理解できた
多分これから書くことで書きたい事が上手く伝わって実践できれば、プログラミングがやりやすくなったりとか、将棋やPokerなど技術介入が大きい競技や作業で技術上達が早くなったりとかするんじゃないだろうか
そんな壮大な気づきを自分の中で得たけれど、残さないと忘れそうだから書き残したいという思いと、自分の中に落とし込むための文章化が目的。これをしないと多分自分の中に技術として落とし込めない
あとはこの気づきを人に教えたいのだけれども、日常会話で話すと押しつけにしかならないし、整理できないのでnoteにした
プロセスについては以下のようなnoteの引用フォーマットで表現するのでゲームの流れと別の思考プロセスという考え方をして欲しい
ちょっと固い話になっちゃうけどこの本の一部を抜粋するイメージかもしれない。ビジネスかつ翻訳の本だからこの本自体めっちゃ読みにくいけどね。内容はすごい
てことでこれからPokerをベースとして単純化したゲームを数学的に分解して理解を深めたい。ちなみに期待値って算数?数学?多分数学
つまり書きたい事は、知識ってこうやって技術にするんだ、考え方ってこうやって整理するんだってこと、その気づきにしたい
ちなみにこの本を読んでの気づき。細かい事とかもう少し前のステップとかは本を読んでください
利用する用語についても非常に悩ましい。Pokerを基盤とした話なのでPokerの用語を用いたいが、そうすると今回の第三目的の人に教える部分の突っかかりになってしまう
実際自分もPoker記事を読むうえで用語についていけず内容が入ってこない事が今はまだ多い。今回の内容であれば一般用語でも冗長にならずに説明できるだろうということでなるべく一般用語でいこう
でも説明があまりに直観的でなくなるのでpot、チェック、ベット、コール、フォールド、インポジション(IP)、アウトオブポジション(OOP)くらいは使うか
説明するとpotはテーブルの賞金だ。勝ったら貰える参加費とベット額の合計となる
チェックは行動のパス、ベットは追加すること。相手も同じだけ賭けろという感じ、コールはベットに応じて同じだけ賭ける事、フォール度はベットに対して応じず負けを認める事
アウトオブポジションは先にアクションをする先攻だ。以下OOPとする。
インポジションはOOPの行動を見た後からアクションをする後攻だ。以下IPとする。一般的にIPが有利とされている。OOPの動きを見て動きを決められるから有利というのが概要で、明確な理由、理論もあって説明できるが長くなるのでそこは別記事とする(別記事☆1)
そもそも自分の調べ方が良くないのかもしれないが、期待値とEVという言葉の定義が微妙にぶれている気がする。PokerのEVは語る人によっては数学的期待値ともちょっと違う気がするし、wikiの定義が厳密な気がするのでここでは「一度の実行で帰ってくる倍率」と考えることにする
言い換えると1を超えれば得するし、1ならそのまま、1未満なら損する値となる
ちなみに単に期待値といっても実はスコープの違う期待値が多数出てくる。混乱の元となるため、ここで整理する
全体の期待値:シナリオ全体の期待値。パターンを集めて出現率で合計したものになる
パターンの期待値:そのパターンにおける期待値
ベットの期待値:そのベット単体で見た時の期待値
最終的には全体の期待値を求めるが、場面ごとのプレイに必要なのはベットの期待値だ。その時点での期待値を考えないと、参加費を払っているからと追加でベットすると損害が拡大する。よく言うコンコルドの誤りだ
しかし全体の期待値としては考える必要がある。難しい話だ
あとは考え方設計と離れすぎる細かい理論については気が向けば別記事でまとめるようにして、本記事からは排除したい。ちなみにまだ書いてないし書く予定は割と低い
付け加えるとまだちょいちょい理論の理解が間違ってると思う。本当はこんな記事かけるレベルじゃないと思うけど書かないと理解が進まない
思考ゲーム
ルール(千里眼ゲーム)
pokerを簡略化したゲームで、二人でのゲーム。カードは{A,K,Q}の3枚から2枚をそれぞれに配る。参加費(アンティ)は$1としてOOPはチェックとして、IPがチェックするか$1のベットをするか(単純化のためベット額は固定)、ベットした場合、先行がコールするかフォールドするか(単純化のためレイズは無し)の思考ゲームとする
期待値の前に
とりあえずここは「期待値を最大限にする事」が一番得するという所をゴールとしたい
そうして今回のルールにおいて有利である後攻を主に自分の主体として置き、なるべく単純なパターンがどれかを探していく
期待値を考える
てことでこのゲームの全体の期待値(EV)を考えたい。最適なプレイを行えば「期待値を最大限にする事」が出来るはず。そうすればIP、OOP両方で一番いいプレイが分かるということになる
最初のパターンと考えるルール
考え方を統一するために最初にプレイヤーを固定して考え方を統一していく
自分ルールで良いが、一番考えやすい1パターンを選ぶ
IPがA、OOPがQを引いたパターンが一番考えやすい気がするのでそれから。このパターンをA-Qパターンとする
IPではAは必ず勝っているのでベットする。レイズ、リレイズはないのでベットしないとチャンスを失うだけで終わる
OOPではQは必ず負けているのでフォールドする。コールしたら余計に負ける
このパターンをIPから見て時系列に並べる
①まず参加費で$1払い、OOPも$1払うので②potは$2となる
③Aを引き、④OOPがQかKを持っているが自分はIPなのでどちらを持っているか分からない
⑤OOPがチェックして⑥Aは必ず勝っているので$1ベットすると、合計$2払ってpotは$3となる
⑦そうするとOOPはフォールドし、⑧$3でpotが確定、⑨結果$3を貰う
つまりこのパターンをゲームとしてIPで参加してベットをすることで常に1.5倍となる。
次のパターン
次にIPがA、OOPがKを引いたパターンを考える。つまりA-Kパターンだ
そうすると少し変わる。なぜなら⑦においてOOPから見てベットされた後のコールかフォールドか選択時にIPがAを持っているのか、Qを持っているのか分からないからだ。
よって、3/4でコールする。コール率は「pot/(ベット+pot)」で求める。もっと細かい説明もあるが、イントロの通り、別記事☆2としよう。
今回はIPはAを持っており、勝つことが確定しているので集約して$0.75のコールと考えることも出来る。ルール的には出来ないが、今回は例外として処理する。そうするとA-Qパターンでは「pot/(ベット額+参加費)」が「3.75/(1+1)=1.875」
つまりこのパターンをゲームとしてIPで参加してベットをすることで平均化すると1.875倍となる
Aをまとめると(1.5+1.875)/2=1.6875
これでIoがAを引いたパターンを整理できた
更に次のパターン
これを繰り返し、全パターンを洗わないとゲーム全体の期待値は出せない。次はIPがKを引いたパターンだ
これは単純で⑥アクションにおいてチェックする。なぜならベットしても、OOPが⑦レスポンスの時にAを引いていれば勝つのでコールされるし、Qを引いていれば負けるのでフォールドされ、pot額はそれ以上増えない。ベットするだけ損だ
するとK全体で結果は$2貰うと無しが1:1で結果は$1を貰うとなり「pot/(ベット額+参加費)」が「1/(0+1)=1」となり、損得なしだ
ブラフが入ってくるパターン
次がIPがQを引いたパターンでもうすぐ最後のパターンだろう。これが一番難しい。必ず負けているのだからベットするのは損するだけ。に見えるがそうじゃない。まぁこれも別記事☆3だろう
で、⑥IPからQでベットする頻度(ブラフ率)は「ベット額/(ベット額×2+ポット)」で「1/2+2=0.25」の25%でAと比較してそのまま25%でいい。よってチェックする頻度は残りの75%だ。これはQ-チェックパターンとして、この後カードを比較して負ける
しかし、$1ベットしていないので、実は$2のうち$1守っている
「pot/(ベット額+参加費)」が「1/(1+1)=0.5」となり、期待値が1を割る
最後のパターンとして⑥ベットする25%をQ-ベットパターンとして紐解く。⑦OPPはコール率は「pot/(ベット+pot)」で計算すると「3/(1+3)=0.75」となり75%で負ける。
⑧potには$3あるがOOPにコールされると獲得できず、25%の確率でフォールドされると$3貰えるのでpotは$0.75貰える
「pot/(ベット額+参加費)」が「0.75/(1+1)=0.375」となる
なんと面倒なことにbet額しない場合を割ってる。とても直観に逆らっているが、これも別記事☆4整理しよう
Qだけで整理すると「0.5×75%+0.35×25%=0.4625」
まとめる
ようやくすべてのパターンが出そろった。「(1.6875+1+0.4625)/3=1.05」
ゲーム全体でIPは1ゲームごとに5%ずつ増える計算になる。これがIPの具体的利益になる
この仕組みを理解できれば、ベット額等が変われば結果がどう変わるかある程度スムーズに理解できるはず
ベット額を増やす
このベット額を増やすとOPPに利益的になる。振り返りを含めて再検討してみよう
$2ベットする場合
IPがAから整理していく
OPPがQの場合、フォールドされるのは変わらないので「4/(2+1)=1」で期待値が1.33になる
OPPがKの場合、コール率が「4/(2+4)=0.66」
これをpotに値を加算して「(4+(2×0.66))/(2+1)=1.7733…」。合わせて約「1.55」になった
IPがKの場合はベット額が変わっても期待値は変わらない
IPがQの場合でチェックする場合の期待値は「2/(2+1)=0.66」、ベットする場合の期待値は「(4×33%)/(2+1)=0.44」
ブラフ率は「ベット額/(ベット額×2+ポット)」で「2/(4+2)=0.33」
「0.66×0.66+0.44×0.33=0.5808」
期待値は約「(1.55+1+0.58)/3=1.04」ほぼ変わらないが、少し下がった。何かどっか間違ってる気がする。もう少し上下しないと変な気がする
ただ感覚的には勝率イーブンで参加費$1を狙いにいって、投資額を増やしているので回収額が下がるので正しい気がする
一通り書いて振り返り
期待値(EV)
これは結構苦労した。PokerのEVって数学の期待値と定義が同じじゃない気がする。1を基準に0に近い程損だし、2なら倍になる係数が数学での期待値の定義だと自分は思ってた。けど違ったっぽい。
どのような値が期待できるか、つまり「1度の実行で結果どうなるか」なのか。EVはチップ量とかドルで示したり、マイナスで表現したり、ゼロ超えを目指してるのを見る。だからEVは多分期待値の定義から少しずれていると思ったけど、どうなんだろう?
ブラフ率(α)、コール率(MDF)
この辺については多分上で紹介した「ポーカーとゲーム理論」だと間違ってる気がする。まぁ値としてはかなり近い値が出てるから気づきにくいのかやっぱり自分の理解が間違っているのか。具体的にアンティの扱いが誤ってる気がする
でも他を探して出てきたこのαとMDFがどうやってこの公式を導けばいいのかが納得できるものを調べ切れてないんだよねぇ。別記事に書くみたいに書いてるのに!
てか振り返ってたらブラフ率の考え方多分違う。バリューとの比較をしない
期待値が$1を割る
とても記事を書くのが大変だった。何度も期待値が$1を割った。IPが有利なのは間違いないのに。最終的な差分はQをチェックする際にベットしていない$1だったけど、potの数値が良くずれた。それだけ細やかということか
コーディングの処理設計なら
本当は期待値の計算フォーマットは一律にしたい
「pot/(ベット額+参加費)」を親クラスにしてそれぞれpot、ベット額で計算用のメソッドを作成する形式になると思う
これを上から製造しながら進めると書き直しがとても面倒になる。だから先に処理の流れを言葉で設計する。そこが一通り破綻なく設計できたら製造に入る。その時の設計の取り掛かかり方、やり直し方を紹介したつもり
この仕事のやり方がイメージできたならきっとプログラマは向いてると思う
この文章上の言いたい事の分かりにくさはあるから分からないからって向かないとは思わないけど!!
Poker記事として
今の自分は多分まだ級位者クラスなので記事の質が悪いと思っている。多分正解を知りたければこの記事を読んだ方がいい。書きたい内容は書いてある
一応記事の意図としては考え方設計といいつつ処理設計のプロセスなので、この記事のただの劣化焼直しにはなってないはず
一応コーディングができる考え方をしたのでこの千里眼ゲームをゲーム的に最適にプレイするプログラムはこの記事をプログラム設計と出来るレベルのはず
何か疑問があれば一応答えます。正直合ってる保障はあまりないから価値があるかっていうと微妙だけどね
リテイクの山
将棋の記事は自分の中で結構芯があるのでリテイクはあまりしない。表だしする量の1.5倍くらい書くだろうか程度つまり半分以上一発書き。けどこの記事はやばかった。多分この形になるまで10倍は書いてる
けどおかげでポラライズとか理解がかなり進んだ気がする
ただ、この記事で書きたかった「考え方ってこう進めるんだよ」が表現できているかがすこぶる不安。そういう意味ではぶっちゃけこの記事を書き始めた動機は消化しきれてないけどエネルギーが切れた
この記事が気に入ったらサポートをしてみませんか?