Michele Gandolfo Bruno Grimaldi Luca Barone

Simulation models for economics

Project work on

"ODD protocol on a closed world."

 

The applet requires Java 1.4.1 or higher. It will not run on Windows 95 or Mac OS 8 or 9. Mac users must have OS X 10.2.6 or higher and use a browser that supports Java 1.4. (Safari works, IE does not. Mac OS X comes with Safari. Open Safari and set it as your default web browser under Safari/Preferences/General.) On other operating systems, you may obtain the latest Java plugin from Sun's Java site.


An introduction to Spatial finiteness, epidemics and climate shocks using the ODD protocol.


powered by NetLogo

view/download model file: odd_protocol_on_a_closed_world.nlogo

WHAT IS IT?

Our simulation has the objective to test a lot of scenarios in a closed and simple society, by changing the main characteristics of the world. The important endogenous factor avoiding a predictable result is the emerging of epidemics. Such a world will be termed unstable if it tends to the collapse of the population. At the opposite, the system would be stable if it tends to maintain itself over time, despite fluctuations in population sizes.


HOW IT WORKS

Farmer-agents pursue their own aims: eating and reproducing. At the same time, increasing in number, they have to cope with the limitation of resources of the world even worsen by the correspondent increment in building of houses. Giving them the capability of seeing within a bigger radius helps them to better manage with the resources. The "TORNADO" button just delays the effects in progress.
There are no predetermed frameworks of evolution of the model, but you can try to firstly modify the most effective parameters such as: "vision-range", "vegetation regrowth time" and "energy from food" to see their different effects.


HOW TO USE IT

0. If you want, you can set default values by clicking the "setup-default-values" button.
1. Press the SETUP button.
2. Press the GO button to begin the simulation.
3. Look at the monitors to see the current population size, the number of farmers, the number of ill farmers, the number of houses to create and the current number of houses.
4. Look at he "WORLD" plot to watch how inhabitants, food, ill people and fluctuate over time.

Parameters:
- "lifespan": the maximum duration of a farmer's life
- "initial_number": the initial number of farmers
- "birth_probability": the probability that a new turtle is created from an inhabitant that has energy enough
- "vision-range": the capability of turtles to see within a certain radius
- "energy_from_food": the amount of energy turtles get for every green patch eaten
- "vegetation_regrowth_time": how long it takes for fruits and vegetables to regrow once they are eaten
- "num_of_doctors": the number of doctors
- "persons_per_house": persons that live in the same house
- "prob_of_sickness_when_malnourished": probability of getting ill when being malnourished
- "show-energy?": whether or not to show the energy of each farmer as a number.

Notes:
- one unit of energy is deducted for every step a farmer takes, but when it gets sick, five units are deducted
- every tick farmers become older of 0.15 of a year
- the "cost" of a birth is 30 energy points for the creating turtle.


THINGS TO NOTICE

The button "setup-default-variables" set all sliders and switches to the values we thought could have been quite normal in a Middle Age society.
The “TORNADO” button destroys a random portion of the world including houses, food and people. In detail, it is shaped as a quadrilateral with random length sides (between 5 and 20 patches).
The switch "show-energy?", when it is set on, highlights the energy level of each turtle.


THINGS TO TRY

Try adjusting the parameters under various settings. How sensitive is the stability of the model to the particular parameters?
Try to set the "num_of_doctors" equal to zero; the society will collapse because of the emergence of epidemics and the speed at which population becomes extinct.
Another important slider to change the evolution of the world is vision-range, that allows people to optimise the use of the present resources through the capability of having a look to far green patches.
Via the "birth_probability" slider, you can control the births of new farmers. In other words it's the probability for a turtle to create a new one when its energy is higher than 60.
Last, but not the least, try to move the "vegetation_regrowth_time" slider to modify the speed at which vegetation grows, it will surely have strong effects as far as the population is concerned.


EXTENDING THE MODEL

It would be interesting trying to add the difference of gender in the population and even in the doctors community so as to see how they manage with an eventual lack of males or females.
You could also try to make people to go from home to the food and then back without eating while walking.
Another very important tool to increase the possibility of surprises in the model would be the emerging of scientific innovations.


NETLOGO FEATURES

