import numpy as np
import matplotlib.pyplot as plt
class Prisoners_Dilemma:
def __init__(self,n,p):
self.n = n
self.p = p
def decision_array(self):
self.dict_dict = {}
for i in range(1,self.n + 1):
self.dict_dict[i] = []
list_list = []
for j in range(1,self.n):
#np.random.seed(j)
self.r = np.random.uniform(0,1)
if self.r > self.p:
q = 0
else:
q = 1
list_list.append(q)
self.dict_dict[i] = list_list
return self.dict_dict
def payoff(self):
self.dict_dict_2 = {}
for i in range(1,self.n + 1):
self.dict_dict_2[i] = []
list_list_2 = []
list_list_3=[]
for j in range(1, i):
list_list_2.append(self.dict_dict[j][i-2])
for j in range(i + 1, self.n + 1):
list_list_2.append(self.dict_dict[j][i-1])
list_list_2_np = np.array(list_list_2)
against_i = np.sum(list_list_2_np)
for_i = np.sum(self.dict_dict[i])
if against_i == 0 and for_i == 0:
payoff_i = 2
elif against_i == 0 and for_i != 0:
payoff_i = 5
elif against_i != 0 and for_i == 0:
payoff_i = -5
else:
payoff_i = -2
list_list_3.append(payoff_i)
self.dict_dict_2[i]=list_list_3
return self.dict_dict_2
def gameplay(self, N, initial_count):
self.counter = initial_count
for i in range(N):
for j in range(1, self.n + 1):
z = self.dict_dict_2[j]
x = np.array(z)
self.counter += np.sum(z)
return self.counter
y = Prisoners_Dilemma(15,0.015)
print (y.gameplay(20,100))
在上面的代码中,编译器给出了一个错误,即实例没有属性为dict_dict_2,即使它以self为前缀。而且,dict_dict完全没问题。为了完整起见,我已经包含了整个代码,但问题仅在于支付和游戏方法?
答案 0 :(得分:2)
dict_dict_2
仅在<{1}}中创建,因此您必须在尝试呼叫payoff()
之前调用。
答案 1 :(得分:0)
问题是您只在self.dict_dict_2
函数中创建payoff
变量,但在您调用gameplay()
函数的逻辑中,您没有调用payoff()
函数在访问dict_dict_2
之前的函数,从它的外观来看,你根本不会在任何地方调用该函数。
不确定dict_dict_2
是什么,但上面是您遇到问题的原因,也许您可以将dict_dict_2
的初始化部分移动到__init__()
函数,尽管如此不能解决完整问题,因为如果dict_dict_1[j]
不是j
中的密钥,您仍然会尝试访问dict_dict_2
,这可能会导致错误。