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 Oracle's Java site.
powered by NetLogo
view/download model file: tragedy_of_commons.nlogo
The model represents two fields in 19th’s century England, before the industrial revolution. Three sheep farmers [A, B, C] pastures their animals [blue, gray, red]. Each of them wants to put the most of sheep as possible. They (in the model) start placing a fixed number of animals, sharing them out between the two fields. Sheep can reproduce, eat grass and die (if they don’t find enough grass).
When a farmer become “important” enough (i.e. he has much more sheep than any other farmer) he can enclose the field and chase away sheep that he does not own.
SPLITTING: You can share sheep of a farmer between the two fields.
REPRODUCTION SHEEP: It is the probability of a sheep reproducing at each time step (only in INTERACTION_OFF - read on)
GROWTH GRASS FIELD: How long it takes for grass to regrow once it is eaten.
INTERACTION —
Off: Sheep reproduce independently of other animals;
On: We suppose the sheep be very, very, prolific. The farmer can place in the field only few animals, according to the percentage of sheep he has and his ARROGANCE.
ACTIVE SIMULATION —
Off: Model go on as long as you want.
On: When the percentage of sheep of a farmer reach the QUOTA FOR APPROPRIATION, he encloses the field. The sheep of another color go in the adjoining field or die.
The model starts with a fixed number of sheep, shared between two fields. At each tick sheep wander randomly, using their energy. If a sheep arrives on a “patch of grass” it eats and increases its energy. If the energy is 0, the sheep dies. If INTERACTION is OFF, sheep can reproduce according to the growth-tax REPRODUCTION SHEEP. If INTERACTION in ON, sheep “born” when they have a place in the field.
The formula used in INTERACTION_ON is:
Probability of maintaining a sheep = ARROGANCE * no. of sheep / total amount of sheep
NOTE: When the probability is >1 (considering that it does not exist) in the model it is actually 1.
Julia Schindler (2012)
Rethinking the Tragedy of the Commons: The Integration of Socio-Psychological Dispositions
Journal of Artificial Societies and Social Simulation 15 (1) 4
http://jasss.soc.surrey.ac.uk/15/1/4.html
breed [a1]
breed [a2]
breed [b1]
breed [b2]
breed [c1]
breed [c2]
globals [ po1 po2 ]
;; -_-_-_-_-_-_-_-_-_-_-_-_-_- SETUP -_-_-_-_-_-_-_-_-_-_-_-_-_-
to Setup
clear-all
initial
setup-patches
setup-turtles
reset-ticks
ask patches with [ pxcor = 0 ][ set pcolor yellow]
end
to setup-patches
ask patches [ set pcolor green ]
end
to initial
set po1 1
set po2 1
end
to setup-turtles
create-a1 Splitting_A [ set shape "sheep" set color blue ]
ask a1 [ setxy random-xcor random-ycor
if xcor > 0 [ set xcor xcor - max-pxcor ]
if int(xcor) = 0 [ set xcor -1 ] ]
create-a2 (Ewes_A - Splitting_A) [ set shape "sheep" set color blue ]
ask a2 [ setxy random-xcor random-ycor
if xcor < 0 [ set xcor xcor + max-pxcor ]
if int(xcor) = 0 [ set xcor 1 ] ]
create-b1 Splitting_B [ set shape "sheep" set color grey ]
ask b1 [ setxy random-xcor random-ycor
if xcor > 0 [ set xcor xcor - max-pxcor ]
if int(xcor) = 0 [ set xcor -1 ] ]
create-b2 (Ewes_B - Splitting_B) [ set shape "sheep" set color grey ]
ask b2 [ setxy random-xcor random-ycor
if xcor < 0 [ set xcor xcor + max-pxcor ]
if int(xcor) = 0 [ set xcor 1 ] ]
create-c1 Splitting_C [ set shape "sheep" set color red ]
ask c1 [ setxy random-xcor random-ycor
if xcor > 0 [ set xcor xcor - max-pxcor ]
if int(xcor) = 0 [ set xcor -1 ] ]
create-c2 (Ewes_C - Splitting_C) [ set shape "sheep" set color red ]
ask c2 [ setxy random-xcor random-ycor
if xcor < 0 [ set xcor xcor + max-pxcor ]
if int(xcor) = 0 [ set xcor 1 ] ]
end
;; _-_-_-_-_-_-_-_-_-_-_-_- END SETUP -_-_-_-_-_-_-_-_-_-_-_-_
turtles-own[energy]
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_- GO -_-_-_-_-_-_-_-_-_-_-_-_-_-_
to go
move-turtles
eat-grass
reproduce
check-death
regrow-grass
tick
end
to move-turtles
ask turtles [
right random 360
forward 1
set energy energy - 1
]
ask a1 [ if xcor >= 0 [ set xcor (xcor - max-pxcor)]]
ask a2 [ if xcor <= 0 [ set xcor (xcor + max-pxcor)]]
ask b1 [ if xcor >= 0 [ set xcor (xcor - max-pxcor)]]
ask b2 [ if xcor <= 0 [ set xcor (xcor + max-pxcor)]]
ask c1 [ if xcor >= 0 [ set xcor (xcor - max-pxcor)]]
ask c2 [ if xcor <= 0 [ set xcor (xcor + max-pxcor)]]
end
to eat-grass
ask turtles [
if pcolor = green [
set pcolor lime - 3
set energy energy + 10
]
]
if Active_simulation [
if po1 = 1
[ if ( count a1 / (count a1 + count b1 + count c1 ) ) * 100 >= Quota_for_appropriation [
if po2 = 1 [
create-b2 (count b1) [ set shape "sheep" set color grey ]
create-c2 (count c1) [ set shape "sheep" set color red ]
]
ask b1 [die]
ask c1 [die]
output-print "A encloses field 1!"
set po1 0
]
if ( count b1 / (count a1 + count b1 + count c1 ) ) * 100 >= Quota_for_appropriation [
if po2 = 1 [
create-a2 (count a1) [ set shape "sheep" set color blue ]
create-c2 (count c1) [ set shape "sheep" set color red ]
]
ask a1 [die]
ask c1 [die]
output-print "B encloses field 1!"
set po1 0
]
if ( count c1 / (count a1 + count b1 + count c1 ) ) * 100 >= Quota_for_appropriation [
if po2 = 1 [
create-b2 (count b1) [ set shape "sheep" set color grey ]
create-a2 (count a1) [ set shape "sheep" set color blue ]
]
ask b1 [die]
ask a1 [die]
output-print "C encloses field 1!"
set po1 0
]
]
if po2 = 1 [
if ( count a2 / (count a2 + count b2 + count c2 ) ) * 100 >= Quota_for_appropriation [
if po1 = 1 [
create-b1 (count b2) [ set shape "sheep" set color grey ]
create-c1 (count c2) [ set shape "sheep" set color red ]
]
ask b2 [die]
ask c2 [die]
output-print "A encloses field 2!"
set po2 0
]
if ( count b2 / (count a2 + count b2 + count c2 ) ) * 100 >= Quota_for_appropriation [
if po1 = 1 [
create-a1 (count a2) [ set shape "sheep" set color blue ]
create-c1 (count c2) [ set shape "sheep" set color red ]
]
ask a2 [die]
ask c2 [die]
output-print "B encloses field 2!"
set po2 0
]
if ( count c2 / (count a2 + count b2 + count c2 ) ) * 100 >= Quota_for_appropriation [
if po1 = 1 [
create-b1 (count b2) [ set shape "sheep" set color grey ]
create-a1 (count a2) [ set shape "sheep" set color red ]
]
ask b2 [die]
ask a2 [die]
output-print "C encloses field 2!"
set po2 0
]
]
]
end
to reproduce
ifelse Interaction [
ask a1 [
if energy > 50 [
if random-float 1 < ( Arrogance_A * ( count a1 / (count a1 + count b1 + count c1 ) ) ) [
hatch 1 [ set energy 50 ]
set energy energy - 50
]
]
]
ask a2 [
if energy > 50 [
if random-float 1 < ( Arrogance_A * (count a2 / (count a2 + count b2 + count c2 ) ) ) [
hatch 1 [ set energy 50 ]
set energy energy - 50
]
]
]
ask b1 [
if energy > 50 [
if random-float 1 < ( Arrogance_B * ( count b1 / (count a1 + count b1 + count c1 ) ) ) [
hatch 1 [ set energy 50 ]
set energy energy - 50
]
]
]
ask b2 [
if energy > 50 [
if random-float 1 < ( Arrogance_B * (count b2 / (count a2 + count b2 + count c2 ) ) ) [
hatch 1 [ set energy 50 ]
set energy energy - 50
]
]
]
ask c1 [
if energy > 50 [
if random-float 1 < ( Arrogance_C * ( count c1 / (count a1 + count b1 + count c1 ) ) ) [
hatch 1 [ set energy 50 ]
set energy energy - 50
]
]
]
ask c2 [
if energy > 50 [
if random-float 1 < ( Arrogance_C * (count c2 / (count a2 + count b2 + count c2 ) ) ) [
hatch 1 [ set energy 50 ]
set energy energy - 50
]
]
]
]
[
ask turtles [
if random 100 < Reproduction_sheep [
hatch 1 [ set energy 50 ]
set energy energy - 50
]
]
]
end
to check-death
ask turtles [
if energy <= 0 [ die ]
]
end
to regrow-grass
ask patches [
if pxcor < 0 [
if random 100 < Growth_grass_field_1 [ set pcolor green ]
]
if pxcor > 0 [
if random 100 < Growth_grass_field_2 [set pcolor green ]
]
]
end