Note the use of breeds to model two different kinds of "turtles": people and doctors. Note the use of patches to model grass, eaten vegetation and houses.
Note the "TORNADO" procedure. Just to make its results as unpredictable as possible, we used a function to create every time random numbers in an interval. That is:
x = a + random (b - a) ; it yields x values >=a and <b.


RELATED MODELS

Look at Wolf Sheep predation and Virus from the Models library. They both cope with just one of the problems we present in our model: the former is about limited resources and the latter about virus spreading.


CREDITS AND REFERENCES

- Tainter, Joseph A. (1990). The Collapse of Complex Societies. Cambridge: Cambridge University Press. ISBN 0-521-38673-X.
- Diamond, Jared Mason. (2005) Collapse: How Societies Choose to Fail or Succeed. New York: Viking Books. ISBN 1-586-63863-7


PROCEDURES

globals [fruits_vegetables current-number-houses num-of-houses-to-create num-of-farmers]                            
breed [farmers person_farmer]
breed [doctors person_doctor]
farmers-own [energy age sick?]
doctors-own [energy age]
patches-own [countdown]

to setup
clear-all
setup-world
setup-farmers
setup-doctors
update-plot
end

to setup-default-values
  set lifespan 3000
  set initial_number 30
  set birth_probability 70
  set vision-range 2
  set energy_from_food 40
  set vegetation_regrowth_time 100
  set num_of_doctors 15
  set persons_per_house 10
  set prob_of_sickness_when_malnourished 30
  set show-energy? false
end

to go
  if not any? farmers [ stop ]
  ask farmers [
    move
    eat-fruits_vegetables
    get-sick
    infect
    reproduce-farmers
    create-houses
    aging
    death
  ]
  ask patches [ 
    grow-fruits_vegetables 
  ] 
  
  ask doctors [
    move-doctor
    cure
    eat-fruits_vegetables
  ]
  tick
  update-plot
  display-labels
end

to setup-farmers
  set-default-shape farmers "person_farmer"
  create-farmers initial_number [
                    set color black                     ;; create the inhabitants, then initialize their variables
                    set energy random (energy_from_food)
                    setxy random-xcor random-ycor
                    set age random lifespan
                    move
                    ]
end

to setup-doctors
  set-default-shape doctors "person_doctor"
  create-doctors num_of_doctors [set color white
                     setxy random-xcor random-ycor
                     set energy random (energy_from_food)
                     move-doctor]
end
  
to setup-world
  set-patch-size 14
  ask patches [set countdown random vegetation_regrowth_time] ;; initialize fruits and vegetables grow clocks randomly
  ask patches with [pxcor > -16 and pxcor < 16 and pycor < 16 and pycor > -16][set pcolor one-of [green brown]]
  ask patches with [pxcor = -16][set pcolor blue]
  ask patches with [pxcor > -16 and pycor > 15][set pcolor gray]
  ask patches with [pxcor = 16][set pcolor gray]
  ask patches with [pxcor > -16 and pycor < -15][set pcolor gray]
  set current-number-houses (initial_number / persons_per_house)
  ask n-of current-number-houses patches with [pcolor != blue and pcolor != gray][set pcolor red]
end

to create-houses
  set num-of-farmers (count farmers)
  set num-of-houses-to-create (num-of-farmers / persons_per_house - current-number-houses) 
  if num-of-houses-to-create > 1 [ask n-of num-of-houses-to-create patches with [pcolor != blue and pcolor != gray][set pcolor red]]
  set current-number-houses (count patches with [pcolor = red])
  energy-to-create-houses
end

to energy-to-create-houses
   if num-of-houses-to-create > 1 [
     ask n-of num-of-houses-to-create farmers [set energy energy - 10]
   ]
end

to move
  see
  let movement random-float 10  
  while [movement > 0]          
    [ifelse movement >= 1 
             [fd 1]
             [fd movement]
     if pcolor = blue or (pcolor = gray)
        [set heading heading + 180
          while [pcolor = blue or (pcolor = gray)] [fd 1]
          ]
     set movement movement - 1]
  ifelse sick? = false
      [ set energy energy - 1 ]
      [ set energy energy - 5 ]
end

