我正在用 Python 编写迭代囚徒困境的实现,并且遇到以下问题。
for p in players:
for o in players:
if p.name != o.name:
try:
p.history[o.name]
except KeyError:
p.history[o.name] = []
o.history[p.name] = []
for i in xrange(0,2):
result = play(p.logic(p.history[o.name]),
o.logic(o.history[p.name]))
p.history[o.name].append(result[0])
o.history[p.name].append(result[1])
这是我的代码。“玩家”列表是一个策略对象列表,其中“名称”是一个字符串,“逻辑”是一个函数。我遇到的麻烦发生在线路上
p.history[o.name].append(result[0])
我正在尝试创建以下词典:
Player 1.history = {"Player 2 Name": [result, result, result]}
Player 2.history = {"Player 1 Name": [result, result, result]}
但我得到了这个:
Player 1.history = {"Player 1 Name": [wrong results],
"Player 2 Name": [wrong results]}
结果并不全是错误的,但有些是错误的。有谁知道为什么结果不正确,或者为什么我在玩家 1 的字典中有键“玩家 1 名称”和玩家 2 的字典中的“玩家 2 名称”?
编辑:应要求提供更多代码
class Strategy:
"""Basic class for all strategies to use. The 'logic' function is defined oustide and governs behavior"""
def __init__(self, logic, name):
self.logic = logic
self.name = name
history = {}
def makePlayer(name):
if name == "Defects":
def logic(hist):
return 1
if name == "Tit for Tat":
def logic(hist):
for i in xrange(1,3):
try:
if hist[len(hist) - i][1] == 1:
return 1
except IndexError:
pass
return 0
return Strategy(logic, name)
payoff = [[100, 0], [101, 1]]
def play(choice1, choice2): #choiceFoo = 0 => cooperate; 1 => defect
return [[choice1, choice2, payoff[choice1][choice2]], [choice2, choice1, payoff[choice2][choice1]]]