2016-07-04 17 views
0

Prisoner's DilemmaDebuggen eines Gefangenen Simulation

Dieses Programm sollte 204 und 199 zurück, aber stattdessen 0 zurück und 1000. kann ich das Problem beheben, indem die ersten und zweiten Zeilen des Hauptverfahrens zu ändern zu:

FirstStrat = Defector() 
    SecondStrat = TitForTat() 

Warum könnte das passieren?

Wie kann ich das Programm so ändern, dass es funktioniert, egal in welcher Reihenfolge ich Defector und TitForTat eingib?

+0

Ich weiß, was das Problem ist, aber ich habe keine Ahnung, warum es passiert, damit jemand anderes uns beide erleuchten kann. – Ulisha

+0

Problem kommt mit der Vererbung. Sowohl "TitForTat" als auch "Defector" scheinen die Ressourcen von "Strategy" zu teilen. Mit anderen Worten, sie rufen dieselbe "update" -Methode auf, die die selbe 'self.opponent_moves' modifiziert, so dass 'self.opponent_moves' nicht die gegnerischen Züge hat, sondern die Züge von beiden Spielern, die Methode' get_move' renderend von 'TitForTat', um immer den Wechsel vom' SecondStrat' zu bekommen. – Ulisha

Antwort

1

Das Problem kommt von der Art, wie Sie die Variablen aus der Klasse Strategy definiert haben. Durch sie auf diese Weise zu definieren:

class Strategy(object): 
    turn_number = 1 
    moves = [] 
    opponent_moves = [] 
    total_points = 0 
    opponent_points = 0 

Alle werden diese Variablen durch alle Instanzen der Klasse geteilt werden Strategy (oder irgendetwas davon die Unterklassen). Das macht es so, dass self.opponent_moves die Züge vom Gegner nicht speichert, es speichert die Züge von beiden Spielern (da sie diese Variable teilen, wenn jedes die Methode update aufruft), deshalb gibt die Methode get_move von TitForTat den letzten Zug aus dem zurück SecondStrat anstelle des letzten Zuges vom Gegner.

Ihr Problem zu lösen, definieren sie nur als Klassenvariablen innerhalb der __init__:

class Strategy(object): 

    def __init__(self): 
     self.turn_number = 1 
     self.moves = [] 
     self.opponent_moves = [] 
     self.total_points = 0 
     self.opponent_points = 0 

Und es wird gut funktionieren.