クソ診断紹介3「下半身ジャンケン」
この記事は、クソ診断 Advent Calendar 2019 の16日目の記事です。
- 1. はじめに
- 2. 下半身ジャンケンの最適戦略
- 3. 診断メーカーへの実装
- 4. 人工知能に下半身ジャンケンをさせてみた
- 5. おわりに
- (参考1) いろいろな確率
- (参考2) 作成した他のちんぽ系診断
- (参考3) ソースコード
1. はじめに
皆さんこんばんは。クソ診断紹介3回目にあたる今日は、ジャンケンに第4の選択肢「下半身」を加えた「下半身ジャンケン」について紹介していきたいと思います。
まだこの診断を回したことがない人は、さっそく以下のリンクから不審者と下半身ジャンケンをプレイしてみましょう。
shindanmaker.com
いろいろな変則ジャンケン
幼少期の頃、変則的なルールのジャンケンを1度は遊んだことがあるかと思います。例えば、グーで勝てば3段、チョキで勝てば6段、パーで勝てば6段進み、階段の頂点を目指すゲーム(通称「グリコ」)は変則ジャンケンの1つにあたります。
また世界各国では、出す手の選択肢が4種類以上のジャンケンが存在します。
これについては、(英語版ではなくなぜか)フランス語版のWikipediaに情報が充実しているので、リンクを掲載しておきます。
Pierre-papier-ciseaux — Wikipédia
例えばフランスでは、Pierre(石)、Ciseaux(はさみ)、Feuille(紙)、Puits(井戸)の4種類の手を用いるジャンケンのルールがあるようです。
さらに、変則ジャンケンは数学の確率の大学入試問題として頻繁に出題されるだけでなく、小論文としての出題例もあります。2018年には、早稲田大学スポーツ科学部の入学試験において、ジャンケンに4種類目の選択肢を加えた新しいゲームを考案させる問題が出題され、大きな話題となりました。
じゃんけんの選択肢「グー」「チョキ」「パー」に、「キュー」という選択肢も加えた新しいゲームを考案しなさい。解答は、新ゲームの目的およびルールを説明するとともに、その新ゲームの魅力あるいは難点も含めて、601字以上1000字以内で論じなさい。
「下半身ジャンケン」誕生の経緯
さて、私の趣味の1つに、「日本不審者情報センター」に掲載される不審者情報の確認があります。
上記リンクを見ると、人をターゲットとした事案のうち最も多いものは「下半身露出」で、1日に数件~十数件もの事案が報告されていることが分かると思います。twitterで毎日たくさんの下半身露出情報に触れるようになった私は、2019年4月9日、ついに下半身ジャンケンのルールを思いつき、次のようなツイートをしてしまいます。
下半身じゃんけん
— 赤きち (@yryrrrrryryr) 2019年4月9日
・じゃんけんを複数回行って勝利数で勝敗を決める
・出し方は「グー」「チョキ」「パー」「下半身」の4種類
・下半身はグーとパーに勝つが、チョキには負けて以降のターンで出す事ができない(切り取られるため)
このツイートに対し、想像以上にリツイートやいいねの反応を頂けたこともあり、診断メーカーで実装してみたら面白いのではないかと考えました。この6日後の2019年4月15日、下半身ジャンケンは診断メーカーとして産声を上げることになりました。
ルール
下半身ジャンケンのルールを図1に示します。
- 2人で遊ぶジャンケンです。「グー」「チョキ」「パー」「下半身」の4種類の手を出すことができます。
- 下半身はグーとパーに勝ちますが、チョキに負けます。
- 下半身を出してチョキで負けた場合、次回以降の勝負で下半身を出す事ができません。
- じゃんけんを6回行い、合計勝利数が多いプレイヤーが最終的な勝者となります。
各章の内容
- 2章では、対戦者同士が最善を尽くした場合の最適戦略を探り、各手が出される割合を算出します。
- 3章では、診断メーカーで下半身ジャンケンを実装した過程を簡単に紹介します。
- 4章では、下半身ジャンケンに勝つための人工知能を作り、様々な戦略を持つ相手に戦いを挑みます。
おことわり
筆者はゲーム理論や人工知能について詳細な知識を持っているわけではありません。
そのため、厳密な議論を省略しイメージで書いている部分も多いかと思います。
また、内容に誤りがあった場合、twitter宛リプライまたはダイレクトメールでお知らせ頂きますと大変助かります。
2. 下半身ジャンケンの最適戦略
このゲームを診断メーカー化するためには、プレイヤーが各手を出す確率を決めておく必要があります。
この章では、ミニマックス法を用いて、相手がどのような戦略を取ってきても負けにくい戦略を考え、最適戦略を取ったときに各回で出される手の割合を算出してみましょう。
ミニマックス法では、対戦相手が期待得点を最大化するような「最適戦略」を常に選ぶものと仮定します。 このとき自分が取るべき戦略は、相手の最適戦略における期待得点の最大値を最小化させるものとなります。
図2に考え方の具体例を示します。
自分が戦略Aを取るとき、相手の最適戦略は「グー」「チョキ」「パー」「下半身」(いずれの手も出す可能性がある)で、このとき相手の期待得点は3点です。
自分が戦略Bを取るとき、相手の最適戦略は「下半身」のみで、このとき相手の期待得点は5点です。
このとき、相手の最適戦略における期待得点の最大値はA戦略の方が低くなるため、これが自分が取るべき戦略となります。
また、相手が複数の手をそれぞれ一定確率で出す場合、期待得点は特定の手を出す場合の最大値と最小値の範囲内に収まることから、以降相手の出す手(最大4通り)ごとの期待得点のみを考えるものとします。
各回で勝った場合+1点、負けた場合-1点が各プレイヤーに入るものとします。 このとき、利得表は以下のとおりとなります。
自分の手/相手の手 | グー | チョキ | パー | 下半身 |
---|---|---|---|---|
グー | 0 | 1 | -1 | -1 |
チョキ | -1 | 0 | 1 | 1 |
パー | 1 | -1 | 0 | -1 |
下半身 | 1 | -1 | 1 | 0 |
また、下半身を出す事が可能なプレイヤーは、下半身を出せない場合と比べ戦略が広がるため、より試合を有利に進める事ができます。そこで、残回数がのときに下半身が出せることの価値を 点 と定義し、自分と相手の下半身露出の可否で場合分けして戦略を考えていきます。
(a) 自分も相手も下半身が出せない場合
ただの普通のじゃんけんです。「グー」「チョキ」「パー」を等確率に出すことが自明に最適解となります。
(b) 自分の下半身だけ出せる場合
相手のみ下半身が出せない状態のため、この回で自分が「下半身」を、相手が「チョキ」を出さない限り、 次回でも点分不利な状態が継続することになります。
自分が(グー,チョキ,パー,下半身)を出す確率を と表すとき、相手の出す手と相手の期待得点の組み合わせは以下のとおりとなります。
相手の手 | 相手の期待得点 |
---|---|
グー | |
チョキ | |
パー |
を最小化するように、 の組み合わせを考えていきます。
- 相手が出す可能性がある手が2種類以下の戦略は、相手の最適戦略とはなりません(証明は省略します)。
- 相手が3種類の手全てを出す可能性がある場合、各手を出したときの相手の期待得点は等しくなり、が成立します。
このことから、以下の連立方程式を解くこととなります。
は、 および を用いて、以下のように表す事ができます。
- または のとき
ここで、の条件下でを最小化することを考えます。これはのとき成立し、以下に示すが求める自分の戦略となります。
また、このときの相手の期待得点は となります。
これは、相手だけ下半身を持っていなかった分のビハインドに等しいため、 について以下の漸化式が成立します。
- のとき
このときの相手の期待得点は となります。
(c) 相手の下半身だけ出せる場合
このとき、自分は下半身を出せないため、常に が成り立ちます。
相手の出す手と相手の期待得点の組み合わせは以下のとおりとなります。
相手の手 | 相手の期待得点 |
---|---|
グー | |
チョキ | |
パー | |
下半身 |
前項の結果を踏まえると、対称性より相手は「グー」「チョキ」「下半身」の3種類の手を出す可能性があり、が成立します。連立方程式は、
となり、これを解くことで得られるが求める自分の戦略となります。
ここで、相手の期待得点は となりますが、これは「自分の下半身だけ出せない場合」のを-1倍したものと等しいことが確認できます。 また、 についての漸化式も、前項と同値のものを導出することができます。
「下半身露出権」の価値
導出した漸化式を使い、「下半身露出権」が何勝分の価値を持つのか計算してみましょう。
試合終了時の下半身露出の可否は、勝敗に関係がないため、が成立します。この条件下で、残回数 に応じた 下半身露出権の価値 は以下のとおりとなります。
残り回数 | 下半身露出権の価値 |
---|---|
0 | 0.0000 |
1 | 0.1111 |
2 | 0.2063 |
3 | 0.2889 |
4 | 0.3609 |
5 | 0.4243 |
∞ | 1.0000 |
6回勝負での1回戦では、下半身を奪うことに0.4243勝分の付加価値があるものの、残り回数が減るごとにその価値が薄れていくことが分かります。
また、残り回数が無限のとき、は1に収束します。すなわち、チョキで下半身に勝つ価値は、他の手段で勝つ価値のちょうど2倍に相当するといえます。
(d) 自分も相手も下半身を出せる場合
最後に、自分も相手も下半身を出せる初期状態について考えます。 相手の出す手と相手の期待得点の組み合わせは以下のとおりとなります。
相手の手 | 相手の期待得点 |
---|---|
グー | |
チョキ | |
パー | |
下半身 |
このとき、ゲームの対称性より、
- 相手が出す可能性のある手 → 相手の期待得点が0
- 相手が出さない手 → 相手の期待得点が負(あえて不利になる手は出さない)
が成立します。
「相手が全ての手を出す場合」「相手が出さない手が1つある場合」で場合分けを行ったとき、下半身露出権の価値とそれに対応した最適戦略は以下のとおりとなります。(グーのみ出さない、チョキのみ出さない戦略が最適となるの範囲は存在しない)
の範囲 | 最適戦略 |
---|---|
パーのみ出さない | |
全ての手を出す | |
下半身のみ出さない |
すなわち、診断メーカー上での6回勝負ルールでは、「パーのみ出さない」戦略が最適となります。以下に、の範囲に応じた最適戦略のを示します。
- のとき (パーのみ出さない)
- のとき (全ての手を出す)
- のとき (下半身のみ出さない)
以下に興味深い点を2つほど示します。
回数が無限のとき、下半身を出す確率が異なる最適戦略が共存可能なこと。例えば、以下の2種類の戦略はともに最適戦略となり、互角に戦うことが可能です。
- の露出控えめ戦略
- の露出狂戦略
下半身露出権の価値を高めすぎるルールに変更(例:試合終了時に下半身が残っていたら1勝分とカウント)し、が1を超えると、リスクの高さから誰も下半身を出さなくなり普通のじゃんけんと化してしまうこと。
各回に出される手の割合
以上の結果を踏まえ、対戦者が互いに最適戦略を取る場合、各回にて出される手の割合は、図3のとおりとなります。
3. 診断メーカーへの実装
この章では、下半身ジャンケンを診断メーカーにどのように実装したか紹介していきます。
各リストの説明
- ~は、各回の「じゃんけんの手」と「勝敗判定」を抽選するためのリストです。リスト中の各値には、1回目から6回目の対戦結果がカンマ区切りで格納されています。以下は格納された値から、1回分の要素を取り出した例です。
対戦結果 | 格納された値の例 |
---|---|
勝利 | 〇 ✊ - ✌ ×=IF(0=0,"",[LIST8_1]) |
引分 | △ ✊ - ✊ △ |
敗北 | × ✊ - ╰U╯ 〇=IF(0=0,"",[LIST9_1]) |
また、勝利の際はを、敗北の際はをそれぞれ参照する事で、勝敗数をカウントしています。
~は、その回に下半身の奪取がなかった場合の結果を、下半身露出の可否別に分けて格納しています。
リスト名 | リストの説明 |
---|---|
自分も相手も下半身を出せる | |
自分のみ下半身を出せる | |
相手のみ下半身を出せる | |
自分も相手も下半身を出せない |
~は、その回に下半身の奪取があった場合の結果を格納しています。また、を参照することにより、下半身の奪取があった回数がカウントされます。
リスト名 | リストの説明 | 演出 |
---|---|---|
自分が相手の下半身を奪取 | ★ㄘんㄘんを奪った! | |
相手が自分の下半身を奪取 | ★ㄘんㄘんを奪われた… |
- では6回分の結果を各リストから参照することで、下半身奪取が行われるタイミングを抽選しています。
例えば、2回目で下半身を奪い、4回目で下半身を奪われるような状態遷移は、以下の順番でリストを参照することにより表現されます。
回数 | 状態 | 参照先のリスト |
---|---|---|
1回戦 | 自分:○/相手:○ | |
2回戦 | 下半身を奪った | |
3回戦 | 自分:○/相手:× | |
4回戦 | 下半身を奪われた | |
5回戦 | 自分:×/相手:× | |
6回戦 | 自分:×/相手:× |
- ~は、各種カウントを行うためのリストです。定数 が格納されており、関数を使うことで、呼び出された回数を出力することができます。
リスト名 | リストの説明 |
---|---|
自分の勝利数 | |
自分の敗北数 | |
下半身の奪取があった回数 |
抽選方法
- 最初に、を用いて、試合全体で下半身の奪取が生じるタイミングが抽選されます。
- 次に、から参照される~内で、各回でのジャンケンの手と勝敗判定が抽選されます。
診断結果例
下半身ジャンケン! 赤きち VS 不審者 1回 〇 ✊ - ✌ × 2回 ×╰U╯ - ✌ 〇 ★ㄘんㄘんを奪われた… 3回 × ✋ - ✌ 〇 4回 × ✊ - ╰U╯ 〇 5回 × ✊ - ╰U╯ 〇 6回 〇 ✊ - ✌ × You Lose…(2 勝 4 敗)
なお、下半身の奪取が1度も起きなかった場合、最後に「★下半身の平和は守られた!」と表示されます。
4. 人工知能に下半身ジャンケンをさせてみた
2章で求めた「最適戦略」は、対戦者がお互い最善を尽くすと仮定し、相手の期待得点を最小化しようとする、いわば負けないための戦略でした。
本章では、人工知能の1つである強化学習を用いて、対戦相手の出した手の履歴などをもとに報酬を最大化する手を決める、すなわち勝ちにいく戦略モデルを作っていきます。
人工知能の実装
強化学習では、行動によって得られた報酬をもとに、試行錯誤を繰り返すことで報酬を最大化する戦略を求めていきます。
詳細な説明については、以下のサイトを参考にしてください。
強化学習とは?(What is Reinforcement Learning?)
今回実装したモデルでは、以下のStepを繰り返すことによりモデルを学習させていきました。
- Step 1: 試合の各回で、行動価値(試合の展開に応じた手の優劣を判定する指標)をもとに行動を選択する
- Step 2: 試合終了後、試合結果をもとに行動価値を更新する
ここで、行動価値 は、「状態 で、行動 を取った場合の、現在から試合終了までに期待される総報酬」として定義され、学習前の の初期値は に設定されています。
また、試合中の各回での報酬は、ジャンケン勝利時に+1点、引分時に0点、敗北時に-1点とします。
状態 、行動 、および行動価値 の関係の例を 図4 に示します。
人工知能が区別可能な状態として、以下の3点を設定しました。これらが全て同じ場合に、同一の状態として認識されることになります。
- 試合の進行状況 (何試合目まで終了したか)
- 下半身の状態 (自分および相手の下半身露出の可否)
- 相手の出した各手の回数
行動 は、自分が次に出す手の候補の集合となります。すなわち、
- 下半身露出可能な場合、「グー」「チョキ」「パー」「下半身」
- 下半身露出不可能な場合、「グー」「チョキ」「パー」
となります。
次に、各Stepにおいて、何が行われているか具体的に見ていくことにしましょう。
Step 1: 試合の各回で、行動価値をもとに行動を選択する
本モデルでは、以下の方針で行動 を選択することにしました。
- 学習中では、90%の確率で行動価値 を最大とする行動 を選択し、10%の確率でランダムに行動 を選択する(Epsilon-Greedy法)
- 本番では、100%の確率で行動価値 を最大とする行動 を選択する
Step 2: 試合終了後、試合結果をもとに行動価値を更新する
試合で遷移した全ての状態および行動の組み合わせに対して、行動価値 の更新を行ないます。
ここで、 は状態 以降に試合で獲得した総報酬です。例えば、状態 が1回戦終了時のものの場合、 は 2回戦~6回戦における (勝利回数) - (敗北回数) となります。
また、 は学習率と呼ばれるパラメータで、学習が進むにつれて減衰させることにより大きな値の変化が起こりくくなるよう設定するのが一般的です。
今回は、の更新が 回目のとき、 と定めました。
対戦相手が出す手の設定
特定の相手1人と連続して対戦を行う場合、相手の出す手の癖を見抜き、勝つための戦略を立てることは比較的容易であり、人工知能を使うほどではありません。
そこで今回は、1試合ごとに出す手の比率が異なる対戦相手と交代する状況を想定します。
試合が始まるごとに、相手が出す手の比率を次のように決定します。
まず、互いに独立な[0,1]の一様乱数 を生成し、出す手の割合の合計が1になるよう正規化します。このとき、相手が各手を出す確率は以下のとおりとなります。
- 相手が下半身露出可能なとき
- 相手が下半身露出不可能なとき
以降、上記戦略をもつ対戦相手の集団を「烏合の衆」と呼ぶことにします。 今回は、人工知能に「烏合の衆」と100万試合の下半身ジャンケンを行わせることで行動価値を学習させました。
試合その1: 「人工知能」VS「烏合の衆」
先ほど学習に用いた「烏合の衆」を相手として、下半身ジャンケンの本番試合を1万回行いました。
なお人工知能は、本番ではランダムな手は一切出さず、行動価値が最大となる手のみ出す戦略を取ります。
試合結果は以下のとおりです。勝利率は69.27%と、敗北率の17.54%に対し4倍近い好成績を叩き出しました。
相手の出す手の割合に偏りがある場合、わずか6回勝負であっても、相手の手の履歴から勝つ戦略を立てることが可能なことがわかります。
勝利率 | 引分率 | 敗北率 | 平均勝敗数差 |
---|---|---|---|
69.27% | 13.19% | 17.54% | 1.783 |
人工知能の学習結果
さて、各状態において人工知能が導きだした最適手が何であるか、行動価値を通して具体的に確認していきましょう。
まず、1回戦における各手の行動価値を以下に示します。「チョキ」の行動価値が最大値を示しているため、本番試合においては、人工知能は1回戦で必ず「チョキ」を出していたことになります。また、その場合に期待される試合中の勝敗数差は1.678と推定されていたことがわかります。
出す手 | グー | チョキ | パー | 下半身 |
---|---|---|---|---|
行動価値 | 1.137 | 1.678 | 1.172 | 1.563 |
次に、2回戦における行動価値を図5-1および図5-2に示します。「相手が出した初手」「下半身露出の可否」が状態として保存されているため、合計6通りの状態に応じた行動価値が計算されています。
両者とも下半身が残っている場合、
- 相手の初手が「グー」または「パー」の場合 → 下半身
- 相手の初手が「チョキ」または「下半身」の場合 → チョキ
の行動価値が最も高くなる計算結果となりました。
この結果は、「チョキ」を出しやすい相手に対しては下半身を出すのは危険であり、「下半身」を出しやすい相手に対してはチョキで下半身を奪取するメリットが多いと考えることで説明がつきます。
試合その2: 「人工知能」VS「最適戦略者」
最後に、2章で求めた「最適戦略」を取る相手と、下半身ジャンケンの試合を1万回行った結果を以下に示します。
勝利率 | 引分率 | 敗北率 | 平均勝敗数差 |
---|---|---|---|
41.15% | 17.28% | 41.57% | -0.027 |
勝利率と敗北率がほぼ等しく、ほぼ互角の結果となりました。「最適戦略」を知っている相手に対しては、偶然の範囲を超えて勝ち越すことは難しいようです。
5. おわりに
本記事では、私が考案した変則ジャンケンの「下半身ジャンケン」について、お互いが最善を尽くした場合の最適戦略を導出しました。また強化学習を使った人工知能を作り対戦させる試みでは、「烏合の衆」相手に対しては好成績を収めた一方で、「最適戦略者」相手にはほぼ互角の成績となりました。肝心の診断メーカーの実装方法の記述が手薄になってしまった事についてはどうかご容赦ください。
4週にわかるクソ診断紹介も、いよいよ次で最後となります。最終回で紹介する診断は、関東地方内の任意の場所に等確率で飛ばされる「関東地方ダーツの旅」となります。作成の過程で使用したGIS(地理情報システム)などの話を盛り込めればと考えております。
分量多めの記事となってしまいましたが、最後までお読みいただきありがとうございました。
(参考1) いろいろな確率
ここでは、対戦者同士が2章の最適戦略を選択した場合、下半身ジャンケン中に様々な事象がどれくらいの確率で出現するのかをみていきます。
各回における下半身の状態の出現割合
図6に、各回終了時における下半身露出可能なプレイヤーの人数の出現割合を示します。
両者ともに下半身を残したまま平和的に終戦する可能性は27.7%となります。一方で、試合中に両者ともに下半身を奪われる結末も23.9%の確率で発生します。
勝利回数および敗北回数の出現割合
図7に、1試合での (勝利回数)-(敗北回数) の出現割合を示します。
勝ち越す/負け越す確率はそれぞれ41.04%ずつ、引分となる確率は17.92%となります。また、全勝/全敗する確率はそれぞれ0.37%ほどしかありません。
また図8に、勝利回数および敗北回数の組み合わせの出現割合を示します。
出現する可能性の最も高い組み合わせは2勝2敗の10.91%です。一方、出現確率が最低となる組み合わせは0勝0敗の0.15%ですが、実際に6回連続で引分となるような診断結果ツイートがこれまでに複数確認されています。
試合途中で同点の場合に下半身露出権の有無が試合結果に及ぼす影響
図9は、試合途中で同点かつ、自分のみ下半身露出権を持つ場合、どの程度試合が有利になるのか示したものです。
基本的に早い段階で下半身露出権を独占した方が、勝利率が高まることがわかります。
例外として4回戦(残り2戦)で同点の場合のみ、引分に終わる確率が高くなる影響で勝利率、敗北率ともに圧縮されます。
(参考2) 作成した他のちんぽ系診断
ㄘんㄘんのサイズチェック
shindanmaker.comグルメルーレット(君はおちんちんを食べることができるか)
shindanmaker.comちんぽ揃えゲーム(本ブログにて紹介済)
shindanmaker.com
(参考3) ソースコード
診断に使用した基本診断テキストおよび各リストをgithubに公開したので、興味のある人はご覧ください。 github.com