見出し画像

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)

活動費、テキスト購入費に充てたいと思います。宜しくお願い致します。