我在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])
这是我的代码。 'players'列表是一个Strategy对象列表,其中'name'是一个字符串,'logic'是一个函数。我遇到的麻烦发生在
行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]}
结果并非完全错误,但有些是错误的。有谁知道为什么结果不好或为什么我在Player 1的字典中有“Player 1 Name”键和在Player 2的字典中有“Player 2 Name”?
编辑:根据请求提供更多代码
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]]]
答案 0 :(得分:1)
这不是一个完整的答案,但在异常块中执行“实际工作”必然会引起混淆。如果您想查看字典中是否有密钥,请使用in
操作明确执行此操作。
您可以通过将条件更改为
来删除try / except块if p.name != o.name and o.name not in p.history:
然后,部分重复的囚犯困境是,策略应该与自己对抗,以便可能更好:
if o.name not in p.history:
如果没有更多麻烦的代码(例如play
),很难就此问题提供更多建议。