-
Notifications
You must be signed in to change notification settings - Fork 0
/
KMR_class.py
137 lines (125 loc) · 5.49 KB
/
KMR_class.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
from __future__ import division
import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import binom
from discrete_rv import DiscreteRV
from mc_tools import mc_sample_path, mc_compute_stationary
def set_pay(pf): # 2人分の利得表を入れると1人分に変形して返します
global one_payoff
WDT='Wrong Data Type ! '
if pf is int:
print WDT
elif pf[0] is int:
print WDT
else:
if pf[0][0] is list or tuple:
one_payoff = np.transpose(np.transpose(pf)[0])
print'OK. one_payoff is'
print str(one_payoff)
elif pf[0][0] is int:
one_payoff = pf
print'OK. one_payoff is'
print str(one_payoff)
else:
print WDT
#set_payを使わない場合はone_payoffに二重のlistかtupleでプレイヤー1人の利得を入れてください
class KMR:
def __init__(self,n,p,epsilon,mode):
self.one_pay = one_payoff
self.epsi = epsilon
self.n = n
self.mode = mode # 'sequential'or 'simultaneous'
self.X = 0
self.p = p
self.xs = 0
self.x_0 = 0
def set_move(self):
self.X = np.zeros((self.n+1,self.n+1))
if self.mode == 'sequential': # 逐次改訂
expay0 = np.empty(2)
expay1 = np.empty(2)
for k in range(1,self.n):
#直前まで0だった人が選ばれた時の行動選択による期待利得
expay0[0] = self.one_pay[0][0]*(self.n-k-1)/(self.n-1)+self.one_pay[0][1]*k/(self.n-1)
expay0[1] = self.one_pay[1][0]*(self.n-k-1)/(self.n-1)+self.one_pay[1][1]*k/(self.n-1)
#直前まで1だった人が選ばれた時の行動選択による期待利得
expay1[0] = self.one_pay[0][0]*(self.n-k)/(self.n-1)+self.one_pay[0][1]*(k-1)/(self.n-1)
expay1[1] = self.one_pay[1][0]*(self.n-k)/(self.n-1)+self.one_pay[1][1]*(k-1)/(self.n-1)
if expay1[0] > expay1[1]:
self.X[k][k-1]=(k/self.n)*(1-self.epsi*0.5) #k人からk-1人になる確率
self.X[k][k]=(k/self.n)*self.epsi*0.5
elif expay1[0]==expay1[1]:
self.X[k][k-1]=(k/self.n)*0.5
self.X[k][k]=(k/self.n)*0.5
else:
self.X[k][k-1]= (k/self.n)*self.epsi*0.5
self.X[k][k] = (k/self.n)*(1-self.epsi*0.5)
if expay0[1]>expay0[0]:
self.X[k][k+1]=((self.n-k)/self.n)*(1-self.epsi*0.5) #k人からk+1人になる確率
self.X[k][k] += ((self.n-k)/self.n)*self.epsi*0.5 #X[k][k]は上でも定めているので上書きでなく加えている
elif expay0[1]==expay0[0]:
self.X[k][k+1] = ((self.n-k)/self.n)*0.5
self.X[k][k] += ((self.n-k)/self.n)*0.5
else:
self.X[k][k+1] = ((self.n-k)/self.n)*self.epsi*0.5
self.X[k][k] += ((self.n-k)/self.n)*(1-self.epsi*0.5)
self.X[0][0] = 1-self.epsi*0.5
self.X[0][1] = self.epsi*0.5
self.X[self.n][self.n-1] = self.epsi*0.5
self.X[self.n][self.n] = 1-self.epsi*0.5
elif self.mode == 'simultaneous': # 同時改訂
list=[]
for i in range(self.n+1):
list.append(i)
expay = np.empty(2)
for k in range(0,self.n+1):
#各人の行動選択による期待利得
expay[0] = self.one_pay[0][0]*(self.n-k)/(self.n)+self.one_pay[0][1]*k/(self.n)
expay[1] = self.one_pay[1][0]*(self.n-k)/(self.n)+self.one_pay[1][1]*k/(self.n)
if expay[0] > expay[1]:
self.X[k] = binom.pmf(list,self.n,self.epsi)
elif expay[0] == expay[1]:
self.X[k] = binom.pmf(list,self.n,0.5)
else:
self.X[k] = binom.pmf(list,self.n,1-self.epsi)
else:
print 'The mode '+ self.mode+'is Unknown. Check your input.'
def set_x0(self):
self.x_0 = np.random.binomial(self.n,self.p) # determine X_0
def path(self, t):
self.set_move()
self.set_x0()
self.xs = mc_sample_path(self.X,init=self.x_0,sample_size=t)
def plot(self,t):
self.path(t)
plt.plot(self.xs, 'b-', label='X_t')
tit = str(self.n)+' people, '+self.mode+' mode, '+'p = '+str(round(self.p,2))+'\n'+'epsilon = '+str(self.epsi)+', time length = '+str(t)
plt.title(tit)
plt.legend()
plt.show()
def hist(self,t):
self.path(t)
plt.hist(self.xs, bins=10)
plt.ylim([0,t])
tit = str(self.n)+' people, '+self.mode+' mode, '+'p = '+str(round(self.p,2))+', '+'\n'+'epsilon = '+str(self.epsi)+', time length = '+str(t)
plt.title(tit)
plt.show()
def equilibrium(self):
self.set_move()
Y = mc_compute_stationary(self.X)
tit = str(self.n)+' people, '+self.mode+' mode, '+'epsilon = '+str(self.epsi)
plt.bar(range(self.n+1), Y, align='center')
plt.xlim([-0.5, self.n+0.5])
plt.ylim([0,1])
plt.title(tit)
plt.show()
"""
#入力の例
payoff = [[[4,4],[0,3]],[[3,0],[2,2]]]
set_pay(payoff)
f = KMR(10,0,0.1,'sequential') # (人数, 二項分布の確率, ε, モード)
#f.plot(100000)
#f.hist(100000)
#f.equilibrium()
"""