ゲーム理論を使って,昔懐かしの手遊びゲームの均衡戦略を導きます.題材は 手を2回叩いた後に攻撃などのアクションをする遊び です.本記事では Twice Clap Game (TCG) と呼びます.
完全情報ゲームなどの必勝法のあるゲームの記事はよく見かけますが,必勝法がなく,確率的に手を選択することが均衡となるゲームの解説は珍しいかと思います.お楽しみいただければと思います.
以下の説明を省きます.
TCGにはローカルルールがたくさんありますが,本記事では以下のルールを扱います.
「大攻撃」があるのが特徴です.これがあることで,ポイントをたくさん溜めることが重要な戦略となり,ポイントごとに戦略が変化すると考えたため,採用しました.
結論だけ知りたいという方が大半?かと思いましたので,先に均衡戦略をまとめます.均衡戦略の計算方法は付録で説明します.
お互いに「溜め」が最適です.当然ですね.
プレイヤ2は攻撃できるので,プレイヤ1には防御の選択肢が現れます.最適な割合まで分かるのが,理論の良いところですね.
ポイントが3になると必勝の大攻撃が使えるので,プレイヤ2は溜めを選択します.プレイヤ1は攻撃できないので,プレイヤ2は安心して溜めを選択できます.
プレイヤ2は大攻撃ができるので,早速使うのかと思いきや,よく解析してみると,この状況ではお互いにどの手を選択しても,最終的にはプレイヤ2が勝利できます.大攻撃以外は舐めプですね.
ここからは,お互いに攻撃ができるので,「溜め」「攻撃」「防御」をバランスよく組み合わせた複雑な戦略が必要になってきます.どの配分が最適かは,人手で導き出すのは難しいので,アルゴリズムを使う意義が出てきます.
状況
状況
お互いに大攻撃まであと1ポイントなので,状況
状況
当然,お互いに「大攻撃」が最適です.
以上の均衡戦略を使った場合に,各ポイント状況でプレイヤ1が勝利できる確率は以下です.行がプレイヤ1のポイント,列がプレイヤ2のポイントです.ポイントが等しい時は勝率が五分,ポイントが相手よりも多くなるほど勝率が上がることが分かります.この特徴は「大攻撃」がない場合には現れません.その場合,どの状態でも勝利は五分になります.
均衡戦略が分かったとことで,それを暗記して,頭の中でサイコロを振って,行動を選択するのは困難かと思います.そこで,付録のプログラムでは,相手の行動を入力するだけで均衡戦略となる行動を提示してくれる機能を実装しています.(打ち込みの時間を相手が許してくれるかはわかりませんが...)これを使って正月はキッズを圧倒しましょう!
以降は均衡戦略を計算する方法を説明します.
既に均衡戦略で見てきたように,TCGではポイントの状態によって戦略(どの手をどの割合で出すのか)が変わります.このように,状態によって戦略が変化するゲームは動的ゲームと呼ばれます.動的ゲームでは,プレイヤの行動によって状態が変化します.特に,過去の状態の履歴に依存せず,現在の状態と行動のみによって移動先の状態が決まる場合は,マルコフゲームと呼ばれます.本記事では,状態の集合に各プレイヤの「勝ち」に対応する状態を加えます.各プレイヤの目標は,それぞれの勝利状態に移動することです.
では,TCGをマルコフゲームとして定式化します.まず,各プレイヤのポイントの組
本記事では,価値反復法を用いて均衡戦略を計算しました.価値反復法では,均衡解における,各状態
各状態
この均衡戦略は以下の行列
例えば,
アルゴリズムは以下です.まず,各状態
pythonのプログラムを
ここ
にまとめています.以下では使い方を説明します.まず,TwiceClapGameクラスのインスタンスtcgを生成します.このとき,最大ポイント数
tcg = TwiceClapGame(3)
tcg.solve()
tcg.show()
tcg.play()