PythonライブラリのAxelrodで実行するシミュレーション②(チュートリアルの全体像&簡単な実行)|ゲーム理論について #6

f:id:lib-arts:20200109174614p:plain

ゲーム理論に関するシリーズとして、諸々取り扱っています。
#1〜#4ではWikipediaの内容を元にゲーム理論の大枠について抑えました。

ゲーム理論 - Wikipedia

#1では大まかな枠組みについて、#2、#3ではゲーム理論研究史について、#4ではゲーム理論の応用分野について取り扱いました。

ゲーム理論の概論②(ゲーム理論の研究史1)|ゲーム理論について #2 - lib-arts’s diary

https://lib-arts.hatenablog.com/entry/game_theory3
https://lib-arts.hatenablog.com/entry/game_theory4
#5からはゲーム理論のシミュレーション的な解法として一時期注目を集めたAxelrodの研究をPythonライブラリ化したAxelrodライブラリについて確認していきます。

Welcome to the documentation for the Axelrod Python library — Axelrod 0.0.1 documentation

#5ではAxelrodライブラリの概要について取り扱いました。
https://lib-arts.hatenablog.com/entry/game_theory5
#6からはチュートリアルを確認していくにあたって、#6ではチュートリアルの全体像を確認した上で簡単な実行を行えればと思います。

Tutorials — Axelrod 0.0.1 documentation

以下目次になります。
1. Axelrodライブラリのチュートリアルの全体像の確認
2. New to Game Theory and/or Python
2-1. Creating Matches
2-2. Creating and running a simple tournament
3. まとめ

 

1. Axelrodライブラリのチュートリアルの全体像の確認
1節ではチュートリアルの全体像の確認を行っておきます。

f:id:lib-arts:20200110182559p:plain

Tutorials — Axelrod 0.0.1 documentation

上記のような項目があるとされています。以下いくつかのトピックについて簡単に確認しておきます。(詳細についてはそれぞれ中身を見る際に詳しく確認していきます。)

・Creating Matches
-> 一回のゲームの実行などについて取り扱っているようです。

・Creating and running a simple tournament
・Summarising tournament results
-> トーナメントの実行などについて取り扱っているようです。

・Visualising results
-> 結果の可視化について取り扱っているようです。

・Moran Process
-> Moran Processについて取り扱っているようです。

その他にも色々とトピックについて取り扱っていますが、大体の大枠についてはつかめたので1節はここまでとします。


2. New to Game Theory and/or Python
2-1. Creating Matches
2-1節ではCreating Matchesの内容について取り扱っていきます。

f:id:lib-arts:20200110183000p:plain

Creating Matches — Axelrod 0.0.1 documentation

ここでは、Matchクラスを用いて2プレイヤーゲームを実行することができるとなっています。ここではゲームの相手に対してどのように振る舞うべきかを研究するための新しい戦略を考えるにあたって有益であるとされています。

import axelrod as axl

players = (axl.Cooperator(), axl.Alternator())
match = axl.Match(players, 5)
interactions = match.play()

print(interactions)

早速上記を実行してみます。基本的には#5で取り扱ったプログラムと同様ですが、playerの一つ目がaxl.Cooperator()、axl.Alternator()になっている点が異なることに注意が必要です。実行結果は下記のようになります。

f:id:lib-arts:20200110190016p:plain

実行結果を見ると、axl.Cooperator()は常に協調のCを出し、axl.Alternator()はCとDを交互に出していることが読み取れます。
また、戦略についてはノイズを考慮することもできるとされています。

match = axl.Match(players=players, turns=5, noise=0.2)
interactions = match.play()

print(interactions)

上記の実行結果は下記のようになります。

f:id:lib-arts:20200110190319p:plain

ノイズを設定することにより、必ずしも戦略に従うとは限らないようになっていることが確認できます。
また、下記を実行することでゲームに関連する情報を取得することができます。

print(match.result)
print(match.sparklines())
print(match.scores())
print(match.final_score())
print(match.winner())

f:id:lib-arts:20200110191248p:plain

match.sparklines()はそれぞれの戦略の可視化、match.scores()はそれぞれのプレイヤーの獲得の点数、match.final_score()はゲームを通しての最終得点、match.winner()はゲームの勝利者を意味しています。match.sparklines()は黒がC、白がDを表しています。
ゲームの回数が5回だとイメージが湧きづらいと思うので、以下15回にして同様に実行してみます。

match = axl.Match(players=players, turns=15, noise=0.1)
interactions = match.play()

print(match.result)
print(match.sparklines())
print(match.scores())
print(match.final_score())
print(match.winner())

実行結果は下記のようになります。

f:id:lib-arts:20200110191317p:plain


2-2. Creating and running a simple tournament
2-2節ではCreating and running a simple tournamentの内容について取り扱っていきます。

f:id:lib-arts:20200110191529p:plain

Creating and running a simple tournament — Axelrod 0.0.1 documentation

Creating and running a simple tournamentでは、tournamentの実行について紹介されています。早速下記を実行してみます。

import axelrod as axl

players = [axl.Cooperator(), axl.Defector(),
axl.TitForTat(), axl.Grudger()]
tournament = axl.Tournament(players)
results = tournament.play()

print(players)
print(results.ranked_names)

実行結果は下記のようになります。

f:id:lib-arts:20200110191955p:plain

順位としては、'Defector'、'Tit For Tat'、'Grudger'、'Cooperator'の順になっていることが確認できます。
また、下記を実行することで結果の可視化をすることができます。

plot = axl.Plot(results)
p = plot.boxplot()

p.show()

f:id:lib-arts:20200110193223p:plain

スコアが順位の順番で並んでいることがここから読み取れます。

3. まとめ
#6ではチュートリアルの全体像の確認と、"New to Game Theory and/or Python"から"Creating Matches"と"Creating and running a simple tournament"の内容の確認を行いました。
#7では"Summarising tournament results"以降の内容について確認します。