BSc KICursus Natuur & Berekening 2025-26

Opdracht 2: de evolutie van samenwerking

Inleiding

In deze opdracht laat je individuen het prisoner's dilemma spelen. Als het prisoner's dilemma eenmalig wordt uitgevoerd, hebben beide spelers de neiging om te verzaken, terwijl ze beter af zouden zijn door samen te werken. Samenwerking (en dus een hogere opbrengst) kan ontstaan als partijen opereren in een sociale omgeving, en handelen op basis van eerdere interacties, en na interacties strategieën overnemen van meer succesvolle spelers uit hun omgeving.

Uitleg

TFT altijd D TFT
altijd D TFT altijd C
altijd C altijd D altijd D
Om samenwerking te bevorderen worden spelers op een, zeg, 100x100 rooster geplaatst. Elke speler bezet een vakje (“patch”) en bezit op elk moment een te spelen strategie (bv. altijd samenwerken, of altijd verzaken, of tit-for-tat, etc.). Voor een duur van een vooraf vastgesteld aantal ronden (dit noemen we een episode) speelt elke speler volgens zijn strategie afzonderlijk tegen elk van zijn acht buren. Neem aan dat de uitbetalingsmatrix gelijk is aan

C D
C  (3,3)(0,5)
D  (5,0)(1,1)
en neem aan dat de episode-lengte gelijk is aan 100. In de eerste ronde zal de middelste speler (met strategie TFT) C spelen tegen alle buren en 4x3=12 eenheden verdienen. (Ga na!) In elke volgende ronde zal de middelste speler C spelen tegen “altijd C” en “TFT”, en D spelen tegen alle permantente verzakers en dus elke ronde 4x3 + 4x1=16 eenheden verdienen. Na 100 ronden is er een gemiddelde opbrengst. Voor de middelste speler is dat
(1 ronde x 12 + 99 ronden x 16) / (8 buren x 100 ronden) = 1596/800 = 1,995.

Na elke episode vergelijkt elke speler zijn gemiddelde opbrengst met die van zijn buren, en adopteert de strategie van degene met de hoogste opbrengst. Als er meerdere spelers zijn met een hoogste opbrengst dan wordt de strategie willekeurig uit die spelers gekozen. Het is mogelijk dat de speler zelf de hoogste opbrengst genereert en daardoor niet van strategie veranderd. Ook is het mogelijk dat de speler zelf bij de groep met hoogste opbrengst hoort, dat de groep met hoogste opbrengst uit meer dan twee cellen bestaat, en dat de centrale speler de strategie van een andere cel adopteert. Dus een speler kan van strateige veranderen, zelfs als deze een hoogste opbrengst scoort.

De uitdaging is om te zien of spelers, die elk hun eigen plan volgen, desondanks evolueren naar samenwerking.

