This page was automatically generated by NetLogo 5.0beta2. Questions, problems? Contact feedback@ccl.northwestern.edu.
The applet requires Java 5 or higher. Java must be enabled in your browser settings. Mac users must have Mac OS X 10.4 or higher. Windows and Linux users may obtain the latest Java from Sun's Java site. If the display appear cut off with Firefox, then try another browser (Safari works).
powered by NetLogo
view/download model file: SIPD-async.nlogo
This model simulates the Iterated Prisoner’s Dilemma (IPD) in a spatial environment in which agents can adopt the best strategy of their neighbors. The agents obey one of five different strategies: All-C (always cooperate), All-D (always defect), TFT (Tit-for-tat, i.e., act the same way your opponent acted last time), Pavlov (win-stay, lose-shift, i.e., reverse your strategy when your opponent defects), and Rand (randomly cooperate or defect). TFT and Pav always begin by cooperating. In addition, there can be noise in the environment, which may cause an agent to behave oppositely to what it intended.
The reward for various combinations of cooperation and defection are determined by a payoff matrix.
After a specified number of rounds, an agent adopts the strategy of its most succesful neighbor, unless they all did worse than the agent, in which case it keeps its current strategy. If the mutation rate is non-zero, then an agent may adopt a random strategy.
Each patch corresponds to an agent which interacts with its neighbors for a specified number of rounds. At the end of this number of rounds (called a “generation”), the agent assesses its performance. If it has done at least as well as its neighbors, it keeps its current strategy, otherwise it adopts the strategy of its best performing neighbor. However, if the mutation probability is nonzero, it adopts a random strategy at the end of the generation.
SETUP is used to initialize a new simulation.
GO FOR… runs for a specified number of generations
GO runs when clicked, stops when unclicked.
ROUNDS determines the number of rounds of interaction (or game
play) per generation.
The second group of sliders controls the payoff matrix (CC-R, CD-S, DC-T, DD-P). You will not need to change them for this project unless you want to investigate effects of the payoff matrix. For example DC-T is your reward when you defect but your opponent cooperates (the “Temptation”).
The next group of sliders controls the initial populations of the five strategies (N-All-C, N-All-D, N-TFT, N-Pav, N-RAN). Only the relative values of these quantities matter, and they are used to probabilistically initialize the starting population.
RANCOOP controls the Rand strategy’s probability of
cooperating.
NOISE controls the probability that in a given interaction a cell
will act randomly rather than in accord with its strategy.
MUTATION controls the probability that a new agent will adopt a
random strategy, rather than the best strategy of itself and its
neighbors.
INSERT-STRATEGY allows you to select the strategy to be inserted.
TOGGLE INSERT allows you to use the mouse to paint the chosen
strategy anywhere in the space. Click to paint.
The current generation number and the populations of the different strategies are shown by the six monitors. Note that the total population (number of cells) is 2500.
METRIC controls the plot, either the size of the subpopulations or their running average scores.
Watch for the formation of clusters of homogeneous strategies, which then spread.
This section could give some ideas of things for the user to try to do (move sliders, switches, etc.) with the model.
Try different neighborhood relations.
This section could point out any especially interesting or unusual features of NetLogo that the model makes use of, particularly in the Procedures tab. It might also point out places where workarounds were needed because of missing features.
This model is an extension and reimplementation in NetLogo of the sipd program described in ch. 17 of Gary William Flake’s “Computational Beauty of Nature” (MIT Press, 1998).
To refer to this model in academic publications, please use: MacLennan, B.J. (2007). NetLogo Spatial Iterated Prisoner’s Dilemma (SIPD) model. http://www.cs.utk.edu/~mclennan. Dept. of Electrical Engineering & Computer Science, Univ. of Tennessee, Knoxville.
In other publications, please use: Copyright 2007, 2012 Bruce MacLennan. All rights reserved. See http://web.eecs.utk.edu/~mclennan/420/NetLogo/SIPD-async-alter.html for terms of use.
globals [ All-D-color All-C-color TFT-color Rand-color Pav-color color-list pen-names num-strategies gen pop rel-nbrs inserting pops ] patches-own [ age strategy score previous-cooperations plan-coop? ] to startup set All-D-color red set All-C-color black set TFT-color green set Rand-color blue set Pav-color violet set color-list (list All-D-color All-C-color TFT-color Rand-color Pav-color) set pen-names ["All-D" "All-C" "TFT" "Rand" "Pav"] set num-strategies 5 set rel-nbrs [[0 1] [1 1] [1 0] [1 -1] [0 -1] [-1 -1] [-1 0] [-1 1]] end to setup ca startup set pop N-All-D + N-All-C + N-TFT + N-Ran + N-Pav set pops map [? / pop] (list N-All-D N-All-C N-TFT N-Ran N-Pav) ask patches [ initialize-patch ] set gen 0 reset-ticks do-plots end to initialize-patch let choice random pop ifelse choice < N-All-D [ init-patch-strategy 0 ] [ ifelse choice < (N-All-D + N-All-C) [ init-patch-strategy 1 ] [ ifelse choice < (N-All-D + N-All-C + N-TFT) [ init-patch-strategy 2 ] [ ifelse choice < (N-All-D + N-All-C + N-TFT + N-Ran) [ init-patch-strategy 3 ] [ init-patch-strategy 4 ]]]] set age random rounds end to init-patch-strategy [strat] ifelse strat = 0 [ initialize-All-D ] [ ifelse strat = 1 [ initialize-All-C ] [ ifelse strat = 2 [ initialize-TFT ] [ ifelse strat = 3 [ initialize-Rand ] [ initialize-Pav ]]]] set pcolor item strategy color-list set score 0 set previous-cooperations n-values 8 [true] end to initialize-All-D set strategy 0 set plan-coop? n-values 8 [false] end to initialize-All-C set strategy 1 set plan-coop? n-values 8 [true] end to initialize-TFT set strategy 2 set plan-coop? n-values 8 [true] end to initialize-Rand set strategy 3 set plan-coop? n-values 8 [ (random-float 1 < RANcoop) ] end to initialize-Pav set strategy 4 set plan-coop? n-values 8 [true] end to go repeat rounds [ do-one-round ] set gen gen + 1 do-plots end to do-one-round ask patches [ plan-act-with-all-neighbors ] ask patches [ do-act-with-all-neighbors ] end to plan-act-with-all-neighbors (foreach n-values 8 [?] previous-cooperations [ plan-act-with-one-neighbor ?1 ?2 ]) end to plan-act-with-one-neighbor [nbr prev-coop?] ifelse strategy = 0 [ All-D-interact nbr prev-coop? ] [ ifelse strategy = 1 [ All-C-interact nbr prev-coop? ] [ ifelse strategy = 2 [ TFT-interact nbr prev-coop? ] [ ifelse strategy = 3 [ Rand-interact nbr prev-coop? ] [ Pav-interact nbr prev-coop? ]]]] if noise > 0 [ if random-float 100 < noise [ set plan-coop? replace-item nbr plan-coop? not (item nbr plan-coop?) ]] end to All-D-interact [nbr prev-coop?] set plan-coop? replace-item nbr plan-coop? false end to All-C-interact [nbr prev-coop?] set plan-coop? replace-item nbr plan-coop? true end to TFT-interact [nbr prev-coop?] ifelse prev-coop? [ set plan-coop? replace-item nbr plan-coop? true ] [ set plan-coop? replace-item nbr plan-coop? false ] end to Rand-interact [nbr prev-coop?] set plan-coop? replace-item nbr plan-coop? (random-float 1 < RANcoop) end to Pav-interact [nbr prev-coop?] if not prev-coop? [ set plan-coop? replace-item nbr plan-coop? not (item nbr plan-coop?) ] end to do-act-with-all-neighbors (foreach n-values 8 [?] plan-coop? [ let ndx item 0 (item ?1 rel-nbrs) let ndy item 1 (item ?1 rel-nbrs) let rev-index position (list (- ndx) (- ndy)) rel-nbrs do-act-with-one-neighbor ?1 ?2 [item rev-index plan-coop?] of patch-at ndx ndy ]) set age age + 1 if age > rounds [ evolve ] end to do-act-with-one-neighbor [nbr coop? nbr-coop?] ifelse strategy = 0 [ All-D-act nbr coop? nbr-coop? ] [ ifelse strategy = 1 [ All-C-act nbr coop? nbr-coop? ] [ ifelse strategy = 2 [ TFT-act nbr coop? nbr-coop? ] [ ifelse strategy = 3 [ Rand-act nbr coop? nbr-coop? ] [ Pav-act nbr coop? nbr-coop? ]]]] end to All-D-act [nbr coop? nbr-coop?] ifelse nbr-coop? [ set score score + DC-T ] [ set score score + DD-P ] end to All-C-act [nbr coop? nbr-coop?] ifelse nbr-coop? [ set score score + CC-R ] [ set score score + CD-S ] end to TFT-act [nbr coop? nbr-coop?] ifelse coop? [ ifelse nbr-coop? [ set score score + CC-R set previous-cooperations replace-item nbr previous-cooperations true ] [ set score score + CD-S set previous-cooperations replace-item nbr previous-cooperations false ]] [ ifelse nbr-coop? [ set score score + DC-T set previous-cooperations replace-item nbr previous-cooperations true ] [ set score score + DD-P set previous-cooperations replace-item nbr previous-cooperations false ]] end to Rand-act [nbr coop? nbr-coop?] ifelse coop? [ ifelse nbr-coop? [ set score score + CC-R ] [ set score score + CD-S ] ] [ ifelse nbr-coop? [ set score score + DC-T ] [ set score score + DD-P ] ] end to Pav-act [nbr coop? nbr-coop?] ifelse coop? [ ifelse nbr-coop? [ set score score + CC-R set previous-cooperations replace-item nbr previous-cooperations true ] [ set score score + CD-S set previous-cooperations replace-item nbr previous-cooperations false ] ] [ ifelse nbr-coop? [ set score score + DC-T set previous-cooperations replace-item nbr previous-cooperations true ] [ set score score + DD-P set previous-cooperations replace-item nbr previous-cooperations false ] ] end to evolve ifelse mutation > 0 and random-float 1 < mutation [ set strategy random num-strategies ][ let best-nbr one-of (neighbors with-max [score]) if score < [score] of best-nbr [ set strategy [strategy] of best-nbr set pcolor item strategy color-list ] ] set previous-cooperations n-values 8 [true] set score 0 set age 0 end to do-plots set pops map [count patches with [strategy = ?]] n-values num-strategies [?] ifelse metric = "population" [ set-plot-y-range 0 world-width * world-height foreach n-values num-strategies [?] [ set-current-plot-pen item ? pen-names plot item ? pops ] ][ set-plot-y-range 0 max (list CC-R CD-S DC-T DD-P) foreach n-values num-strategies [?] [ set-current-plot-pen item ? pen-names plot (mean lput 0 [score] of patches with [strategy = ?]) / (rounds * 8) ] ] end to deposit-agents if mouse-down? [ask patches [if ((abs (pxcor - mouse-xcor)) < 0.5) and ((abs (pycor - mouse-ycor)) < 0.5) [ init-patch-strategy position insert-strategy ["All-D" "All-C" "TFT" "Rand" "Pav"] set age rounds ] ]] set pops map [count patches with [strategy = ?]] n-values num-strategies [?] end