to see
  let candidates patches in-radius vision-range with [ pcolor = green ]
  ifelse any? candidates
  [ face one-of candidates ]
  [ rt random 360 ]
end

to move-doctor
 let movement random-float 10  
  while [movement > 0]          
    [ifelse movement >= 1 
             [fd 1]
             [fd movement]
     if pcolor = blue or (pcolor = gray)
        [set heading heading + 180
          while [pcolor = blue or (pcolor = gray)] [fd 1]
          ]
     set movement movement - 1]
end

to eat-fruits_vegetables    ;; farmers eat fruits and vegetables, turn the patch brown
  if pcolor = green [
    set pcolor brown
    set energy energy + energy_from_food  ;; farmers gain energy by eating
  ]
end

to reproduce-farmers 
  ask farmers [
    if energy > 60 [
      if sick? = false [
        if random-float 100 < birth_probability [
           set energy energy - 30                               
           hatch 1 [                  ;; hatch an offspring and move it forward 1 step
               rt random-float 360 
               fd 1
               set age 0
              set energy 30]
        ]
      ]                  
    ]
  ]
  
end

to aging
  set age age + 0.15
end

to death
  if energy <= 0 [ die ]   ;; when energy dips below or equal zero, die
  if age > lifespan [die]  ;; when the age is greater than lifespan the turtle dies
end

to get-sick
  if energy <= 20 [ 
    if random 100 < prob_of_sickness_when_malnourished [ 
      set sick? true
      set color yellow ]
    ]
end

to infect
  if sick? = true
  [ask other farmers-here [if random-float 100 < 50 [be-sick]]]
end

to be-sick
   set sick? true
end

to cure
  let patient one-of farmers-here
  if patient != nobody
    [ask patient [be-sane]]
end

to be-sane
  set sick? false
  set color black
end

to grow-fruits_vegetables                  ;; patch procedure
  if pcolor != red [                       ;; countdown on brown patches: if reach 0, grow some fruits_vegetables
   if pcolor = brown [
    ifelse countdown <= 0
      [ set pcolor green
        set countdown vegetation_regrowth_time ]
      [ set countdown countdown - 1 ]
  ]]
end

to update-plot
  set-current-plot "World"
  set-current-plot-pen "Number of houses"
  plot count patches with [pcolor = red]
  set-current-plot-pen "Total number of people"
  plot count turtles
  set-current-plot-pen "Number of ill farmers"
  plot count farmers with [sick? = true]
  set-current-plot-pen "Food"
  plot count patches with [pcolor = green] 
end

to display-labels
  ask farmers [ set label "" ]
  if show-energy? [
    ask farmers [ set label round energy ] 
  ]
end

;;the tornado is going to destroy a random area in the world, 
;;moreover it is going to be shaped as a quadrilateral with random length sides (between 5 and 20 patches)
to tornado
  let area-tornado-x random-xcor      ;;generate a random number between -16 and 16, this number is going to be the lower left corner x coordinate of the tornado area
  let area-tornado-y random-ycor      ;;generate a random number between -16 and 16, this number is going to be the lower left corner y coordinate of the tornado area
  let width-tornado-x 10 + random 15  ;;in order to generate a random number >= a and < b we used the following formula x = a + random (b - a)
  let width-tornado-y 10 + random 15  ;;generate a random number between 10 and 25
  ask farmers with [pxcor > area-tornado-x and pxcor < (area-tornado-x + width-tornado-x) and pycor > area-tornado-y and pycor < (area-tornado-y + width-tornado-y)] [die]
  ask doctors with [pxcor > area-tornado-x and pxcor < (area-tornado-x + width-tornado-x) and pycor > area-tornado-y and pycor < (area-tornado-y + width-tornado-y)] [die]
  ask patches with [pcolor = green and pxcor > area-tornado-x and pxcor < (area-tornado-x + width-tornado-x) and pycor > area-tornado-y and pycor < (area-tornado-y + width-tornado-y)]
       [set pcolor brown]
  ask patches with [pcolor = red and pxcor > area-tornado-x and pxcor < (area-tornado-x + width-tornado-x) and pycor > area-tornado-y and pycor < (area-tornado-y + width-tornado-y)]
       [set pcolor brown]
end