Mogelijke strategieën

  • Er zijn zeer veel strategieën denkbaar, varierend van eenvoudig (altijd samenwerken) tot complex (“speel C dan en slechts dan als ikzelf in de afgelopen 10 ronden C speelde en mijn buur in alle voorgaande ronden meer dan 70% C speelde, tenzij bla bla bla mits bla bla bla”).
  • Strategieën worden besproken op bijvoorbeeld p. 227 van Kendall, Yao en Chong, pp. 293-305 van Flake en het artikel van Singer-Clark.
  • Losse opmerkingen

  • Het model van deze opdracht is een verfijning van het model van Nowak en May (1992). In Nowak en May's model bezit iedere deelnemer een actie (C of D) in plaats van een strategie, en adopteert elke ronde (elke tijdseenheid) meteen de actie van de winnaar van alle acht buren en zichzelf. Zie het diagram hiernaast. Blauw: bleef C; rood: bleef D; groen: werd C; geel: werd D. I.t.t. het model van deze opdracht zijn er dus geen strategieën, geen episodes, en geen geschiedenissen. De Netlogo programma-bibliotheek bevat overigens een (op vier punten foute) implementatie van Nowak en May's model.
  • Het model van deze opdracht wordt ook beschreven in Flake, pp. 301-305. Flake's uitwerking is echter nodeloos inefficient: uitkomsten van episodes worden real-time berekend in plaats van dat ze worden opgezocht in een vooraf berekende score-tabel. Dat is vreemd, want in Section 17.5 verdedigt Flake wel degelijk een het gebruik van een vooraf berekende score-tabel. Maar dat is dan voor het niet-ruimtelijke model.
  • Randvoorwaarden

    Hier staat wat moet. Bij afwijking van randvoorwaarden worden punten in mindering gebracht. Er wordt een acht gescoord als volledig aan alle randvoorwaarden is voldaan.

    1. Kleuren. Om het nakijken te vergemakkelijken vragen we je om, als je één van de volgende strategieën gebruikt, ook de er bij vermelde kleurcode te gebruiken: always cooperate: green, always defect: red, play randomly: gray, unforgiving: 102, tit for tat: violet, pessimistic tit for tat (ook wel: suspicious tit for tat): magenta, forgiving tit for tat: 13, tit for two tats: 23, majority: pink, eatherly: blue, Joss 5%: orange, Pavlov: brown.
    2. Symmetrie. De dynamiek moet symmetrisch zijn. Dat wil zeggen dat de nieuwe strategie van patches niet mag afhangen van de volgorde waarin patches door Netlogo worden ge-update. Een kenmerk van symmetrie is het kunnen genereren van een zg. perzisch tapijt. In de sectie “Tips” wordt dit verder uitgelegd.
    3. Werking. Je implementatie moet tenminste de strategieën always-cooperate, always-defect, play-randomly, unforgiving, tit-for-tat en Pavlov incorporeren en de dynamiek moet vergelijkbaar zijn met de convergentie-tabellen.
    4. Veld-grootte. Uiteindelijk moet je veld 121x121 patches groot zijn. Dit is groot genoeg om grenseffecten te verwaarlozen en klein genoeg om de snelheid er nog een beetje in te houden. Uiteraard mag het veld tijdens het bouwen en testen van je app kleiner zijn.
    5. Grafiek. De proportie van een strategie is gelijk aan het aantal vakjes dat wordt ingenomen door deze strategie, gedeeld door het totaal aantal vakjes. Proporties van strategieën worden bijgehouden in een grafiek (plot).
    6. Ranglijst. Naast een grafiek dient er per tik een ranglijst te worden afgedrukt in een output widget waarbij de patch-frequentie van strategieën in afnemende volgorde wordt afgedrukt. Voorbeeld:
      4949 always-cooperate
      3525 eatherly
      3304 Pavlov
       996 forgiving-tit-for-tat
       611 unforgiving
       315 always-defect
       275 tit-for-tat
       271 tit-for-two-tats
        47 Joss-5%
        13 pessimistic-tit-for-tat
        
      De frequentie van verdwenen strategieën wordt niet afgedrukt. Links-padden met spaties (zoals hier) zou netjes zijn maar het hoeft niet.

    Extra

    Een perzisch tapijt met uitbetalingen reward, temptation, sucker en punishment resp. 1, 1.8, 0, en 0, en één patch op always-defect in een zee van always-cooperate.

    Extra punten kunnen worden verdiend door het aanbrengen van extra features. Het aantal extra punten hangt af van het gewicht van een feature en de implementatie-kwaliteit. Voorbeelden:

    1. Pit functionaliteit (+1) Zie elders in dit document, zoek op “tool” en “pit”.
    2. Stoppen bij convergentie (+1) Vergelijk nieuwe met oude proporites en stop als deze niet meer (te veel) van elkaar afwijken.
    3. Perzisch tapijt (+1) Genereer verschillende perzische tapijten door met geschikte strategieën en een geschikt startpatroon (en uiteraard zonder ruis) te beginnen. Zorg met een button voor de juiste startwaarden.
    4. Visualiseer payoffs (+1) Zie elders in dit document, zoek op “visualiseren van de payoffs”. Makkelijk te implementeren.
    5. Visualiseer dynamiek (+1) Houd per patch het meetkundig gemiddelde bij van de strategiewisselingen:
      strategiewisselingen = 0.95×strategiewisselingen + 0.05×δstrategie, vorige strategie
      waarbij δi,j de zg. Kronecker deltafunctie is. Kleur vervolgens de patch met scale-color. Makkelijk te implementeren.
    6. Visualiseer samenwerking (+2) Zie elders in dit document, zoek op “visualiseren van de graden van samenwerking ”. Moeilijker te implementeren.
    7. Exotische strategieën (+1) Bedenk of vind exotische strategieën. Bedenk of vind killer-strategieën. Elke extra strategie dient uitgebreid te worden gemotiveerd en beschreven in de documentatie-tab.
    8. Turtles in plaats van patches (+3) Maak van patches turtles en laat deze (langzaam!) bewegen naar de top-samenwerker in hun omgeving. Om bovenmatige clustering te voorkomen zou je ze eerst (of daarna) kunnen vragen af te bewegen van de top-defector.

    Tot zover de opdrachtbeschrijving. Hierna volgen wat tips, een samenvatting van nakijkmodel, wat referenties, een overzicht van wijzigingen, en helemaal onderaan snippets.

    Tips

    Killer-strategie

    1. Twee componenten. De app doet twee dingen na elkaar: eerst legt het éénmalig een score-tabel aan. Afhankelijk van het door jou gekozen aantal ronden en herstarts duurt dat een tijdje. Als de score-tabel eenmaal is aangemaakt kan de cellulaire automaat worden gestart, en desgewenst zelfs meerdere keren worden herstart: dat kost, als de score-tabel er eenmaal is, weinig tijd. Het programmeerwerk voor de scoretabel beslaat relatief veel van je tijd: ongeveer 60%. Het programmeerwerk voor de cellulaire automaat beslaat ongeveer 20% van je tijd. (Blijft 20% ander programmeerwerk over.)
    2. Check score-tabel. Check handmatig de score-tabel, en maak eventeel een routine om de score-tabel af te drukken.

      Zes strategieën, 20 ronden, 0% ruis, 1000 herstarts:
      always-cooperatealways-defectplay-randomlyunforgivingtit-for-tatPavlov
      always-cooperate301.52333
      always-defect512.991.21.23
      play-randomly40.52.250.852.332.35
      unforgiving30.952.84333
      tit-for-tat30.952.22333
      Pavlov30.52.22333

      Zes strategieën, 20 ronden, 5% ruis, 1000 herstarts:
      always-cooperatealways-defectplay-randomlyunforgivingtit-for-tatPavlov
      always-cooperate2.980.11.552.372.92.2
      always-defect4.841.072.981.271.343.01
      play-randomly3.910.62.250.942.332.34
      unforgiving3.351.022.822.332.412.9
      tit-for-tat3.0212.212.312.742.64
      Pavlov3.480.582.232.22.672.88

      Bij strategieën met een random component of bij runs met ruis kunnen tabel-waarden afwijken (rood). Door het relatief hoge aantal herstarts is de spreiding klein.

    3. Symmetrie. Om te controleren of je model symmetrisch is, kun je een zg. perzisch tapijt (complex symmetrisch patroon) genereren. Als dit lukt dan is dat een extreem sterke aanwijzing dat je model inderdaad symmetrisch is. (Het is geen voldoende voorwaarde!).
    4. Convergentie-tabellen. Om te controleren of je model plausibel gedrag vertoont kunnen convergentie-tabellen geraadpleegd worden.
    5. Strategie-combinaties. Bepaalde strategie-combinaties genereren een interessante dynamiek. Gebruik de convergentie-tabellen of een tool om interessante combinaties op te sporen.
    6. Tool voor strategie-combinaties. Creëer een mogelijkheid om met “één muisklik” een run te starten met N willekeurige strategieën, waarbij N vast gekozen is. Dus als je 12 verschillende strategieën hebt en N=3, dan is het mogelijk om snel achter elkaar runs te starten met 3 uit 12 strategieën. C(12, 3) is overigens gelijk aan 12!/(3!(12-3)!) = 220. Zie “Pit” elders in dit document.

    Nakijkmodel

    Het volgende nakijkmodel zal worden gebruikt.

       -----------------------------------
    
        1. nette en intuitieve GUI
        2. kleuren en veldgrootte kloppen
        3. documentatie (in code, in tab, *.png)
        4. code-organisatie
        5. efficiente code / snelle executie
        6. dynamiek is symmetrisch (i.e., patch-update dynamiek klopt) (*)
        7. juist gedrag always-C, always-D, random, unforgiving, TFT en Pavlov (**)
        8. grafiek en ranglijst van proporties
    
       (*) Controleer met eenvoudig Perzisch tapijt.
    
       (**) Dit vergt wat tijd om na te kijken.  Het werkt denk ik 't best als je, met het convergentiegedrag van deze zes strategieën in het achterhoofd, enkele steekproeven neemt met deelverzamelingen van { always-cooperate, always-defect, play-randomly, unforgiving, tit-for-tat en Pavlov }.  Als combinaties niet kloppen dan zie je dat snel genoeg.
    
       (***) Het ontbreken van een basis-feature kan niet worden gecompenseerd met een extra feature.  Een evt. 3e punt van extra feature 8 wordt naar het oordeel van de beoordelaar meegewogen in het totaalcijfer.
    
       ----- cijfer acht -----------------
    
        9. extra feature 1
       10. extra feature 2
    
       ----- cijfer tien -----------------
    

    Zie ook

    Wijzigingen

    Maandag 14 maart 2022
  • Opdracht geformuleerd.
  • Donderdag 07 april 2022
  • N.a.v. melding code snippet to normalize-strategy-ratios aangepast zodat deze ook werkt in NL6. Specifiek is run (word "set start-" ?1 " precision (start-" ?1 " / sum-of-strategies ) 2") veranderd naar run (word "set start-" ?1 " precision (start-" ?1 " / " sum-of-strategies " ) 2"). Dus sum-of-strategies evalueert in dit stukje nu mee.
    Maandag 18 april 2022
  • Typo c terug veranderd in normalize-strategy-ratios.
  • Snippets

    Hieronder volgen code snippets (codefragmenten). De snippets zijn facultatief. Het is niet verplicht ze te gebruiken, we hebben misschien zelfs liever dat je je eigen code schrijft. De snippets behoren niet tot de opdracht, en zijn zeker niet bedoeld als stappenplan. De snippets zijn meer bedoeld om je op weg te helpen mocht je vastlopen. De werking van de snippets is niet gegaranderd, en de practicumleiding is niet verplicht om er uitleg over te geven.

    1. Variabelen Het is handig de volgende globale variabelen te hebben: een lijst van twee lijsten genaamd payoff-matrix, een lijst van lijsten strategy-colors om een koppeling te maken tussen strategieën en kleuren, een lijst van strings strategies om strategie-namen in op te slaan, een lijst van kleurnamen colors om strategie-kleuren in op te slaan, een lijst van oplopende getallen indices 0, 1, 2, .. (die even lang is als de lijst van strategieën) om strategieën te kunnen indexeren, een lijst van lijsten (“matrix”) score-table om voor elk strategie-koppel gemiddelde payoffs in op te slaan. Verder is het handig de volgende patch variabelen te hebben: de patch set neighborhood om bij te houden welke patches de omgeving definiëren, een integer-variabele strategy om (een index van) de huidige strategie vast te houden, een numerieke variabele mean-total-payoff om de gemiddelde payoff over acht buren per episode bij te houden.
    2. Initialisatie Dit is wat achter de “setup” knop zit. Om te beginnen kan de uitbetalingsmatrix worden geïnitialiseerd:
        set payoff-matrix (list (list CC-payoff-reward     CD-payoff-sucker    )
                                (list DC-payoff-temptation DD-payoff-punishment))
      
      waarbij CC-payoff-reward etc. slider-variabelen zijn. Als acties (C of D) worden gerepresenteerd door bits (0 en 1, resp.), kan de uitbetaling van, bijvoorbeeld, CD worden gevonden door item 1 (item 0 payoff-matrix). Immers, C=0 en D=1.

      Strategieën kunnen worden gekoppeld aan kleuren d.m.v. een lijst van paren:
        set strategy-colors [
          ["always-cooperate"    green  ]
          ["always-defect"       red    ]
          ...
        ]
      
      Koppelen kan ook met een Netlogo tabel (ook wel: hash, of: associative array), maar dat zou overkill zijn. De strategieën en kleuren heb je namelijk apart nodig:
        set strategies    map [ [x] -> item 0 x ] strategy-colors ; strip strategies from strategy-colors
        set colors        map [ [x] -> item 1 x ] strategy-colors ; strip colors     from strategy-colors
      
      Het is handig strategieën rond te laten gaan als indices, omdat ze regelmatig gebruikt worden als indexen voor lijsten of tabellen:
        set indices       n-values length strategies [ [x] -> x ] ; 0, 1, .., n-1 where n is number of strategies
      
      Dus "always-cooperate" en "always-defect" zouden dan indices respectievelijk 0 en 1 hebben. Verder moeten patches 'weten' wat hun omgeving is, i.e., met welke andere patches ze hun score mogen vergelijken:
        ask patches [ set neighborhood (patch-set self neighbors) ] ; 8 neighbors and myself
        ask patches [ set neighborhood  patches in-radius 1.5     ] ; same effect!
      
      Initialisatie kan eindigen door twee hoofdroutines aan te roepen: één om een run te initialiseren, en één om de score-tabel te berekenen:
      initialise-run
      calculate-score-table
      
    3. Run initialiseren. Om een run te initialiseren is het eerst nodig eventuele output-widgets en plots te wissen, en de tick counter op nul te zetten (clear-output, clear-all-plots, reset-ticks. Doe dit niet met clear-all, omdat dan de inhoud van kostbare globale variabelen (zoals de score-tabel) ook gewist worden.
    4. Start-proporties. De gebruiker kan start-proporties opgeven, bijvoorbeeld met behulp van sliders start-always-cooperate, start-always-defect, etc. Voordat je het veld vult met strategieën is het netjes om te controleren of de startproporties wel sommeren tot 1. Als de start-proporties niet sommeren tot 1 is het nodig de start-proporties te normaliseren:
      ; this routine ensures that start-ratio's sum to one
      ; it requires start- sliders for all strategies, otherwise this routine won't work
      to normalize-strategy-ratios
        let sum-of-strategies sum map [ [s] -> run-result (word "start-" s) ] strategies
        if abs(sum-of-strategies - 1) <= 0.01 [ stop ] ; already normalized
        foreach strategies [ [?1] ->
          run (word "set start-" ?1 " precision (start-" ?1 " / " sum-of-strategies " ) 2")
        ]
      end
      
    5. Cellen initialiseren. Bij het initialiseren van een run worden cellen gevuld met strategieën, op zo'n manier dat de door de gebruiker opgegeven start-proporties worden gerespecteerd. Een eenvoudige manier om dat te doen is door een tijdelijke strategie-poel aan te leggen. Bijvoorbeeld, als er drie strategieeen A, B, en C zijn met indices 0, 1 en 2, en start-proporties 2/5, 1/5, en 2/5, dan zou een strategie-poel ter grootte 10 er als volgt uit kunnen zien:
      [0, 0, 0, 0, 1, 1, 2, 2, 2, 2].
      Een poelgrootte van 10 is voldoende om proporties met een nauwkeurigheid van (ongeveer!) 1/10 te representeren. Maar 10 is wel een beetje krap. Netlogo heeft genoeg geheugen om tijdelijk grote strategie-poelen aan te maken
      to-report rijtje [ x n ] ; e.g., rijtje 7 5 yields [7 7 7 7 7]
        report n-values n [ x ]
      end
      
      ; strategy pool is a list of strategies where the multiplicity of every strategy is in accordance
      ; with its start ratio; this makes for a cheap and well-known way to pick elements proportionally
      
      let strategy-bag map [ [i] -> rijtje i (1000 * run-result (word "start-" item i strategies)) ] indices
      ; strategy-bag now looks like [[0 0 0 ...] [1 1 ...] [2 2 2 2 2 ...] ...]
      ; the length of each sub-list corresponds to the start-proportion of that strategy
      
      let strategy-pool reduce [ [x y] -> sentence x y ] strategy-bag
      ; strategy-pool now looks like [0 0 0 ... 1 1 ... 2 2 2 2 2 ... ...]
      ; and contains about 1000 indices
      
      ask patches [
       set strategy one-of strategy-pool  ; "strategy" is a natural number; "one-of" is a Netlogo primitive
       set pcolor item strategy colors    ; give patch the color of the strategy it it assigned to
      ]
      
    6. Grafiek. Bij het initialiseren van een run is het handig plot-pennen dynamisch te creëeren:
        foreach indices [ [i] ->
          create-temporary-plot-pen item i strategies
          set-plot-pen-color item i colors
        ]
      
    7. Score-tabel. Het is onverstandig episodes real-time te simuleren: dit kost erg veel tijd en het is niet nodig. Immers, als we weten dat strategie A het 100 ronden lang opneemt tegen strategie B, dan zijn de opbrengsten voor A en B altijd hetzelfde en kunnen we dat treffen eenmalig simuleren en in een tabel stoppen. Voor alle volgende treffens tussen A en B kan vervolgens de tabel worden geraadpleegd. Als er, zeg 5, strategieën zijn, is de score-tabel 5x5 groot. Het nut van een vooraf berekende score-tabel wordt ook besproken in TCBoN, vanaf de laatste alinea op blz. 297.

      Een score-tabel bestaat uit een lijst van lijsten. Elke lijst geeft de scores voor één strategie t.o.v. alle andere strategieën:
      set score-table map [ [s] -> score-row-for s ] strategies
      
      Een score-rij voor strategie s bestaat uit “score entries”.
      to-report score-row-for [ s1 ]
        report map [ [s2] -> score-entry-for s1 s2 ] strategies
      end
      
    8. Score entry. De opdracht vraagt dat er een mogelijkheid bestaat om met p% ruis te spelen. Een gevolg is dat opbrengsten tussen dezelfde strategieën in verschillende episodes van elkaar kunnen verschillen. Om die variatie te reduceren is het verstandig om voor elk strategie-paar meerdere, zeg 25, episoden te generen om dan vervolgens de gemiddelde opbrengst voor dat strategie-paar op te slaan in de score-tabel. Het aantal episoden wordt bepaald door de waarde van de variabele restarts:
      to-report score-entry-for [ s1 s2 ]
        report mean n-values restarts [ score-for s1 s2 ]
      end
      
    9. Het berekenen van de score De score voor strategie s1 t.o.v. strategie s2 moet iteratief worden berekend, omdat geschiedenissen van acties worden bijgehouden:
      to-report score-for [ s1 s2 ]
        let my-history       []
        let your-history     []
        let my-total-payoff  0
        repeat rounds [
          let my-action        play s1 my-history your-history
          let your-action      play s2 your-history my-history
          let my-payoff        item your-action (item my-action payoff-matrix)
          set my-total-payoff  my-total-payoff + my-payoff
          set my-history       fput my-action   my-history   ; most recent actions go first
          set your-history     fput your-action your-history
        ]
        report my-total-payoff
      end
      
      Soms wordt er “per vergissing” een willekeurige actie gespeeld:
      to-report play [ some-strategy my-history your-history ]
        report ifelse-value (random-float 1.0 < ruis) [
          random-action ] [ runresult (word some-strategy " my-history your-history") ]
      end
      
      Als some-strategy = "always-cooperate" dan zal (word some-strategy " my-history your-history") evalueren naar de string "always-cooperate my-history your-history". Als deze string vervolgens wordt ge-evalueerd met run-result, levert deze een actie (0 of 1) op, mits de functie always-cooperate is gedefinieerd:
      to-report always-cooperate [ my-history your-history ]
        report 0
      end
      
      In dit geval is de te nemen actie altijd 0 (= cooperate) en wordt de inhoud van de geschiedenissen duidelijk niet gebruikt om de te nemen actie te bepalen.
    10. Hoofdlus. Main loop:
      to go
        ask patches [
          ; determine mean payoff over eight neighbors by asking them to look up in the global
          ; score-table to see what YOU (proponent patch) would earn by playing against them
          set mean-total-payoff ; a patch variable
            mean [
              item strategy item ([ strategy ] of myself) score-table
            ] of neighbors
        ]
        ask patches [
          ; let winner be one of patches in neighborhood with highest mean total payoff
          ; set strategy to strategy of winner; color with new strategy
          ; ...
        ]
        tick
        do-plots ; it is customary to plot /after/ ticks
      end
      
    11. Plots
      to do-plots
        let frequencies map [ [i] -> count patches with [ strategy = i ] ] indices
        set proportions map [ [i] -> i / count patches ] frequencies ; that's ok: count patches is an inexpensive operation
        let filtered-indices filter [ [i] -> item i frequencies > 0 ] indices ; filter dissapeared strategies
        let indices-sorted-by-proportion sort-by [ [f1 f2] -> item f1 frequencies > item f2 frequencies ] filtered-indices
        ; clear output widget and print new ranking
        ; plot strategy proportions
      end
      
    12. Voorbeeld-interface

    Toelichting: setup doet de initialisatie en roept initialise-run en calculate-score-table aan (om resp. een run te initialiseren, en om de score-tabel te berekenen). Met de knoppen reset resp. recalc is het mogelijk deze twee routines afzonderlijk aan te roepen. (Dus met reset wordt het veld opnieuw gevuld volgens de start-proporties, zonder dat de score-tabel wordt herberekend.) Het herberekenen van de score-tabel is uiteraard wel nodig als één van de waarden van restarts, rounds, of ruis wijzigt.
    Als pit aan staat, dan worden bij elke initialisatie van een run de start-proporties van N willekeurige strategieën op 1/N gezet, en de rest op 0, waarbij N = strategies-to-pit.
    Het canvas toont de kleuren van de strategieën. In de bovenstaande uitwerking is het ook mogelijk om, meteen of gedurende een run, gradaties van samenwerking per patch of de payoffs per patch te visualiseren. Daarvoor dienen de onderste drie knoppen. De gradatie van samenwerking is een getal tussen de 0 en 1 dat aangeeft hoe vaak een strategie tijdens een episode gemiddeld genomen heeft samengewerkt t.o.v. de acht opponenten (0 = nooit; 1 = altijd). Het visualiseren van de payoffs is makkelijk te implementeren, immers deze waarden zijn al beschikbaar. Het visualiseren van de graden van samenwerking is moeilijker te implementeren. Zg. samenwerkings-ratio's (graad van samenwerking gedurende één episode t.o.v. één opponent) moeten tijdens het berekenen van de score-tabel immers al worden opgeslagen. Entries in de score-tabel bestaan dan niet meer uit enkelvoudige scores, maar uit data-structuren (bv. lijsten) met daarin de score en de samenwerkings-ratio over een x-aantal ronden. Een gevolg is dat de functie score-entry-for ingewikkelder wordt.
    Strategieën, gemiddelde samenwerking (wit is hoog), en gemiddelde uitbetalingen (wit is hoog) in tik 57 van een run met 6743 unforgiving, 5511 always-cooperate, 2496 always-defect, en 2411 forgiving-tit-for-tat.


    *Naast de algemene randvoorwaarden voor de programmeeropdrachten en de algemene randvoorwaarden voor de programmeeropdrachten die specifiek in Netlogo worden uitgevoerd. Zie de pagina met clausules.


    Laatst gewijzigd op woensdag 13 november 2024, om 15:02 uur Auteur(s): Gerard Vreeswijk Translate to en, ru, or tr