見出し画像

考え方設計

イントロ

多分本編じゃないわりにつらつら書くので内容のみ知りたい場合、次の見出しまで飛ばしてください

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のベットをするか(単純化のためベット額は固定)、ベットした場合、先行がコールするかフォールドするか(単純化のためレイズは無し)の思考ゲームとする

期待値の前に

ここで学んだ理解を並べる事は出来るが、そうすると知識で終わり、実用化できない。のでどんなプロセスで理解したのかを順を追って述べていきたい

で、どんな動きが最適でどんな結果を生むのかを考えると、どこから考えて良いのか「とっかかり」がない。よって混乱する
だから一番簡単に考えられそうな事から考える。どこから考えるのか難しいが、自分が疑問なく呑み込める所から考える事が重要だと思う。そして最終的に何も疑問に思わず「そうだね」と呑み込めるようにする事だ。知識だとたまに知っていても呑み込めていない事がある

思考の始め方と知識の落とし込み

とりあえずここは「期待値を最大限にする事」が一番得するという所をゴールとしたい

そうして今回のルールにおいて有利である後攻を主に自分の主体として置き、なるべく単純なパターンがどれかを探していく

そうすると極力単調な結論が早いところから1パターン考えて、そこからフォーマット、ルールを紐解いていく
最終的に取りこぼさなければいいので、細かい条件は後から考えると決めることで思考を散らかさない事が大事だ

単純化

ちなみに最初は紙とペンを持って整理することが良いと思う。PCやスマホでは遅い。思考したことのメモに記載がおいつかない。ペンタブも書いた手元で直視できないのはちょっと辛い。液タブならぎりいけるかもしれない
それで一通り整理できたら次は頭の中だけで同じことを考えて同じ結論に行けることを確認する。そうしないとゲームで適用するのは難しいだろう

思考整理と習熟

期待値を考える

てことでこのゲームの全体の期待値(EV)を考えたい。最適なプレイを行えば「期待値を最大限にする事」が出来るはず。そうすればIP、OOP両方で一番いいプレイが分かるということになる

今回のパターンではルールを縛る事でIPからベットすべきかの判断が出来るようになるみたいだ。それ以外の行動は縛っており、ベットでどれぐらいのリターンが期待できるかの期待値を考える

整理するターゲット

最初のパターンと考えるルール

考え方を統一するために最初にプレイヤーを固定して考え方を統一していく
自分ルールで良いが、一番考えやすい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を貰う

A-QのIP視点

これから期待値を計算するが、ここでの考え方も少し難しいので実際やってみて自分ルールを整理することが大事
計算すべきはパターンの期待値だろう

とっつきやすい獲得したpotから考えると$3を$1のベットで獲得しており、このパターンでの⑥ベットの期待値は「pot/ベット額」で「3/1=3」となりベットする$1は常に3倍となる

が、①~⑧パターン全体としては参加費を$1払っているため、期待値としてはベット額に参加額を加える必要があり
「pot/(ベット額+参加費)」
よって「3/(1+1)=1.5」

期待値をどこから考えるか

つまりこのパターンをゲームとしてIPで参加してベットをすることで常に1.5倍となる。

時系列順に考えることもとっかかりだが、今回は混乱しやすい

参加費を払い、ベットした後potを獲得するのでpotを割る
(参加費+ベット額)と組み立てて割る元のpotを立てて
「pot/(ベット額+参加費)」
いまいち直観的でなくなる

時系列は思いつきやすいが常に正解でない

次のパターン

次にIPがA、OOPがKを引いたパターンを考える。つまりA-Kパターンだ

なぜならなるべく結論に近い所での設定変更であればほとんど最初のパターンと同じ考えを流用できるからだ

パターンをまとめていく

そうすると少し変わる。なぜなら⑦においてOOPから見てベットされた後のコールかフォールドか選択時にIPがAを持っているのか、Qを持っているのか分からないからだ。

よって、3/4でコールする。コール率は「pot/(ベット+pot)」で求める。もっと細かい説明もあるが、イントロの通り、別記事☆2としよう。

ここで次のパターンは実は分岐してしまう事が分かる
A-KパターンにOOPがコール、フォールドする分岐があるのだ。ここでパターンの組み方を変更する場合はA-Qパターンから考え直す必要がある
次にパターンを変更する場合が出てくるので今回は一旦考え直さず、例外として処理してみる

簡単なパターンから進むと当然複雑化する

こうやって、細かいところの理解を合っているという前提のもと理解せず使うのは、ライブラリを使う感覚に似ている。上手く呑み込めるのならそのままでいいし、納得できないなら調べるべき。ただし、趣味なら良いが、仕事で納得できるまで調べようとすると時間(コスト)がかかって仕方ない

ライブラリとは

今回はIPはAを持っており、勝つことが確定しているので集約して$0.75のコールと考えることも出来る。ルール的には出来ないが、今回は例外として処理する。そうするとA-Qパターンでは「pot/(ベット額+参加費)」が「3.75/(1+1)=1.875」

A-KのIP視点

つまりこのパターンをゲームとしてIPで参加してベットをすることで平均化すると1.875倍となる

Aをまとめると(1.5+1.875)/2=1.6875

これでIoがAを引いたパターンを整理できた

更に次のパターン

これを繰り返し、全パターンを洗わないとゲーム全体の期待値は出せない。次はIPがKを引いたパターンだ

流れとしてはK-AパターンとK-Qパターンで整理したいが、パターンのフォーマットを変更してしまう。何故ならKを引いたパターン全体で取りまとめられてしまい、Aを引いたパターンと別のまとめ方で「Kだけのカプセル」で考えた方が楽そうで、それはAも「Aだけのカプセル」で切り分けて考えた方が楽だとここで考えたからだ

カプセル化

これは単純で⑥アクションにおいてチェックする。なぜならベットしても、OOPが⑦レスポンスの時にAを引いていれば勝つのでコールされるし、Qを引いていれば負けるのでフォールドされ、pot額はそれ以上増えない。ベットするだけ損だ

するとK全体で結果は$2貰うと無しが1:1で結果は$1を貰うとなり「pot/(ベット額+参加費)」が「1/(0+1)=1」となり、損得なしだ

KのIP視点

ブラフが入ってくるパターン

次が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を割る

QのIP視点でチェック

最後のパターンとして⑥ベットする25%をQ-ベットパターンとして紐解く。⑦OPPはコール率は「pot/(ベット+pot)」で計算すると「3/(1+3)=0.75」となり75%で負ける。
⑧potには$3あるがOOPにコールされると獲得できず、25%の確率でフォールドされると$3貰えるのでpotは$0.75貰える

QのIP視点でベット

「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倍は書いてる
けどおかげでポラライズとか理解がかなり進んだ気がする
ただ、この記事で書きたかった「考え方ってこう進めるんだよ」が表現できているかがすこぶる不安。そういう意味ではぶっちゃけこの記事を書き始めた動機は消化しきれてないけどエネルギーが切れた


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