PythonのNashpyライブラリを使って囚人のジレンマにおけるナッシュ均衡を求めてみた。
Pythonを使用して、囚人のジレンマとして知られるゲーム理論のシナリオを簡単に実装する。
はじめに
・本記事では、nashpyライブラリを使用して、囚人のジレンマとして知られるゲーム理論のシナリオについてナッシュ均衡を求める方法を説明していきます。
手順1: ゲームのセットアップ
・まず、プレイヤーの行動に対する報酬を定義することでゲームをセットアップする必要があります。囚人のジレンマでは、プレイヤーは「黙秘」または「自白」の2つの選択肢を持ちます。報酬は、プレイヤーの選択に基づく収益として、懲役年数を表します。
・まず、必要なライブラリをインポートします。
!pip install nashpy
import nashpy as nash
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
・次に、報酬行列をリストのリストとして定義します。ここで、各内部リストは、プレイヤーAとプレイヤーBの報酬を表します。
payoff_matrix = [
["2 or 2", "10 or 0"],
["10 or 0", "5 or 5"]
]
・今回は選択肢を分かりやすくするのために、報酬行列をPandasのDataFrameを使って視覚化してみます。
index = ['Aの黙秘', 'Aの自白']
columns = ['Bの黙秘', 'Bの自白']
df = pd.DataFrame(payoff_matrix, index=index, columns=columns)
print(df)
・出力結果は以下の通りです。
Bの黙秘 Bの自白
Aの黙秘 2 or 2 10 or 0
Aの自白 10 or 0 5 or 5
手順2: ナッシュ均衡の求め方
・ゲームのセットアップが完了したら、nashpyライブラリを使用してナッシュ均衡を求めることができます。まず、プレイヤーAとプレイヤーBの報酬行列を使ってGameオブジェクトを作成します。
payoffs_a = np.array([[2, 0], [10, 5]]) # プレイヤーAの選択肢
payoffs_b = np.array([[2, 10], [0, 5]]) # プレイヤーBの選択肢
prisoners_dilemma = nash.Game(payoffs_a, payoffs_b)
prisoners_dilemma
・Game
オブジェクトを作成したら、support_enumeration()
メソッドを使用してすべてのナッシュ均衡を求めることができます。equilibria = prisoners_dilemma.support_enumeration()
・上記で求められた均衡を反復処理し、結果を出力します。
for eq in equilibria:
print(equilibrium)
・出力結果は以下のようになります。
(array([1., 0.]), array([1., 0.]))
・上記の結果は、プレイヤーAとプレイヤーBがともに「自白」を選択した場合が唯一のナッシュ均衡であることを示しています。
最後に
今回は、nashpyライブラリを使用して囚人のジレンマゲームのナッシュ均衡を求めることができました。上記の手順に従ってゲームをセットアップすることで、ナッシュ均衡を計算することができます。ナッシュ均衡の理解は、様々なシナリオでの戦略的意思決定を分析し、ゲーム理論とその実世界への応用についてインサイトを得るのに役立ちます。