各戦略が自分自身と対戦することを許す (自分自身との対戦無しのケース)
実験の概要: README.md
利得表
<table align="center", style="text-align:center;">
In [21]:
#-*- encoding: utf-8 -*-
%matplotlib inline
from IPython.display import display, HTML
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
import pandas as pd
import scipy.stats as stats
np.set_printoptions(precision=3)
np.set_printoptions(linewidth=300)
pd.set_option('display.max_columns', 30)
pd.set_option('display.width', 400)
pd.set_option('display.precision', 4)
import sys
sys.path.append('./user_strategies')
# 日本語対応
mpl.rcParams['font.family'] = 'Osaka'
plt.rcParams['font.size'] = 14
import play as pl
from Iida_perfect_monitoring import Iida_pm
from Iida_imperfect_public import Iida_ipm
from Iida_imperfect_private import Iida_iprm
from kato import KatoStrategy
from ikegami_perfect import Self_Centered_perfect
from ikegami_imperfect_public import Self_Centered_public
from ikegami_imperfect_private import Self_Centered_private
from mhanami_Public_Strategy import PubStrategy
from mhanami_Imperfect_Public_Strategy import ImPubStrategy
from mhanami_Imperfect_Private_Strategy import ImPrivStrategy
from tsuyoshi import GrimTrigger
from gistfile1 import MyStrategy
from beeleb_Strategy import beeleb
from oyama import OyamaPerfectMonitoring, OyamaImperfectPublicMonitoring, OyamaImperfectPrivateMonitoring
from ogawa import ogawa
from yamagishi_impd import yamagishi
from kandori import *
In [6]:
import unittest
class TestStrategies(unittest.TestCase):
def setUp(self):
self.Strategies = [Iida_pm, Iida_ipm, Iida_iprm, KatoStrategy, Self_Centered_perfect, \
Self_Centered_public, Self_Centered_private, PubStrategy, ImPubStrategy, ImPrivStrategy, \
MyStrategy, beeleb, OyamaPerfectMonitoring, \
OyamaImperfectPublicMonitoring, OyamaImperfectPrivateMonitoring, \
ogawa, yamagishi, GrimTrigger, Strategy1, Strategy2, Strategy3, Strategy4, Strategy5,
Strategy6, Strategy7, Strategy8, Strategy9, Strategy10,
Strategy11, Strategy12, Strategy13, Strategy14, Strategy15,
Strategy16, Strategy17, Strategy18, Strategy19, Strategy20,
Strategy21, Strategy22, Strategy23, Strategy24, ] # ここに自作のclassを入れる
self.case1 = "Signal is empty(period 1)"
self.case2 = [0, 1]
self.case3 = [1, 0]
self.case4 = [0, 1, 0, 1, 0, 0, 1]
self.seed = 222
self.RandomState = np.random.RandomState(self.seed)
# case1を引数に渡してテスト
def test1(self):
print("testcase:", self.case1)
for Strategy in self.Strategies:
rst = Strategy(self.RandomState).play()
self.assertIsNotNone(rst, Strategy.__module__)
self.assertIn(rst, (0, 1), Strategy.__module__)
# case2を引数に渡してテスト
def test2(self):
print("testcase:", self.case2)
for Strategy in self.Strategies:
S = Strategy(self.RandomState)
for signal in self.case2:
rst = S.play()
S.get_signal(signal)
self.assertIsNotNone(rst, Strategy.__module__)
self.assertIn(rst, (0, 1), Strategy.__module__)
# case3を引数に渡してテスト
def test3(self):
print("testcase:", self.case3)
for Strategy in self.Strategies:
S = Strategy(self.RandomState)
for signal in self.case3:
rst = S.play()
S.get_signal(signal)
self.assertIsNotNone(rst, S.__module__)
self.assertIn(rst, (0, 1), S.__module__)
# case4を引数に渡してテスト
def test4(self):
print("testcase:", self.case4)
for Strategy in self.Strategies:
S = Strategy(self.RandomState)
for signal in self.case4:
rst = S.play()
S.get_signal(signal)
self.assertIsNotNone(rst, S.__module__)
self.assertIn(rst, (0, 1), S.__module__)
In [7]:
suite = unittest.TestLoader().loadTestsFromTestCase(TestStrategies)
unittest.TextTestRunner().run(suite)
Out[7]:
Test: OK
In [82]:
payoff = np.array([[4, 0], [5, 2]])
seed = 282
rs = np.random.RandomState(seed)
discount_v = 0.97
repeat = 1000
ts_length = rs.geometric(p=1-discount_v, size=1000)
結果の生データ(csv)は contest1/data
戦略はuser_strategies
戦略のオートマトンはcontest1/automaton1.pdf
In [9]:
strategies = [Iida_pm, PubStrategy, KatoStrategy, Self_Centered_perfect,
GrimTrigger, MyStrategy, beeleb, OyamaPerfectMonitoring, ogawa, yamagishi]
game = pl.RepeatedMatrixGame(payoff, strategies, signal=None, ts_length=ts_length, repeat=1000)
game.play(mtype="perfect", random_seed=seed, record=False)
| Datetime | 2015-12-28-05-37-48 | |||||
|---|---|---|---|---|---|---|
| Monitoring type | perfect | |||||
| RandomSeed | 282 | |||||
| Repeats | 1000 | |||||
| Average ts_length | 32.856 | |||||
| Number of strategies | 10 | |||||
| Str No. | Strategy name | Average(session based) | Rank(session based) | Average(stage based) | Rank(stage based) | 備考 |
| 10 | yamagishi_impd.yamagishi | 3.8069881 | 1 | 3.726098734 | 1 | TFT |
| 4 | ikegami_perfect.Self_Centered_perfect | 3.738247097 | 2 | 3.612840881 | 2 | 30% |
| 7 | beeleb_Strategy.beeleb | 3.736419018 | 3 | 3.611766496 | 3 | |
| 2 | mhanami_Public_Strategy.PubStrategy | 3.72617118 | 4 | 3.604507548 | 4 | TFT' |
| 8 | oyama.OyamaPerfectMonitoring | 3.726026754 | 5 | 3.604087533 | 5 | GT |
| 6 | gistfile1.MyStrategy | 3.720316042 | 6 | 3.569763514 | 6 | TFT' |
| 5 | tsuyoshi.GrimTrigger | 3.655879793 | 7 | 3.467905405 | 7 | TFT' |
| 1 | Iida_perfect_monitoring.Iida_pm | 3.620227933 | 8 | 3.341106647 | 8 | |
| 9 | ogawa.ogawa | 3.492903964 | 9 | 3.139997261 | 9 | |
| 3 | kato.KatoStrategy | 2.964379561 | 10 | 2.648450816 | 10 | |
| average | 3.618755944 | 3.432652484 | ||||
戦略1と5のセッションベース順位が入れ替わったが、それ以外に大きな変動はなし。
In [41]:
rounds = 1000 * 2
strategies = 10
max_ts = 100
# 読み込み
df = pd.read_csv('./contest1/data/set_result.csv', index_col=[0, 1], header=[0, 1])
# 行: プレイヤー, 列: 1000*2セッション分の平均利得
average_matrix = np.zeros((rounds*strategies, strategies), dtype=float)
for s in range(1, strategies+1):
for i, opponent in enumerate(df[str(s)].columns.values):
average_matrix[i*rounds:(i+1)*rounds, s-1] = df[str(s)][str(opponent)]
# boxplot
averages = np.zeros(strategies, dtype=float)
stds = np.zeros(strategies, dtype=float)
ranking = np.zeros(strategies, dtype=int)
for i in range(strategies):
averages[i] = average_matrix[:, i].mean()
stds[i] = average_matrix[:, i].std()
ranking = np.argsort(averages)[::-1]+1
fig, ax = plt.subplots(figsize=(20, 8))
bp = ax.boxplot(average_matrix, 0, '')
plt.grid()
plt.xlabel('戦略番号')
plt.ylabel('1セッションの平均利得')
ax.set_xlim([0, strategies+0.5])
ax.set_ylim([-0.1, 5.8])
plt.title('戦略別, 全セッションの平均利得の分布')
ax.text(0.4, 5.3, "ranking\nave\nstd", ha = 'center', va = 'center', color="black", size=14)
for i in range(strategies):
ax.text(i+1, 5.3, "{0:.0f}\n{1:.3f}\n{2:.3f}"
.format(np.where(ranking == i+1)[0][0]+1, averages[i], stds[i]), ha = 'center', va = 'center', color="black", size=14)
plt.show()
In [39]:
# fundamental statistics
a_df = pd.DataFrame(average_matrix, columns=range(1, strategies+1))
statistics = a_df.describe()
# add ranking row
df2 = pd.DataFrame([[np.where(ranking == i+1)[0][0]+1 for i in range(strategies)]],
columns=range(1, strategies+1), dtype=int, index=["ranking"])
frames = [df2, statistics]
statistics = pd.concat(frames)
statistics.columns.names = ["Str No."]
display(statistics)
大きくは変わらず。
In [40]:
rounds = 1000 * 2
strategies = 10
max_ts = 100
# 読み込み
df = pd.read_csv('./contest1/data/set_result.csv', index_col=[0, 1], header=[0, 1])
# ts_lengthの長い順に並び替え
ordered_df = df.sortlevel(level="ts_length")
# 行: プレイヤー, 列: ts_lengthが1〜100期の時の平均利得
average_matrix = np.zeros((strategies, max_ts), dtype=float)
for t in range(1, max_ts+1):
df_t = df.iloc[df.index.get_level_values('ts_length') == t]
for s in range(1, strategies+1):
average = df_t[str(s)].mean().mean()
average_matrix[s-1, t-1] = average
fig, ax = plt.subplots(figsize=(20, 10))
plt.title("average payoff trend")
plt.xlabel("ts_length")
plt.ylabel("average payoff")
t_list = [i for i in range(1, max_ts+1)]
for s in range(1, strategies+1):
if s in [10, 8, 4]:
pass
else:
average_list = average_matrix[s-1]
plt.plot(t_list, average_list, color='#bbbbbb')
plt.plot(t_list, average_matrix[10-1], color='red', linewidth=2, label="10 (TFT)")
plt.plot(t_list, average_matrix[8-1], color='blue', linewidth=2, label="8 (GrimTrigger)")
plt.plot(t_list, average_matrix[4-1], color='green', linewidth=2, label="4 (30%)")
plt.legend()
plt.show()
大きく変わらず。
結果の生データ(csv)は contest2/data
戦略はuser_strategies
戦略のオートマトンはcontest2/automaton2.pdf
In [32]:
# プロジェクトが成功か失敗かを返す
def public_signal(actions, random_state):
prob = random_state.uniform()
if actions[0] == 0 and actions[1] == 0:
return 0 if prob < 0.9 else 1
elif (actions[0] == 0 and actions[1] == 1) or (actions[0] == 1 and actions[1] == 0):
return 0 if prob < 0.5 else 1
elif actions[0] == 1 and actions[1] == 1:
return 0 if prob < 0.2 else 1
else:
raise ValueError
strategies = [Iida_ipm, ImPubStrategy, KatoStrategy, Self_Centered_public, GrimTrigger,
MyStrategy, beeleb, OyamaImperfectPublicMonitoring, ogawa, yamagishi]
game = pl.RepeatedMatrixGame(payoff, strategies, signal=public_signal, ts_length=ts_length, repeat=1000)
game.play(mtype="public", random_seed=seed, record=False)
| Datetime | 2015-12-28-05-40-50 | |||||
|---|---|---|---|---|---|---|
| Monitoring type | public | |||||
| RandomSeed | 282 | |||||
| Repeats | 1000 | |||||
| Average ts_length | 32.856 | |||||
| Number of strategies | 10 | |||||
| Str No. | Strategy name | Average(session based) | Rank(session based) | Average(stage based) | Rank(stage based) | 備考 |
| 2 | mhanami_Imperfect_Public_Strategy.ImPubStrategy | 3.283855312 | 1 | 2.977218773 | 4 | ALLD |
| 4 | ikegami_imperfect_public.Self_Centered_public | 3.223912647 | 2 | 3.051190041 | 1 | 25% |
| 3 | kato.KatoStrategy | 3.215843985 | 3 | 2.997391648 | 3 | |
| 8 | oyama.OyamaImperfectPublicMonitoring | 3.17047641 | 4 | 3.038606343 | 2 | GT' |
| 1 | Iida_imperfect_public.Iida_ipm | 3.146127068 | 5 | 2.922405345 | 6 | |
| 10 | yamagishi_impd.yamagishi | 3.103362463 | 6 | 2.8803841 | 7 | TFT |
| 9 | ogawa.ogawa | 3.073304517 | 7 | 2.930679328 | 5 | |
| 5 | tsuyoshi.GrimTrigger | 2.947823872 | 8 | 2.661101473 | 9 | TFT' |
| 7 | beeleb_Strategy.beeleb | 2.920922764 | 9 | 2.689937911 | 8 | |
| 6 | gistfile1.MyStrategy | 2.900052583 | 10 | 2.601404614 | 10 | TFT' |
| average | 3.098568162 | 2.875031958 | ||||
戦略2(ALLD)と戦略3(定期的にDを出す戦略)が上位となった。
In [44]:
rounds = 1000 * 2
strategies = 10
max_ts = 100
# 読み込み
df = pd.read_csv('./contest2/data/set_result.csv', index_col=[0, 1], header=[0, 1])
# 行: プレイヤー, 列: 1000*2セッション分の平均利得
average_matrix = np.zeros((rounds*strategies, strategies), dtype=float)
for s in range(1, strategies+1):
for i, opponent in enumerate(df[str(s)].columns.values):
average_matrix[i*rounds:(i+1)*rounds, s-1] = df[str(s)][str(opponent)]
averages = np.zeros(strategies, dtype=float)
stds = np.zeros(strategies, dtype=float)
ranking = np.zeros(strategies, dtype=int)
for i in range(strategies):
averages[i] = average_matrix[:, i].mean()
stds[i] = average_matrix[:, i].std()
ranking = np.argsort(averages)[::-1]+1
fig, ax = plt.subplots(figsize=(20, 8))
bp = ax.boxplot(average_matrix, 0, '')
plt.grid()
plt.xlabel('戦略番号')
plt.ylabel('1セッションの平均利得')
ax.set_xlim([0, strategies+0.5])
ax.set_ylim([-0.1, 5.8])
plt.title('戦略別, 全セッションの平均利得の分布')
ax.text(0.4, 5.3, "ranking\nave\nstd", ha = 'center', va = 'center', color="black", size=14)
for i in range(strategies):
ax.text(i+1, 5.3, "{0:.0f}\n{1:.3f}\n{2:.3f}"
.format(np.where(ranking == i+1)[0][0]+1, averages[i], stds[i]), ha = 'center', va = 'center', color="black", size=14)
plt.show()
In [45]:
# fundamental statistics
a_df = pd.DataFrame(average_matrix, columns=range(1, strategies+1))
statistics = a_df.describe()
# add ranking row
df2 = pd.DataFrame([[np.where(ranking == i+1)[0][0]+1 for i in range(strategies)]],
columns=range(1, strategies+1), dtype=int, index=["ranking"])
frames = [df2, statistics]
statistics = pd.concat(frames)
statistics.columns.names = ["Str No."]
display(statistics)
実験1とは異なり, 分散と順位の間に明確な関係は見られない。
In [46]:
rounds = 1000 * 2
strategies = 10
max_ts = 100
# 読み込み
df = pd.read_csv('./contest2/data/set_result.csv', index_col=[0, 1], header=[0, 1])
# ts_lengthの長い順に並び替え
ordered_df = df.sortlevel(level="ts_length")
# 行: プレイヤー, 列: ts_lengthが1〜100期の時の平均利得
average_matrix = np.zeros((strategies, max_ts), dtype=float)
for t in range(1, max_ts+1):
df_t = df.iloc[df.index.get_level_values('ts_length') == t]
for s in range(1, strategies+1):
average = df_t[str(s)].mean().mean()
average_matrix[s-1, t-1] = average
fig, ax = plt.subplots(figsize=(20, 10))
plt.title("average payoff trend")
plt.xlabel("ts_length")
plt.ylabel("average payoff")
t_list = [i for i in range(1, max_ts+1)]
for s in range(1, strategies+1):
if s in [2, 8, 4, 10]:
pass
else:
average_list = average_matrix[s-1]
plt.plot(t_list, average_list, color='#bbbbbb')
plt.plot(t_list, average_matrix[2-1], color='red', linewidth=2, label="2 (ALLD)")
plt.plot(t_list, average_matrix[4-1], color='green', linewidth=2, label="4 (25%)")
plt.plot(t_list, average_matrix[8-1], color='blue', linewidth=2, label="8 (GT’)")
plt.plot(t_list, average_matrix[10-1], color='orange', linewidth=2, label="10 (TFT)")
plt.legend()
plt.show()
上位の戦略は、期数の短長にかかわらず、安定した平均利得をえている。
ALLDは特に短い期数のセッションでの平均利得が大きく、1位になった要因だと考えられる。
結果の生データ(csv)は contest3/data
戦略はuser_strategies
戦略のオートマトンはcontest3/automaton3.pdf
In [47]:
# 「相手の」シグナルが協調か攻撃かを(ノイズ付きで)返す
def private_signal(actions, random_state):
pattern = [[0, 0], [0, 1], [1, 0], [1, 1]]
# 例えば実際の行動が(0, 1)なら、シグナルは(1, 0)である可能性が最も高い
signal_probs = [[.9, .02, .02, .06], [.02, .06, .9, .02], [.02, .9, .06, .02], [.06, .02, .02, .9]]
p = random_state.uniform()
if actions[0] == 0 and actions[1] == 0:
return [0, 0] if p < 0.9 else [0, 1] if p < 0.92 else [1, 0] if p < 0.94 else [1, 1]
elif actions[0] == 0 and actions[1] == 1:
return [1, 0] if p < 0.9 else [0, 0] if p < 0.92 else [1, 1] if p < 0.94 else [0, 1]
elif actions[0] == 1 and actions[1] == 0:
return [0, 1] if p < 0.9 else [1, 1] if p < 0.92 else [0, 0] if p < 0.94 else [1, 0]
elif actions[0] == 1 and actions[1] == 1:
return [1, 1] if p < 0.9 else [1, 0] if p < 0.92 else [0, 1] if p < 0.94 else [0, 0]
else:
raise ValueError
strategies = [Iida_iprm, ImPrivStrategy, KatoStrategy, Self_Centered_private, GrimTrigger,
MyStrategy, beeleb, OyamaImperfectPrivateMonitoring, ogawa, yamagishi]
game = pl.RepeatedMatrixGame(payoff, strategies, signal=private_signal, ts_length=ts_length, repeat=1000)
game.play(mtype="private", random_seed=seed, record=False)
| Datetime | 2015-12-28-05-44-20 | |||||
|---|---|---|---|---|---|---|
| Monitoring type | private | |||||
| RandomSeed | 282 | |||||
| Repeats | 1000 | |||||
| Average ts_length | 32.856 | |||||
| Number of strategies | 10 | |||||
| Str No. | Strategy name | Average(session based) | Rank(session based) | Average(stage based) | Rank(stage based) | 備考 |
| 7 | beeleb_Strategy.beeleb | 3.512547784 | 1 | 3.364516374 | 1 | |
| 6 | gistfile1.MyStrategy | 3.482755316 | 2 | 3.29020879 | 3 | TFT' |
| 2 | mhanami_Imperfect_Private_Strategy.ImPrivStrategy | 3.481391663 | 3 | 3.293705868 | 2 | 2T2FT |
| 10 | yamagishi_impd.yamagishi | 3.42390276 | 4 | 3.211745191 | 4 | TFT |
| 8 | oyama.OyamaImperfectPrivateMonitoring | 3.420404393 | 5 | 3.193991965 | 5 | TFT' |
| 9 | ogawa.ogawa | 3.407284046 | 6 | 3.099491721 | 7 | |
| 4 | ikegami_imperfect_private.Self_Centered_private | 3.368936793 | 7 | 3.14127861 | 6 | 20% |
| 1 | Iida_imperfect_private.Iida_iprm | 3.366075611 | 8 | 3.079022096 | 8 | |
| 5 | tsuyoshi.GrimTrigger | 3.28006289 | 9 | 2.983293767 | 9 | TFT' |
| 3 | kato.KatoStrategy | 3.148614675 | 10 | 2.821551619 | 10 | |
| average | 3.389197593 | 3.1478806 | ||||
In [48]:
rounds = 1000 * 2
strategies = 10
max_ts = 100
# 読み込み
df = pd.read_csv('./contest3/data/set_result.csv', index_col=[0, 1], header=[0, 1])
# 行: プレイヤー, 列: 1000*2セッション分の平均利得
average_matrix = np.zeros((rounds*strategies, strategies), dtype=float)
for s in range(1, strategies+1):
for i, opponent in enumerate(df[str(s)].columns.values):
average_matrix[i*rounds:(i+1)*rounds, s-1] = df[str(s)][str(opponent)]
averages = np.zeros(strategies, dtype=float)
stds = np.zeros(strategies, dtype=float)
ranking = np.zeros(strategies, dtype=int)
for i in range(strategies):
averages[i] = average_matrix[:, i].mean()
stds[i] = average_matrix[:, i].std()
ranking = np.argsort(averages)[::-1]+1
fig, ax = plt.subplots(figsize=(20, 8))
bp = ax.boxplot(average_matrix, 0, '')
plt.grid()
plt.xlabel('戦略番号')
plt.ylabel('1セッションの平均利得')
ax.set_xlim([0, strategies+0.5])
ax.set_ylim([-0.1, 5.8])
plt.title('戦略別, 全セッションの平均利得の分布')
ax.text(0.4, 5.3, "ranking\nave\nstd", ha = 'center', va = 'center', color="black", size=14)
for i in range(strategies):
ax.text(i+1, 5.3, "{0:.0f}\n{1:.3f}\n{2:.3f}"
.format(np.where(ranking == i+1)[0][0]+1, averages[i], stds[i]), ha = 'center', va = 'center', color="black", size=14)
plt.show()
In [49]:
# fundamental statistics
a_df = pd.DataFrame(average_matrix, columns=range(1, strategies+1))
statistics = a_df.describe()
# add ranking row
df2 = pd.DataFrame([[np.where(ranking == i+1)[0][0]+1 for i in range(strategies)]],
columns=range(1, strategies+1), dtype=int, index=["ranking"])
frames = [df2, statistics]
statistics = pd.concat(frames)
statistics.columns.names = ["Str No."]
display(statistics)
In [50]:
rounds = 1000 * 2
strategies = 10
max_ts = 100
# 読み込み
df = pd.read_csv('./contest3/data/set_result.csv', index_col=[0, 1], header=[0, 1])
# ts_lengthの長い順に並び替え
ordered_df = df.sortlevel(level="ts_length")
# 行: プレイヤー, 列: ts_lengthが1〜100期の時の平均利得
average_matrix = np.zeros((strategies, max_ts), dtype=float)
for t in range(1, max_ts+1):
df_t = df.iloc[df.index.get_level_values('ts_length') == t]
for s in range(1, strategies+1):
average = df_t[str(s)].mean().mean()
average_matrix[s-1, t-1] = average
fig, ax = plt.subplots(figsize=(20, 10))
plt.title("average payoff trend")
plt.xlabel("ts_length")
plt.ylabel("average payoff")
t_list = [i for i in range(1, max_ts+1)]
for s in range(1, strategies+1):
if s in [2, 7, 4, 10]:
pass
else:
average_list = average_matrix[s-1]
plt.plot(t_list, average_list, color='#bbbbbb')
plt.plot(t_list, average_matrix[7-1], color='red', linewidth=2, label="7")
plt.plot(t_list, average_matrix[10-1], color='orange', linewidth=2, label="10 (TFT)")
plt.plot(t_list, average_matrix[2-1], color='blue', linewidth=2, label="2 (2T2FT)")
plt.plot(t_list, average_matrix[4-1], color='green', linewidth=2, label="4 (20%)")
plt.legend()
plt.show()
期数が長くなるに従って、協調がしづらくなっていることがわかる。TFT同士の対戦では、このようなことが一般に起こる(後述)
結果の生データ(csv)は contest4/data
戦略は user_strategies
戦略のオートマトンは contest4/automaton4.pdf
In [51]:
# 「相手の」シグナルが協調か攻撃かを(ノイズ付きで)返す
def private_signal(actions, random_state):
pattern = [[0, 0], [0, 1], [1, 0], [1, 1]]
# 例えば実際の行動が(0, 1)なら、シグナルは(1, 0)である可能性が最も高い
signal_probs = [[.9, .02, .02, .06], [.02, .06, .9, .02], [.02, .9, .06, .02], [.06, .02, .02, .9]]
p = random_state.uniform()
if actions[0] == 0 and actions[1] == 0:
return [0, 0] if p < 0.9 else [0, 1] if p < 0.92 else [1, 0] if p < 0.94 else [1, 1]
elif actions[0] == 0 and actions[1] == 1:
return [1, 0] if p < 0.9 else [0, 0] if p < 0.92 else [1, 1] if p < 0.94 else [0, 1]
elif actions[0] == 1 and actions[1] == 0:
return [0, 1] if p < 0.9 else [1, 1] if p < 0.92 else [0, 0] if p < 0.94 else [1, 0]
elif actions[0] == 1 and actions[1] == 1:
return [1, 1] if p < 0.9 else [1, 0] if p < 0.92 else [0, 1] if p < 0.94 else [0, 0]
else:
raise ValueError
strategies = [Strategy1, Strategy2, Strategy3, Strategy4, Strategy5,
Strategy6, Strategy7, Strategy8, Strategy9, Strategy10,
Strategy11, Strategy12, Strategy13, Strategy14, Strategy15,
Strategy16, Strategy17, Strategy18, Strategy19, Strategy20,
Strategy21, Strategy22, Strategy23, Strategy24]
game = pl.RepeatedMatrixGame(payoff, strategies, signal=private_signal, ts_length=ts_length, repeat=1000)
game.play(mtype="private", random_seed=seed, record=False)
| Datetime | 2015-12-29-07-01-49 | |||||
|---|---|---|---|---|---|---|
| Monitoring type | private | |||||
| RandomSeed | 282 | |||||
| Repeats | 1000 | |||||
| Average ts_length | 32.856 | |||||
| Number of strategies | 24 | |||||
| Str No. | Strategy name | Average(session based) | Rank(session based) | Average(stage based) | Rank(stage based) | 備考 |
| 18 | kandori.Strategy18 | 3.359977969 | 1 | 3.228364555 | 1 | WSLS' |
| 13 | kandori.Strategy13 | 3.287460052 | 2 | 3.137979618 | 4 | CCDDDD |
| 22 | kandori.Strategy22 | 3.281387516 | 3 | 3.148252349 | 2 | |
| 14 | kandori.Strategy14 | 3.276439015 | 4 | 3.143196829 | 3 | WSLS' |
| 1 | kandori.Strategy1 | 3.26006426 | 5 | 3.12564803 | 6 | |
| 21 | kandori.Strategy21 | 3.259766841 | 6 | 3.110083267 | 8 | WSLS' |
| 3 | kandori.Strategy3 | 3.259031214 | 7 | 3.105561009 | 9 | WSLS' |
| 16 | kandori.Strategy16 | 3.239432858 | 8 | 3.084025749 | 13 | WSLS |
| 2 | kandori.Strategy2 | 3.239432858 | 9 | 3.084025749 | 12 | WSLS |
| 17 | kandori.Strategy17 | 3.227942348 | 10 | 3.069401327 | 14 | TFT' |
| 6 | kandori.Strategy6 | 3.227373162 | 11 | 3.09021437 | 11 | WSLS' |
| 4 | kandori.Strategy4 | 3.22501653 | 12 | 3.124100875 | 7 | |
| 23 | kandori.Strategy23 | 3.22174583 | 13 | 3.104321382 | 10 | |
| 19 | kandori.Strategy19 | 3.213839502 | 14 | 3.057152803 | 15 | TFT |
| 20 | kandori.Strategy20 | 3.201023476 | 15 | 3.032889731 | 17 | WSLS' |
| 11 | kandori.Strategy11 | 3.186472045 | 16 | 3.033648725 | 16 | TFT' |
| 7 | kandori.Strategy7 | 3.16280871 | 17 | 2.995780197 | 19 | TFT' |
| 15 | kandori.Strategy15 | 3.159724338 | 18 | 2.985872697 | 20 | WSLS' |
| 12 | kandori.Strategy12 | 3.157521914 | 19 | 3.005357342 | 18 | |
| 8 | kandori.Strategy8 | 3.157403557 | 20 | 3.137817294 | 5 | HIST |
| 10 | kandori.Strategy10 | 3.152953322 | 21 | 2.983149323 | 21 | TFT' |
| 24 | kandori.Strategy24 | 3.146712115 | 22 | 2.940208156 | 23 | |
| 5 | kandori.Strategy5 | 3.103164667 | 23 | 2.938215876 | 24 | |
| 9 | kandori.Strategy9 | 3.06455783 | 24 | 2.949860122 | 22 | STFT |
| average | 3.211302164 | 3.067296974 | ||||
In [52]:
rounds = 1000 * 2
strategies = 24
max_ts = 100
# 読み込み
df = pd.read_csv('./contest4/data/set_result.csv', index_col=[0, 1], header=[0, 1])
# 行: プレイヤー, 列: 1000*2セッション分の平均利得
average_matrix = np.zeros((rounds*strategies, strategies), dtype=float)
for s in range(1, strategies+1):
for i, opponent in enumerate(df[str(s)].columns.values):
average_matrix[i*rounds:(i+1)*rounds, s-1] = df[str(s)][str(opponent)]
averages = np.zeros(strategies, dtype=float)
stds = np.zeros(strategies, dtype=float)
ranking = np.zeros(strategies, dtype=int)
for i in range(strategies):
averages[i] = average_matrix[:, i].mean()
stds[i] = average_matrix[:, i].std()
ranking = np.argsort(averages)[::-1]+1
fig, ax = plt.subplots(figsize=(22, 12))
bp = ax.boxplot(average_matrix, 0, '')
plt.grid()
plt.xlabel('戦略番号')
plt.ylabel('1セッションの平均利得')
ax.set_xlim([0, strategies+0.5])
ax.set_ylim([-0.1, 5.8])
plt.title('戦略別, 全セッションの平均利得の分布')
ax.text(0.1, 5.3, "ranking\nave\nstd", ha = 'center', va = 'center', color="black", size=14)
for i in range(strategies):
ax.text(i+1, 5.3, "{0:.0f}\n{1:.3f}\n{2:.3f}"
.format(np.where(ranking == i+1)[0][0]+1, averages[i], stds[i]), ha = 'center', va = 'center', color="black", size=14)
plt.show()
In [75]:
# fundamental statistics
a_df = pd.DataFrame(average_matrix, columns=range(1, strategies+1))
statistics = a_df.describe()
# add ranking row
df2 = pd.DataFrame([[np.where(ranking == i+1)[0][0]+1 for i in range(strategies)]],
columns=range(1, strategies+1), dtype=int, index=["ranking"])
frames = [df2, statistics]
statistics = pd.concat(frames)
statistics.columns.names = ["Str No."]
display(statistics.iloc[:, :12])
display(statistics.iloc[:, 12:])
In [76]:
rounds = 1000 * 2
strategies = 24
max_ts = 100
# 読み込み
df = pd.read_csv('./contest4/data/set_result.csv', index_col=[0, 1], header=[0, 1])
# ts_lengthの長い順に並び替え
ordered_df = df.sortlevel(level="ts_length")
# 行: プレイヤー, 列: ts_lengthが1〜100期の時の平均利得
average_matrix = np.zeros((strategies, max_ts), dtype=float)
for t in range(1, max_ts+1):
df_t = df.iloc[df.index.get_level_values('ts_length') == t]
for s in range(1, strategies+1):
average = df_t[str(s)].mean().mean()
average_matrix[s-1, t-1] = average
fig, ax = plt.subplots(figsize=(20, 10))
plt.title("average payoff trend")
plt.xlabel("ts_length")
plt.ylabel("average payoff")
t_list = [i for i in range(1, max_ts+1)]
for s in range(1, strategies+1):
if s in [18, 13, 2, 19, 9]:
pass
else:
average_list = average_matrix[s-1]
plt.plot(t_list, average_list, color='#bbbbbb')
plt.plot(t_list, average_matrix[18-1], color='red', linewidth=2, label="18 (WSLS’)")
plt.plot(t_list, average_matrix[13-1], color='orange', linewidth=2, label="13 (CCDDDD)")
plt.plot(t_list, average_matrix[2-1], color='blue', linewidth=2, label="2 (WSLS)")
plt.plot(t_list, average_matrix[19-1], color='green', linewidth=2, label="19 (TFT)")
plt.plot(t_list, average_matrix[9-1], color='purple', linewidth=2, label="9 (STFT)")
plt.legend()
plt.show()
In [88]:
def trim_mean(ts_length, aves, width):
size = ts_length.size
hist = {}
for t in ts_length:
hist[t] = hist.get(t, 0) + 1
lower_b = size * (1-width) / 2
upper_b = size * (1 - (1-width)/2)
s = 0
total = 0
for ts, num in sorted(hist.items()):
old_s = s
s += num
if old_s <= lower_b < s:
total += (s-lower_b) * aves[ts-1]
elif old_s <= upper_b < s:
total += (upper_b-old_s+1) * aves[ts-1]
elif lower_b <= s <= upper_b:
total += num * aves[ts-1]
elif s > upper_b:
break
return total / (size * width)
rounds = 1000 * 2
strategies = 24
max_ts = ts_length.max()
# 読み込み
df = pd.read_csv('./contest4/data/set_result.csv', index_col=[0, 1], header=[0, 1])
# ts_lengthの長い順に並び替え
ordered_df = df.sortlevel(level="ts_length")
# 行: プレイヤー, 列: ts_lengthが1〜max期の時の平均利得
average_matrix = np.zeros((strategies, max_ts), dtype=float)
for t in range(1, max_ts+1):
df_t = df.iloc[df.index.get_level_values('ts_length') == t]
for s in range(1, strategies+1):
average = df_t[str(s)].mean().mean()
average_matrix[s-1, t-1] = average
for i in range(strategies):
print(trim_mean(ts_length, average_matrix[i], 0.9))
| Str No. | Average(session based) | Rank(session based) | Average(stage based) | Rank(stage based) | Average(90% trimmed) | Rank(trimmed) | 備考 |
|---|---|---|---|---|---|---|---|
| 18 | 3.35352416 | 1 | 3.219810292 | 1 | 3.354223602 | 1 | WSLS' |
| 13 | 3.326308014 | 2 | 3.182248494 | 2 | 3.327682945 | 2 | CCDDDD |
| 22 | 3.259068663 | 3 | 3.121244482 | 5 | 3.254935011 | 4 | |
| 14 | 3.258886509 | 4 | 3.122727237 | 4 | 3.256160683 | 3 | WSLS' |
| 1 | 3.256299103 | 5 | 3.132024724 | 3 | 3.250285117 | 5 | |
| 3 | 3.240387724 | 6 | 3.082433491 | 9 | 3.236639676 | 6 | WSLS' |
| 21 | 3.238405281 | 7 | 3.083776638 | 8 | 3.235193757 | 7 | WSLS' |
| 2 | 3.215812884 | 8 | 3.054822228 | 14 | 3.210963579 | 9 | WSLS |
| 16 | 3.215812884 | 9 | 3.054822228 | 15 | 3.210963579 | 10 | WSLS |
| 17 | 3.215547504 | 10 | 3.063675088 | 11 | 3.21302084 | 8 | TFT' |
| 19 | 3.213334955 | 11 | 3.06115156 | 12 | 3.207154339 | 11 | TFT |
| 6 | 3.197763649 | 12 | 3.056192503 | 13 | 3.193193311 | 12 | WSLS' |
| 12 | 3.197073568 | 13 | 3.045809911 | 16 | 3.178046947 | 16 | |
| 20 | 3.192768288 | 14 | 3.020367533 | 17 | 3.186697798 | 13 | WSLS' |
| 4 | 3.191465329 | 15 | 3.086214152 | 7 | 3.181888575 | 14 | |
| 23 | 3.188569289 | 16 | 3.06617612 | 10 | 3.180589184 | 15 | |
| 7 | 3.166979223 | 17 | 3.001625671 | 19 | 3.158844309 | 17 | TFT' |
| 15 | 3.161225612 | 18 | 2.983885545 | 21 | 3.151458884 | 19 | WSLS' |
| 11 | 3.159787981 | 19 | 3.004255063 | 18 | 3.154021739 | 18 | TFT' |
| 24 | 3.158548933 | 20 | 2.940998137 | 23 | 3.101466013 | 21 | |
| 10 | 3.157508886 | 21 | 2.988733446 | 20 | 3.148909213 | 20 | TFT' |
| 8 | 3.121529725 | 22 | 3.104081314 | 6 | 3.096718772 | 22 | HIST |
| 9 | 3.088360193 | 23 | 2.962527525 | 22 | 3.030839327 | 24 | STFT |
| 5 | 3.072941197 | 24 | 2.902704555 | 24 | 3.063080194 | 23 | |
| average | 3.211302164 | 3.067296974 | 3.200348035 |
ほぼセッションベース平均と同じ。
結果の生データ(csv)は contest5/data
戦略は user_strategies
戦略のオートマトンは contest5/automaton5.pdf
In [89]:
# 「相手の」シグナルが協調か攻撃かを(ノイズ付きで)返す
def private_signal(actions, random_state):
pattern = [[0, 0], [0, 1], [1, 0], [1, 1]]
# 例えば実際の行動が(0, 1)なら、シグナルは(1, 0)である可能性が最も高い
signal_probs = [[.9, .02, .02, .06], [.02, .06, .9, .02], [.02, .9, .06, .02], [.06, .02, .02, .9]]
p = random_state.uniform()
if actions[0] == 0 and actions[1] == 0:
return [0, 0] if p < 0.9 else [0, 1] if p < 0.92 else [1, 0] if p < 0.94 else [1, 1]
elif actions[0] == 0 and actions[1] == 1:
return [1, 0] if p < 0.9 else [0, 0] if p < 0.92 else [1, 1] if p < 0.94 else [0, 1]
elif actions[0] == 1 and actions[1] == 0:
return [0, 1] if p < 0.9 else [1, 1] if p < 0.92 else [0, 0] if p < 0.94 else [1, 0]
elif actions[0] == 1 and actions[1] == 1:
return [1, 1] if p < 0.9 else [1, 0] if p < 0.92 else [0, 1] if p < 0.94 else [0, 0]
else:
raise ValueError
strategies = [Strategy1, Strategy2, Strategy3, Strategy4, Strategy5,
Strategy6, Strategy7, Strategy8, Strategy9, Strategy10,
Strategy11, Strategy12, Strategy13, Strategy14, Strategy15,
Strategy16, Strategy17, Strategy18, Strategy19, Strategy20,
Strategy21, Strategy22, Strategy23, Strategy24,
Iida_iprm, KatoStrategy, Self_Centered_private, ImPrivStrategy,
GrimTrigger, MyStrategy, beeleb, OyamaImperfectPrivateMonitoring, ogawa, yamagishi]
game = pl.RepeatedMatrixGame(payoff, strategies, signal=private_signal, ts_length=ts_length, repeat=1000)
game.play(mtype="private", random_seed=seed, record=False)
| Datetime | 2015-12-29-08-02-38 | |||||
|---|---|---|---|---|---|---|
| Monitoring type | private | |||||
| RandomSeed | 282 | |||||
| Repeats | 1000 | |||||
| Average ts_length | 32.856 | |||||
| Number of strategies | 34 | |||||
| Str No. | Strategy name | Average(session based) | Rank(session based) | Average(stage based) | Rank(stage based) | 備考 |
| 27 | ikegami_imperfect_private.Self_Centered_private | 3.366868101 | 1 | 3.218934853 | 2 | 20% |
| 28 | mhanami_Imperfect_Private_Strategy.ImPrivStrategy | 3.361933787 | 2 | 3.228403533 | 1 | 2T2FT |
| 25 | Iida_imperfect_private.Iida_iprm | 3.324539566 | 3 | 3.141753588 | 7 | |
| 4 | kandori.Strategy4 | 3.303921511 | 4 | 3.182839736 | 4 | |
| 18 | kandori.Strategy18 | 3.298573086 | 5 | 3.094787504 | 14 | WSLS' |
| 17 | kandori.Strategy17 | 3.289954129 | 6 | 3.113827808 | 10 | TFT' |
| 30 | gistfile1.MyStrategy | 3.28804656 | 7 | 3.141913824 | 6 | TFT' |
| 23 | kandori.Strategy23 | 3.28293638 | 8 | 3.132734732 | 8 | |
| 11 | kandori.Strategy11 | 3.276110459 | 9 | 3.116849461 | 9 | TFT' |
| 19 | kandori.Strategy19 | 3.275622813 | 10 | 3.102621153 | 11 | TFT |
| 34 | yamagishi_impd.yamagishi | 3.275622813 | 11 | 3.102621153 | 12 | TFT |
| 29 | tsuyoshi.GrimTrigger | 3.273337259 | 12 | 3.096912194 | 13 | TFT' |
| 31 | beeleb_Strategy.beeleb | 3.268154747 | 13 | 3.14303055 | 5 | |
| 14 | kandori.Strategy14 | 3.265929641 | 14 | 3.074780414 | 17 | WSLS' |
| 32 | oyama.OyamaImperfectPrivateMonitoring | 3.264771416 | 15 | 3.094682769 | 15 | TFT' |
| 1 | kandori.Strategy1 | 3.264351241 | 16 | 3.074011909 | 18 | |
| 8 | kandori.Strategy8 | 3.261388173 | 17 | 3.201616412 | 3 | HIST |
| 33 | ogawa.ogawa | 3.257102734 | 18 | 3.08465953 | 16 | |
| 22 | kandori.Strategy22 | 3.247990043 | 19 | 3.05550647 | 19 | |
| 6 | kandori.Strategy6 | 3.245408946 | 20 | 3.055048142 | 20 | WSLS' |
| 21 | kandori.Strategy21 | 3.231870454 | 21 | 3.020929117 | 22 | WSLS' |
| 3 | kandori.Strategy3 | 3.221153715 | 22 | 3.004112867 | 25 | WSLS' |
| 7 | kandori.Strategy7 | 3.220640855 | 23 | 3.032698388 | 21 | TFT' |
| 10 | kandori.Strategy10 | 3.209269086 | 24 | 3.017327841 | 23 | TFT' |
| 16 | kandori.Strategy16 | 3.204363061 | 25 | 2.98581287 | 27 | WSLS |
| 2 | kandori.Strategy2 | 3.204363061 | 26 | 2.98581287 | 28 | WSLS |
| 13 | kandori.Strategy13 | 3.199255907 | 27 | 2.993635328 | 26 | CCDDDD |
| 5 | kandori.Strategy5 | 3.17071256 | 28 | 2.970803077 | 30 | |
| 26 | kato.KatoStrategy | 3.168234447 | 29 | 3.005790866 | 24 | |
| 20 | kandori.Strategy20 | 3.156422163 | 30 | 2.929961758 | 32 | WSLS' |
| 12 | kandori.Strategy12 | 3.154547863 | 31 | 2.957956466 | 31 | |
| 15 | kandori.Strategy15 | 3.118463618 | 32 | 2.890986873 | 33 | WSLS' |
| 9 | kandori.Strategy9 | 3.113619613 | 33 | 2.976513377 | 29 | STFT |
| 24 | kandori.Strategy24 | 3.013624736 | 34 | 2.759430635 | 34 | |
| average | 3.237620722 | 3.058509061 | ||||
In [97]:
rounds = 1000 * 2
strategies = 34
max_ts = 100
# 読み込み
df = pd.read_csv('./contest5/data/set_result.csv', index_col=[0, 1], header=[0, 1])
# 行: プレイヤー, 列: 1000*2セッション分の平均利得
average_matrix = np.zeros((rounds*strategies, strategies), dtype=float)
for s in range(1, strategies+1):
for i, opponent in enumerate(df[str(s)].columns.values):
average_matrix[i*rounds:(i+1)*rounds, s-1] = df[str(s)][str(opponent)]
averages = np.zeros(strategies, dtype=float)
stds = np.zeros(strategies, dtype=float)
ranking = np.zeros(strategies, dtype=int)
for i in range(strategies):
averages[i] = average_matrix[:, i].mean()
stds[i] = average_matrix[:, i].std()
ranking = np.argsort(averages)[::-1]+1
fig, ax = plt.subplots(figsize=(28, 12))
bp = ax.boxplot(average_matrix, 0, '')
plt.grid()
plt.xlabel('戦略番号')
plt.ylabel('1セッションの平均利得')
ax.set_xlim([0, strategies+0.5])
ax.set_ylim([-0.1, 5.8])
plt.title('戦略別, 全セッションの平均利得の分布')
ax.text(0.1, 5.3, "ranking\nave\nstd", ha = 'center', va = 'center', color="black", size=15)
for i in range(strategies):
ax.text(i+1, 5.3, "{0:.0f}\n{1:.3f}\n{2:.3f}"
.format(np.where(ranking == i+1)[0][0]+1, averages[i], stds[i]), ha = 'center', va = 'center', color="black", size=14)
plt.show()
In [98]:
# fundamental statistics
a_df = pd.DataFrame(average_matrix, columns=range(1, strategies+1))
statistics = a_df.describe()
# add ranking row
df2 = pd.DataFrame([[np.where(ranking == i+1)[0][0]+1 for i in range(strategies)]],
columns=range(1, strategies+1), dtype=int, index=["ranking"])
frames = [df2, statistics]
statistics = pd.concat(frames)
statistics.columns.names = ["Str No."]
display(statistics.iloc[:, :12])
display(statistics.iloc[:, 12:24])
display(statistics.iloc[:, 24:])
In [99]:
rounds = 1000 * 2
strategies = 34
max_ts = 100
# 読み込み
df = pd.read_csv('./contest5/data/set_result.csv', index_col=[0, 1], header=[0, 1])
# ts_lengthの長い順に並び替え
ordered_df = df.sortlevel(level="ts_length")
# 行: プレイヤー, 列: ts_lengthが1〜100期の時の平均利得
average_matrix = np.zeros((strategies, max_ts), dtype=float)
for t in range(1, max_ts+1):
df_t = df.iloc[df.index.get_level_values('ts_length') == t]
for s in range(1, strategies+1):
average = df_t[str(s)].mean().mean()
average_matrix[s-1, t-1] = average
fig, ax = plt.subplots(figsize=(20, 10))
plt.title("average payoff trend")
plt.xlabel("ts_length")
plt.ylabel("average payoff")
t_list = [i for i in range(1, max_ts+1)]
for s in range(1, strategies+1):
if s in [27, 28, 18, 13, 9, 8]:
pass
else:
average_list = average_matrix[s-1]
plt.plot(t_list, average_list, color='#bbbbbb')
plt.plot(t_list, average_matrix[27-1], color='red', linewidth=2, label="27 (20%)")
plt.plot(t_list, average_matrix[28-1], color='blue', linewidth=2, label="28 (2T2FT)")
plt.plot(t_list, average_matrix[19-1], color='magenta', linewidth=2, label="19 (TFT)")
plt.plot(t_list, average_matrix[18-1], color='green', linewidth=2, label="18 (WSLS’)")
plt.plot(t_list, average_matrix[13-1], color='purple', linewidth=2, label="13 (CCDDDD)")
plt.plot(t_list, average_matrix[9-1], color='brown', linewidth=2, label="9 (STFT)")
plt.plot(t_list, average_matrix[8-1], color='orange', linewidth=2, label="8 (HIST)")
plt.legend()
plt.show()
In [100]:
def trim_mean(ts_length, aves, width):
size = ts_length.size
hist = {}
for t in ts_length:
hist[t] = hist.get(t, 0) + 1
lower_b = size * (1-width) / 2
upper_b = size * (1 - (1-width)/2)
s = 0
total = 0
for ts, num in sorted(hist.items()):
old_s = s
s += num
if old_s <= lower_b < s:
total += (s-lower_b) * aves[ts-1]
elif old_s <= upper_b < s:
total += (upper_b-old_s+1) * aves[ts-1]
elif lower_b <= s <= upper_b:
total += num * aves[ts-1]
elif s > upper_b:
break
return total / (size * width)
rounds = 1000 * 2
strategies = 34
max_ts = ts_length.max()
# 読み込み
df = pd.read_csv('./contest5/data/set_result.csv', index_col=[0, 1], header=[0, 1])
# ts_lengthの長い順に並び替え
ordered_df = df.sortlevel(level="ts_length")
# 行: プレイヤー, 列: ts_lengthが1〜max期の時の平均利得
average_matrix = np.zeros((strategies, max_ts), dtype=float)
for t in range(1, max_ts+1):
df_t = df.iloc[df.index.get_level_values('ts_length') == t]
for s in range(1, strategies+1):
average = df_t[str(s)].mean().mean()
average_matrix[s-1, t-1] = average
for i in range(strategies):
print(trim_mean(ts_length, average_matrix[i], 0.9))
| Str No. | Average(session based) | Rank(session based) | Average(stage based) | Rank(stage based) | Average(90% trimmed) | Rank(trimmed) | 備考 |
|---|---|---|---|---|---|---|---|
| 27 | 3.366868101 | 1 | 3.218934853 | 2 | 3.363570567 | 1 | 20% |
| 28 | 3.361933787 | 2 | 3.228403533 | 1 | 3.360487839 | 2 | 2T2FT |
| 25 | 3.324539566 | 3 | 3.141753588 | 7 | 3.325417742 | 3 | |
| 4 | 3.303921511 | 4 | 3.182839736 | 4 | 3.297341634 | 5 | |
| 18 | 3.298573086 | 5 | 3.094787504 | 14 | 3.297783182 | 4 | WSLS' |
| 17 | 3.289954129 | 6 | 3.113827808 | 10 | 3.288660204 | 6 | TFT' |
| 30 | 3.28804656 | 7 | 3.141913824 | 6 | 3.282892797 | 7 | TFT' |
| 23 | 3.28293638 | 8 | 3.132734732 | 8 | 3.278695652 | 8 | |
| 11 | 3.276110459 | 9 | 3.116849461 | 9 | 3.272011026 | 9 | TFT' |
| 19 | 3.275622813 | 10 | 3.102621153 | 11 | 3.269895466 | 11 | TFT |
| 34 | 3.275622813 | 11 | 3.102621153 | 12 | 3.269895466 | 12 | TFT |
| 29 | 3.273337259 | 12 | 3.096912194 | 13 | 3.270222459 | 10 | TFT' |
| 31 | 3.268154747 | 13 | 3.14303055 | 5 | 3.259247461 | 16 | |
| 14 | 3.265929641 | 14 | 3.074780414 | 17 | 3.264354067 | 13 | WSLS' |
| 32 | 3.264771416 | 15 | 3.094682769 | 15 | 3.260862029 | 15 | TFT' |
| 1 | 3.264351241 | 16 | 3.074011909 | 18 | 3.261286052 | 14 | |
| 8 | 3.261388173 | 17 | 3.201616412 | 3 | 3.245882664 | 18 | HIST |
| 33 | 3.257102734 | 18 | 3.08465953 | 16 | 3.253535224 | 17 | |
| 22 | 3.247990043 | 19 | 3.05550647 | 19 | 3.243656738 | 19 | |
| 6 | 3.245408946 | 20 | 3.055048142 | 20 | 3.243325069 | 20 | WSLS' |
| 21 | 3.231870454 | 21 | 3.020929117 | 22 | 3.229177999 | 21 | WSLS' |
| 3 | 3.221153715 | 22 | 3.004112867 | 25 | 3.217049236 | 22 | WSLS' |
| 7 | 3.220640855 | 23 | 3.032698388 | 21 | 3.213019798 | 23 | TFT' |
| 10 | 3.209269086 | 24 | 3.017327841 | 23 | 3.201075772 | 24 | TFT' |
| 16 | 3.204363061 | 25 | 2.98581287 | 27 | 3.199717966 | 26 | WSLS |
| 2 | 3.204363061 | 26 | 2.98581287 | 28 | 3.199717966 | 25 | WSLS |
| 13 | 3.199255907 | 27 | 2.993635328 | 26 | 3.19246937 | 27 | CCDDDD |
| 5 | 3.17071256 | 28 | 2.970803077 | 30 | 3.164647724 | 28 | |
| 26 | 3.168234447 | 29 | 3.005790866 | 24 | 3.146469219 | 30 | |
| 20 | 3.156422163 | 30 | 2.929961758 | 32 | 3.148205881 | 29 | WSLS' |
| 12 | 3.154547863 | 31 | 2.957956466 | 31 | 3.133134747 | 31 | |
| 15 | 3.118463618 | 32 | 2.890986873 | 33 | 3.10604335 | 32 | WSLS' |
| 9 | 3.113619613 | 33 | 2.976513377 | 29 | 3.060425548 | 33 | STFT |
| 24 | 3.013624736 | 34 | 2.759430635 | 34 | 2.952215852 | 34 | |
| average | 3.237620722 | 3.058509061 | 3.228599817 |
セッション平均とほぼ同じ。
スコアテーブルを戦略のタイプ別に集計すると、
| タイプ別平均 | |||||
|---|---|---|---|---|---|
| WSLS | TFT | ALLD | Other kandori | total average | |
| WSLS | 3.485347614 | 3.1719659 | 1.597288599 | 3.241082345 | 3.246911304 |
| TFT | 3.156388186 | 3.201584794 | 2.102810448 | 3.289310268 | 3.168095626 |
| ALLD | 3.568115816 | 2.766558346 | 2.393956929 | 3.474086488 | 3.287460052 |
| Other kandori | 3.281705328 | 3.259717721 | 1.61449243 | 3.243862807 | 3.194127049 |
| total | 3.33867567 | 3.191729249 | 1.762598185 | 3.263774653 | 3.211302164 |
となった。神取ゼミのWSLS, TFT, ALLD以外の8戦略(Other kandori)は3戦略にそれほど大きな影響を与えていないことがわかる。したがって、3タイプだけで元実験を近似できている。
一般に、WSLSが多く、ALLDが少ない環境では、WSLSは高い利得を得られる。
特に戦略18は、通常のWSLSに比べてALLDに強く、1位になった要因だと考えられる。
| タイプ別平均 | ||||||
|---|---|---|---|---|---|---|
| WSLS | TFT | ALLD | Other kandori | Other oyama | total average | |
| WSLS | 3.485347614 | 3.294184513 | 1.597288599 | 3.241082345 | 2.844703858 | 3.216283083 |
| TFT | 3.217917263 | 3.418662665 | 1.999373767 | 3.280819084 | 3.198661754 | 3.258993526 |
| ALLD | 3.568115816 | 2.947953446 | 2.393956929 | 3.474086488 | 2.80950435 | 3.199255907 |
| Other kandori | 3.281705328 | 3.384906732 | 1.61449243 | 3.243862807 | 2.977608253 | 3.212434063 |
| Other oyama | 3.290522046 | 3.369423514 | 2.085169256 | 3.355591673 | 3.161811508 | 3.276979919 |
| total | 3.324693738 | 3.356684553 | 1.826601514 | 3.278285245 | 3.036089469 | 3.237620722 |
スコアテーブルを戦略のタイプごとに集計し直すと、実験5で「WSLSの利得 < TFTの利得」となった要因は、TFT同士の対戦の利得が実験4の場合よりも高くなったこと、及び尾山ゼミのWSLS, TFT, ALLDでない残りの5戦略との対戦でTFTがより高い利得を得たことにある。
| タイプ別平均 | |||||||
|---|---|---|---|---|---|---|---|
| WSLS | TFT | ALLD | Prob | Other kandori | Other oyama | total average | |
| WSLS | 3.485347614 | 3.294184513 | 1.597288599 | 2.559611894 | 3.241082345 | 2.915976849 | 3.216283083 |
| TFT | 3.217917263 | 3.418662665 | 1.999373767 | 2.99366014 | 3.280819084 | 3.249912158 | 3.258993526 |
| ALLD | 3.568115816 | 2.947953446 | 2.393956929 | 2.536744069 | 3.474086488 | 2.87769442 | 3.199255907 |
| Prob | 3.553529215 | 3.278944542 | 2.286598783 | 3.318680869 | 3.513118831 | 3.178283059 | 3.366868101 |
| Other kandori | 3.281705328 | 3.384906732 | 1.61449243 | 2.727741801 | 3.243862807 | 3.040074867 | 3.212434063 |
| Other oyama | 3.224770254 | 3.392043256 | 2.034811875 | 2.927390992 | 3.316209883 | 3.206494414 | 3.254507873 |
| total | 3.324693738 | 3.356684553 | 1.826601514 | 2.80452035 | 3.278285245 | 3.093981748 | 3.237620722 |
実験5のスコアテーブルを再度タイプ別に集計すると、ProbはTFT, ALLDとの対戦でそれなりの利得を得、WSLSに対してはALLDなみに高い利得をえていることがわかる。
In [ ]: