Strip Iterated Prisoners Dilemma

BLOG: Bierologie

Weissbier & Wissenschaft
Bierologie

Strip Versions
Okay. Nicht ganz. In der Uni haben wir im Rahmen der Python-Einführung lustig das iterierte Gefangenendilemma programmiert. Wer ein bisschen Python lesen kann oder lesen will oder lernen will findet den Code hier. Gleichzeitig gibt es ein bisschen was zur Spieltheorie die auch in der Evolutionsbiologie von nutzen ist (wer «The Selfish Gene» gelesen hat wird die Details bereits kennen).

Aber was ist das iterierte Gefangenendilemma überhaupt? Die Grundsituation ist die folgende: Zwei Gefangene werden verdächtigt zusammen eine Straftat begangen zu haben und werden zu dem Sachverhalt getrennt befragt.

Schweigen beide kommen sie wegen der Indizienbeweise für eine kurze Zeit ins Gefängnis. Verrät der eine Gefangene den anderen so geht dieser dank eines Handels straffrei aus. Der andere muss dafür aber für 5 Jahre ins hinter Gitter. Verraten sich die Spieler gegenseitig so müssen sie beide ins Gefängnis.

 

prisoners_matrix

Aber weil eine kleine Tabelle viel mehr sagt als eine Beschreibung oben die Tabelle aus der Wikipedia über Kosten/Nutzen bei den verschiedenen Verhaltensweisen. So weit so gut also. Der Trick bei der iterierten Variante des Gefangenendilemmas ist es, dass die Spieler eine vorher nicht bekannte Anzahl von Runden gegeneinander/miteinander spielen. Dies führt dazu, dass man verschiedene Theorien anwenden kann.

Simple Strategien sind zum Beispiel das naive “immer Kooperieren” oder das böse “immer verraten”. Eine der bekanntesten und gleichzeitig auch erfolgreichsten Strategien ist “Tit for Tat”. Diese beginnt im ersten Zug immer damit, dass sie mit dem Mitspieler kooperiert. In den folgenden Zügen ahmt sich das Verhalten des Gegenspielers aus der letzten Runde nach. Diese Strategie erspielt ein Maximum an Punkten wenn sie gegen kooperative Strategien oder sich selbst spielt. Und lässt sich gleichzeitig auch nicht ausbeuten wenn sie gegen bösartige Strategien spielt.  

Doch was hat das Ganze nun mit Evolutionsbiologie zu tun? Nun, man kann damit relativ simpel (und natürlich stark vereinfacht) simulieren wie kooperatives Verhalten entstehen kann und wie es sich in Populationen durchsetzt. In dem kleinen Skript, was wir in der Uni geschrieben haben, kann man die Startpopulationsgröße festlegen. Insgesamt spielen dann 6 verschiedene Strategien gegen zufällig ausgewählte andere Strategien (natürlich auch gegen sich selbst).

Wenn jeder Spieler gegen einen zufällig ausgewählten Spieler gespielt hat werden die Punkte für die einzelnen Strategien zusammengezählt und geschaut wie viele Punkte sie eingefahren haben. Die einzelnen Strategien verteilen sich dann nach Prozentpunkten anteilig auf die neue Generation. Besonders erfolgreiche Strategien stellen dann viele Individuen in der neuen Generation, besonders schlechte können auch ganz aussterben.

Wie das in der Ausgabe via gnuplot (ein Programm was ich überhaupt nicht empfehlen kann und dessen Dokumentation noch übler ist als unsere eigene) aussieht könnt ihr in dem Bildchen hier betrachten. Hier hat es Tit-For-Tat geschafft sämtliche andere Strategien auszurotten.

prisoners_gnu

Erstaunlicherweise tritt dieser Effekt aber nur auf, wenn die Anzahl der Spiele die einzelne Individuen spielen hoch genug ist. Spielen die Paare nur eine zufällige Anzahl von Spielen zwischen ein und zehn mal, dann setzen sich die bösen Strategien durch. Erst bei einer größeren Anzahl gewinnt Tit-For-Tat. Dies liegt daran, dass Tit-For-Tat als Strategie erst dann so viele Punkte einfahren kann wenn es ausreichend oft gegen sich selbst spielt um die einfachen “immer verraten”-Strategien zu überholen.

