Gambitとは戦略型ゲームや展開型ゲームに関する分析を手助けしてくれるゲーム理論分析ライブラリーです。GUIにも優れており、コマンドラインを使わずに直感的にもゲーム理論分析が出来るという特徴も持ちます。
そして僕らPythonistaとしてはPythonのライブラリーとして使用する事が出来るということが最も大きなメリットとなります。Pythonのゲーム理論分析ライブラリは他にも少しだけ存在するようですが、おそらくこのGambitが一番整っていると思われます。
また、GambitのライセンスはGNU General Public Licenseのもとリリースされています。
①Downloadページから最新版のgambitの.tar.gzファイルをダウンロードして展開する。
②ターミナルで展開したフォルダをディレクトリに変更し、
./configure
make
sudo make install
を入力する。
③ その後、
cd src/python
python setup.py build
sudo python setup.py install
を入力するとインストール完了。
④用意されているテストを試してみる。
cd src/python/gambit/tests
nosetests
なお、詳しい説明についてはGambitホームページ(英語)に書かれておりました。
Gambitのチュートリアルに沿って、実際に動かしてみる。
In [1]:
import gambit
In [2]:
g = gambit.Game.new_tree()
In [3]:
len(g.players)
Out[3]:
In [4]:
str(g)
Out[4]:
In [5]:
g.title = "A simple poker example"
g.title
Out[5]:
In [6]:
str(g)
Out[6]:
In [7]:
p = g.players.add("Alice")
In [8]:
p
Out[8]:
それぞれのplayersはlabel属性を持ち、プレイヤーの名前を確認することが出来ます。
In [9]:
p.label
Out[9]:
In [10]:
len(g.players)
Out[10]:
Game.playersはpythonのリストのような扱い方もできます。
In [11]:
g.players[0]
Out[11]:
In [12]:
g.players
Out[12]:
In [13]:
g = gambit.Game.new_table([2,2])
g.title = "A prisoner's dilemma game"
g.players[0].label = "Alphonse"
g.players[1].label = "Gaston"
g
Out[13]:
In [14]:
g.players[0].strategies
Out[14]:
In [15]:
len(g.players[0].strategies)
Out[15]:
In [16]:
g.players[0].strategies[0].label = "Cooperate"
g.players[0].strategies[1].label = "Defect"
In [17]:
g.players[0].strategies
Out[17]:
利得表はarrayのような形でアクセスできます。
g[i, j]は最初のプレイヤーがi番目の戦略を、次のプレイヤーがj番目の戦略を取った時の利得となる。
In [18]:
g[0,0][0] = 8
g[0,0][1] = 8
g[0,1][0] = 2
g[0,1][1] = 10
g[1,0][0] = 10
g[1,1][1] = 2
g[1,0][1] = 2
g[1,1][0] = 5
g[1,1][1] = 5
In [19]:
g
Out[19]:
Gambitにもとから入っているサンプルファイルをGame.read_game()を使って読み込むことが出来る。
ためしにmixed_strategy.nfgを読み込んでみる。
In [20]:
g = gambit.Game.read_game("test_games/mixed_strategy.nfg")
g
Out[20]:
In [21]:
list(g.contingencies)
Out[21]:
In [22]:
for profile in g.contingencies:
print profile, g[profile][0], g[profile][1]
In [23]:
p = g.mixed_strategy_profile()
In [24]:
list(p)
Out[24]:
In [25]:
p[g.players[0]]
Out[25]:
In [26]:
p[g.players[1].strategies[0]]
Out[26]:
In [27]:
p.payoff(g.players[0])
Out[27]:
In [28]:
p.strategy_value(g.players[0].strategies[2])
Out[28]:
行動戦略オブジェクトを使うためには、ゲームは展開型ゲームである必要がある。
おそらくtest_gamesの中で拡張子がnfgのものは戦略型、efgのものは展開型である。
ここでは、sample_extensive_game.efgを読み込む。
p "1" 1 1 "" { "1" "2" } 0は、おそらくpoint"1"における情報集合1の1番さんの行動プロファイル[1, 2]という意味で、
t "" 1 "" { 2, 3 }は、おそらくtop"1"における利得は[2, 3]という意味だと思われる。
In [29]:
g = gambit.Game.read_game("test_games/sample_extensive_game.efg")
g
Out[29]:
In [30]:
p = g.mixed_behavior_profile()
In [31]:
list(p)
Out[31]:
mixed_strategy_profile()のときと扱い方はほとんど変わらないが、infosetsが増えたところを注意して扱う必要がある。
In [32]:
p[g.players[0]]
Out[32]:
In [33]:
p[g.players[0].infosets[0]]
Out[33]:
In [34]:
p[g.players[0].infosets[0].actions[0]]
Out[34]:
In [35]:
g = gambit.Game.read_game("test_games/mixed_strategy.nfg")
g
Out[35]:
In [36]:
solver = gambit.nash.ExternalEnumPureSolver()
solver.solve(g)
Out[36]:
In [37]:
solver = gambit.nash.ExternalEnumMixedSolver()
solver.solve(g)
Out[37]:
In [38]:
solver = gambit.nash.ExternalLogitSolver()
solver.solve(g)
Out[38]:
sample_extensive_game.efgを例として扱う。
In [39]:
g = gambit.Game.read_game("test_games/sample_extensive_game.efg")
g
Out[39]:
In [40]:
solver = gambit.nash.ExternalLCPSolver()
solver.solve(g)
Out[40]:
In [41]:
solver.solve(g, use_strategic=True)
solver.solve(g)
Out[41]: