-
Notifications
You must be signed in to change notification settings - Fork 0
/
fictitious_play.py
116 lines (90 loc) · 2.81 KB
/
fictitious_play.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
import numpy
import math
from scipy import stats
def RandomizedFictitiousPlay(A, Epsilon):
n = len(A[0])
m = len(A)
X = numpy.matrix(numpy.zeros((m, 1), dtype=int))
Y = numpy.matrix(numpy.zeros((n, 1), dtype=int))
X[0] = 1
Y[0] = 1
numpy.random.shuffle(X)
numpy.random.shuffle(Y)
t = int(round(6*math.log(2*n*m)/pow(Epsilon, 2)))
for i in range(t):
Ax = numpy.array(numpy.transpose(A) * X).tolist()
#print Ax
Ay = numpy.array(A * Y).tolist()
#print Ay
values = Ay
probabilities = []
for item in Ay:
probabilities.append(pow(math.e, Epsilon*item[0]/2))
while True:
try:
theprobabilities = []
temp = sum(probabilities)
theprobabilities[:] = [x / temp for x in probabilities]
distrib = stats.rv_discrete(values=(values, theprobabilities))
xchoice = Ay.index(distrib.rvs(size=1)[0])
break
except:
pass
values = Ax
probabilities = []
for item in Ax:
probabilities.append(pow(math.e, -Epsilon*item[0]/2))
while True:
try:
theprobabilities = []
temp = sum(probabilities)
theprobabilities[:] = [x / temp for x in probabilities]
distrib = stats.rv_discrete(values=(values, theprobabilities))
ychoice = Ax.index(distrib.rvs(size=1)[0])
break
except:
pass
#print xchoice
X[xchoice] += 1
#print X
#print ychoice
Y[ychoice] += 1
#print Y
return X/float(t+1), Y/float(t+1)
def FictitiousPlay(A, t):
n = len(A[0])
m = len(A)
X = numpy.matrix(numpy.zeros((m, 1), dtype=int))
Y = numpy.matrix(numpy.zeros((n, 1), dtype=int))
X[0] = 1
Y[0] = 1
numpy.random.shuffle(X)
numpy.random.shuffle(Y)
for i in range(t):
Ax = numpy.array(numpy.transpose(A) * X).tolist()
Ay = numpy.array(A * Y).tolist()
xchoice = Ax.index(min(Ax))
ychoice = Ay.index(max(Ay))
#print xchoice
X[ychoice] += 1
#print X
#print ychoice
Y[xchoice] += 1
#print Y
return X/float(t+1), Y/float(t+1)
#The payoff Matrix
A = numpy.identity(5, dtype=int)
#A = numpy.array([[1, 0, 2, -2], [-1, 1, -1, 0]])
print FictitiousPlay(A, 10000)
print RandomizedFictitiousPlay(A, 0.1)
#r = 1
#while r >= 0.3:
# temp1, temp = RandomizedFictitiousPlay(A, 0.1)
# Ax = numpy.array(numpy.transpose(A) * temp1).tolist()
# Ay = numpy.array(A * temp).tolist()
# r = abs(max(Ay)[0] - min(Ax)[0])
# print r
#print temp1, temp
#while temp
#print RandomizedFictitiousPlay(A, 0.1)
#print FictitiousPlay(A, 1700)