Nashpyを使ってナッシュ均衡を求める
タイトルの通り、Nashpyを使ってナッシュ均衡を求めます.
利得表はゲーム理論入門の内容から拾っています。
参考
Nashpy
前提
Python3.9で実行しています。
fractionがインストールされていること。
python -m pip install Fraction
numpyがインストールされていること。
python -m pip install numpy
nashpyがインストールされていること。
python -m pip install nashpy
サンプルコード
硬貨合わせ
import numpy as np #数値計算ライブラリ 今回は主に配列扱いのため
import nashpy as nash #2人ゲームのナッシュ均衡を求めるライブラリ
from fractions import Fraction #分数表示用
# ゲームのペイオフ行列を定義
# | 戦略1 | 戦略2
# -------------------
# 戦略1 | 1, -1 | -1, 1
# 戦略2 | -1, 1 | 1, -1
A = np.array([[1, -1],
[-1, 1]])
B = np.array([[-1, 1],
[1, -1]])
# プレイヤー1とプレイヤー2のペイオフ行列を使用してゲームを定義
game = nash.Game(A, B)
# 純粋戦略でのナッシュ均衡を求める
#equilibria = game.support_enumeration()
#for eq in equilibria:
# print("Pure Strategy Nash Equilibrium:")
# print(eq)
# 混合戦略でのナッシュ均衡を求める
mixed_equilibria = game.vertex_enumeration()
for mix_eq in mixed_equilibria:
print("Mixed Strategy Nash Equilibrium:")
for i, prob in enumerate(mix_eq):
print(f"Player {i+1} chooses strategies with probabilities: ")
print( "(", end="")
for p in prob[:-1]:
print(Fraction(p).limit_denominator() , end=",") # 分数表示
print(Fraction(prob[-1]).limit_denominator() , end="")
print( ")", end="")
print() #改行用
print() #改行用
実行結果
Mixed Strategy Nash Equilibrium:
Player 1 chooses strategies with probabilities:
(1/2,1/2)
Player 2 chooses strategies with probabilities:
(1/2,1/2)
import numpy as np
import nashpy as nash
from fractions import Fraction #分数表示用
# ゲームのペイオフ行列を定義
# | 戦略1 | 戦略2
# -------------------
# 戦略1 | 5, 5 | 0, 6
# 戦略2 | 6, 0 | 3, 3
A = np.array([[5, 0],
[6, 3]])
B = np.array([[5, 6],
[0, 3]])
# プレイヤー1とプレイヤー2のペイオフ行列を使用してゲームを定義
game = nash.Game(A, B)
# 純粋戦略でのナッシュ均衡を求める
#equilibria = game.support_enumeration()
#for eq in equilibria:
# print("Pure Strategy Nash Equilibrium:")
# print(eq)
# 混合戦略でのナッシュ均衡を求める
mixed_equilibria = game.vertex_enumeration()
for mix_eq in mixed_equilibria:
print("Mixed Strategy Nash Equilibrium:")
for i, prob in enumerate(mix_eq):
print(f"Player {i+1} chooses strategies with probabilities: ")
print( "(", end="")
for p in prob[:-1]:
print(Fraction(p).limit_denominator() , end=",") # 分数表示
print(Fraction(prob[-1]).limit_denominator() , end="")
print( ")", end="")
print() #改行用
print() #改行用
実行結果
Mixed Strategy Nash Equilibrium:
Player 1 chooses strategies with probabilities:
(0,1)
Player 2 chooses strategies with probabilities:
(0,1)
import numpy as np
import nashpy as nash
from fractions import Fraction #分数表示用
# ゲームのペイオフ行列を定義
# | 戦略1 | 戦略2
# -------------------
# 戦略1 | 2, 1 | 0, 0
# 戦略2 | 0, 0 | 1, 2
A = np.array([[2, 0],
[0, 1]])
B = np.array([[1, 0],
[0, 2]])
# プレイヤー1とプレイヤー2のペイオフ行列を使用してゲームを定義
game = nash.Game(A, B)
# 純粋戦略でのナッシュ均衡を求める
#equilibria = game.support_enumeration()
#for eq in equilibria:
# print("Pure Strategy Nash Equilibrium:")
# print(eq)
# 混合戦略でのナッシュ均衡を求める
mixed_equilibria = game.vertex_enumeration()
for mix_eq in mixed_equilibria:
print("Mixed Strategy Nash Equilibrium:")
for i, prob in enumerate(mix_eq):
print(f"Player {i+1} chooses strategies with probabilities: ")
print( "(", end="")
for p in prob[:-1]:
print(Fraction(p).limit_denominator() , end=",") # 分数表示
print(Fraction(prob[-1]).limit_denominator() , end="")
print( ")", end="")
print() #改行用
print() #改行用
実行結果
Mixed Strategy Nash Equilibrium:
Player 1 chooses strategies with probabilities:
(1,0)
Player 2 chooses strategies with probabilities:
(1,0)
Mixed Strategy Nash Equilibrium:
Player 1 chooses strategies with probabilities:
(0,1)
Player 2 chooses strategies with probabilities:
(0,1)
Mixed Strategy Nash Equilibrium:
Player 1 chooses strategies with probabilities:
(2/3,1/3)
Player 2 chooses strategies with probabilities:
(1/3,2/3)
活動費、テキスト購入費に充てたいと思います。宜しくお願い致します。