2013-02-25 64 views
0

我是用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]]] 
+0

我不知道到底是什麼問題,但我不認爲它似乎有什麼東西特別是與迭代或字典的事,但在你的邏輯只是一些問題。 – Iguananaut 2013-02-25 15:34:59

回答

1

這不是一個完整的答案更多的代碼,但在異常塊做「真正的工作」,勢必造成混亂。如果你想看看是否有在字典中的關鍵,與in操作明確地這樣做。

您可以通過更改條件然後再次下降在try/except塊來

if p.name != o.name and o.name not in p.history: 

,迭代囚徒困境的一部分,是一個戰略要對陣自己,這樣可能會更好:

if o.name not in p.history: 

沒有更多的麻煩代碼(例如play),很難給出這個問題的更多建議。

+0

好吧,我明白你的有關異常與條件點,並有我的編輯我與後者if語句代碼。我還編輯了原文,以包含有關「播放」功能的詳細信息,但我認爲他們不應該擔心。 – tanderson11 2013-02-25 17:01:30