Oder übertragen auf das biologische Modell: Kooperatives Verhalten zahlt sich nur dann aus, wenn die Zeiträume der Interaktion ausreichend lang sind. Bei kurzfristiger Interaktion lohnt es sich hingegen die Kooperationspartner auszubeuten.

Und wenn jetzt noch jemand Lust hat die Strip-Variante in das Script mit einzubinden: Viel Spass. Und ich würde mich über Feedback freuen.

 

 

prisoners_code

*update*

Auf Wunsch in den Kommentaren sind hier auch die anderen Strategien aus dem Bildchen kurz erklärt:

  • Cooperative: Kooperiert immer, egal was der Gegner macht.
  • Defective: Verrät den Mitspieler immer, egal wie dieser sich verhält
  • Random: Kooperiert oder verrät zufällig, Chance je 50 %
  • Kind: Spielt immer folgende Sequenz: Kooperation, Kooperation, Verrat
  • Nasty: Spielt immer folgende Sequenz: Verrat, Verrat, Kooperation

Bilder: xkcd, Wikipedia, selfmade

Veröffentlicht von

Bastian hat seinen Bachelor in Biologie in nur 8 statt 6 Semestern abgeschlossen. Nach einem kurzen Informatik-Studiums-Intermezzo an der TU Dortmund hat es ihn eigentlich nur für ein Stipendium nach Frankfurt am Main verschlagen. Dort gestrandet studiert er dort nun im Master-Programm Ökologie und Evolution. Zumindest wenn er nicht gerade in die Lebensweise der Hessen eingeführt wird. Neben seinen Studiengebieten bloggt er über die Themen, die gerade in Paperform hochgespült werden und spannend klingen.

4 Kommentare

  1. Guter Post!

    Für graphische Ausgaben mit Python nehm ich selbst aber nur noch rpy (was richtig hübsch professionell aussieht, wenn mans mal raushat – prinzipiell eine Schnittstelle, die Ergebnisse mithilfe der Statistiksprache R visualisiert) oder, wenn man schnell mal nur den Verlauf einer Liste o.ä. sehen möchte, pylab.

    Aber wer R an sich kann ist noch mehr im Vorteil! Auch wenn das mit eine der hässlichsten Sprachen ist, mit der ich je gearbeitet hab – die umfangreichen Funktionen und Statistiktools lohnen die Mühe.

  2. sehr interessant! aber was ist mit den anderen strategien? ich nehme mal an, nasty ist “immer verraten” und kind “immer kooperieren”. aber welche strategien beschreiben die anderen begriffe? ich würde mich freuen, wenn das noch knapp hinzugefügt würde! lg

  3. Andere Strategien

    Danke für den Tipp Kris, ich habe die restlichen Strategien am Ende des Blogposts mal kurz eingefügt und erklärt. Ich hoffe das hilft zum Verständnis 🙂

  4. Gnuplotcode

    ich hab mal den gnuplot-teil dazugefügt; einfach reinkopieren
    gnuplot = open(“prisoners.txt”,”w”)
    gnucache = “”” set terminal png
    set output “50plays.png”
    set title ‘Gefangenendilemma’
    set yrange [0:”””+str(n_generation*6)+”””]
    set xrange [0:”””+str(t_generations)+”””]
    set xlabel ‘Runden’
    set ylabel ‘Population’
    plot “50plays.txt” using 1:2 title “Kooperativ” with lines, \
    “50plays.txt” using 1:3 title “Verrat” with lines, \
    “50plays.txt” using 1:4 title “Wie Du mir..” with lines, \
    “50plays.txt” using 1:5 title “Muster Gut” with lines, \
    “50plays.txt” using 1:6 title “Muster Boese” with lines, \
    “50plays.txt” using 1:7 title “Zufall” with lines”””
    gnuplot.write(gnucache)
    gnuplot.close()
    os.system(“gnuplot prisoners.txt”)
    os.system(“feh 50plays.png”)

Schreibe einen Kommentar