我是用Python寫重複囚徒困境的實現,和我有以下問題。簡單的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]}
的結果是不都錯了,但有些是。有誰知道爲什麼無論結果是不是所有的權利或爲什麼我有鑰匙「玩家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]]]
我不知道到底是什麼問題,但我不認爲它似乎有什麼東西特別是與迭代或字典的事,但在你的邏輯只是一些問題。 – Iguananaut 2013-02-25 15:34:59