0

手を2回叩いた後に攻撃などのアクションをする遊びの均衡戦略

91
0

はじめに

ゲーム理論を使って,昔懐かしの手遊びゲームの均衡戦略を導きます.題材は 手を2回叩いた後に攻撃などのアクションをする遊び です.本記事では Twice Clap Game (TCG) と呼びます.

完全情報ゲームなどの必勝法のあるゲームの記事はよく見かけますが,必勝法がなく,確率的に手を選択することが均衡となるゲームの解説は珍しいかと思います.お楽しみいただければと思います.

お断り

以下の説明を省きます.

  • ゲーム理論の基礎
  • 均衡戦略/混合戦略の定義
  • 行列ゲームの定義/アルゴリズム
  • アルゴリズムの正当性/収束性

Twice Clap Game

TCGにはローカルルールがたくさんありますが,本記事では以下のルールを扱います.

  • 二人で実施
  • プレイヤはポイントを持つ(初期値は0点,最大値はn点)
  • 勝敗が決まるまで以下を繰り返す
  • 手を二回叩いた後に「溜め(1;charge)」「攻撃(2;attack)」「防御(3;defense)」「大攻撃(4;strong attack)」のいずれかを二人同時に出す
  • 各プレイヤの手に応じてそれぞれのポイントが変化(溜め:+1,攻撃:1,防御:0,大攻撃:n
  • 手の組合せによって「勝ち(+)」「負け()」が決まる(行がプレイヤ1の行動,列がプレイヤ2の行動)

chargeattackdefensestrong attackchargeattack+defensestrong attack+++

  • ポイントがマイナスになっても負け
  • 互いにポイントがマイナスになったら,ポイント0点から再開

「大攻撃」があるのが特徴です.これがあることで,ポイントをたくさん溜めることが重要な戦略となり,ポイントごとに戦略が変化すると考えたため,採用しました.

均衡戦略

結論だけ知りたいという方が大半?かと思いましたので,先に均衡戦略をまとめます.均衡戦略の計算方法は付録で説明します.

n=3のとき,各ポイント状況(i1,i2)での均衡戦略は以下となります.プレイヤ1のポイントがi1,プレイヤ2のポイントがi2です.冗長になるので,i1i2の場合だけを示します.数値がその手を選択する割合を示します.*マークがついている場合,どの手を選択してもよいです.

player 1player 2i1i2chargeattackdefensestrong attackchargeattackdefensestrong attack0010001000010.6500.3500.650.3500021000100003110.310.220.4700.310.220.470120.30.260.4400.220.250.5301300220.190.40.400.190.40.4023100000013300010001

(0, 0)

お互いに「溜め」が最適です.当然ですね.

(0, 1)

プレイヤ2は攻撃できるので,プレイヤ1には防御の選択肢が現れます.最適な割合まで分かるのが,理論の良いところですね.

(0, 2)

ポイントが3になると必勝の大攻撃が使えるので,プレイヤ2は溜めを選択します.プレイヤ1は攻撃できないので,プレイヤ2は安心して溜めを選択できます.

(0, 3)

プレイヤ2は大攻撃ができるので,早速使うのかと思いきや,よく解析してみると,この状況ではお互いにどの手を選択しても,最終的にはプレイヤ2が勝利できます.大攻撃以外は舐めプですね.

(1, 1)

ここからは,お互いに攻撃ができるので,「溜め」「攻撃」「防御」をバランスよく組み合わせた複雑な戦略が必要になってきます.どの配分が最適かは,人手で導き出すのは難しいので,アルゴリズムを使う意義が出てきます.

(1, 2)

状況(1,1)と類似していますが,プレイヤ1は攻撃の割合を増やしています.プレイヤ2にポイントが3まで増やしてほしくないため,牽制しているのだと思われます.プレイヤ1が攻撃を増やすので,プレイヤ2も安易に溜めをできず,防御の割合を増やしています.

(1, 3)

状況(0,3)と同様に,*マークの手であれば,どの手を選択しても,最終的にはプレイヤ2が勝利できます.舐めプです.

(2, 2)

お互いに大攻撃まであと1ポイントなので,状況(1,1)よりも攻撃に割合を割き,牽制し合っていることが分かります.

(2, 3)

状況(0,3),(1,3)ではプレイヤ2に舐めプが許されていましたが,プレイヤ1もあと1点で大攻撃なので,舐めプの余裕はありません.プレイヤ2の最適行動はやっと大攻撃です.

(3, 3)

当然,お互いに「大攻撃」が最適です.

勝利確率

以上の均衡戦略を使った場合に,各ポイント状況でプレイヤ1が勝利できる確率は以下です.行がプレイヤ1のポイント,列がプレイヤ2のポイントです.ポイントが等しい時は勝率が五分,ポイントが相手よりも多くなるほど勝率が上がることが分かります.この特徴は「大攻撃」がない場合には現れません.その場合,どの状態でも勝利は五分になります.

(0.50.17000.830.50.26010.740.501110.5)

おわりに

均衡戦略が分かったとことで,それを暗記して,頭の中でサイコロを振って,行動を選択するのは困難かと思います.そこで,付録のプログラムでは,相手の行動を入力するだけで均衡戦略となる行動を提示してくれる機能を実装しています.(打ち込みの時間を相手が許してくれるかはわかりませんが...)これを使って正月はキッズを圧倒しましょう!

付録

以降は均衡戦略を計算する方法を説明します.

動的ゲーム/マルコフゲーム

既に均衡戦略で見てきたように,TCGではポイントの状態によって戦略(どの手をどの割合で出すのか)が変わります.このように,状態によって戦略が変化するゲームは動的ゲームと呼ばれます.動的ゲームでは,プレイヤの行動によって状態が変化します.特に,過去の状態の履歴に依存せず,現在の状態と行動のみによって移動先の状態が決まる場合は,マルコフゲームと呼ばれます.本記事では,状態の集合に各プレイヤの「勝ち」に対応する状態を加えます.各プレイヤの目標は,それぞれの勝利状態に移動することです.

定式化

では,TCGをマルコフゲームとして定式化します.まず,各プレイヤのポイントの組(i1,i2)を状態とします.ポイントの範囲は0inです.また,プレイヤ1の勝利状態を(n+1,n+1),プレイヤ2の勝利状態を(n+2,n+2)とします.ゲームは状態(0,0)から開始します.プレイヤはそれぞれの手を選択し,ポイントが変化することで状態が移動します.勝敗が決まった場合は,勝ったプレイヤの勝利状態に移動し,ゲームは終了です.

アルゴリズム

本記事では,価値反復法を用いて均衡戦略を計算しました.価値反復法では,均衡解における,各状態(i1,i2)でプレイヤ1が勝利する確率vi1,i2を扱います.勝利頂点では勝ち負けが確定しているので,vn+1,n+1=1,vn+2,n+2=0です.他の状態の値は事前には分からないので,最初は適当な値から開始し,均衡解での値に近づけていきます.

各状態(i1,i2)の確率値vi1,i2の更新方法を説明します.前述の確率値が真の値であると仮定し,互いに勝つ確率を最大化する状態に移動するような均衡戦略を計算します.そして,その時の確率値で確率値vi1,i2を更新します.

この均衡戦略は以下の行列AR4×4を入力とする行列ゲームの均衡解として求められます.行列A(j1,j2)成分は,プレイヤ1が行動j1,プレイヤ2が行動j2を選択した場合に移動する状態(i1,i2)の確率値vi1,i2です.行列ゲームのプレイヤ1・2の均衡戦略をそれぞれx,yR4とすると,確率値vi1,i2xAyとなります.

例えば,n=3で,状態(1,3)の行列Aは以下です.(1,1)成分は互いに溜めなので,ポイントが1増えますが,プレイヤ2は既に最大値3なので,状態(2,3)に移動します.(1,2)成分はプレイヤ1が溜め,プレイヤ2が攻撃なので,プレイヤ2の勝利で状態(5,5)に移動します.
A=(v2,3v5,5v2,3v5,5v4,4v0,2v0,3v5,5v1,3v1,2v1,3v5,5v5,5v5,5v5,5v5,5)

アルゴリズムは以下です.まず,各状態(i1,i2)の確率値vi1,i20.5に初期化します.そして,各状態(i1,i2)の行列ゲームの均衡解を解き,状態(i1,i2)の価値vi1,i2を均衡解での確率値に更新します.以上の処理を価値が収束するまで繰り返します.アルゴリズムの序盤では確率値は不確実な値ですが,結果が確定している勝利状態の値が周辺の状態に伝播していき,徐々に正しい値に収束していく,というイメージです.

  1. 確率値vi1,i20.5に初期化
  2. while すべての確率値vi1,i2が収束するまで:
  3.   for i1,i2[0,n]
  4.     行列ゲームの均衡戦略での確率値でvi1,i2を更新

プログラム

pythonのプログラムを ここ にまとめています.以下では使い方を説明します.まず,TwiceClapGameクラスのインスタンスtcgを生成します.このとき,最大ポイント数nを指定できます.tcg.solve()で均衡戦略を計算します.計算結果はインスタンスに保存されます.tcg.show()で各状態での戦略を表示します.遊ぶときにはtcg.play()を実行することで,相手の行動を入力するだけで均衡戦略となる行動を提示します.

      tcg = TwiceClapGame(3)
tcg.solve()
tcg.show()
tcg.play()
    
投稿日:2020126
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

seytwo
16
4985

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. はじめに
  2. お断り
  3. Twice Clap Game
  4. 均衡戦略
  5. (0, 0)
  6. (0, 1)
  7. (0, 2)
  8. (0, 3)
  9. (1, 1)
  10. (1, 2)
  11. (1, 3)
  12. (2, 2)
  13. (2, 3)
  14. (3, 3)
  15. 勝利確率
  16. おわりに
  17. 付録
  18. 動的ゲーム/マルコフゲーム
  19. 定式化
  20. アルゴリズム
  21. プログラム