Matteo Kersbamer Luca Piero Aldo Rosazza Gat Silvia Casale

Simulation models for economics

Project work on

"Running corruption."

 

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.


Here you can find an introduction to the Running corruption application.


powered by NetLogo

view/download model file: running_corruption.nlogo

WHAT IS IT?

The project “Running corruption” models the behavior of two types of agents: the buyers and the sellers (i.e. suppliers and purchasing office managers of firms). We try to simulate a world where economic interactions take part between them, affecting the society’s general level of corruption.

HOW TO USE IT

Set the HOW MANY BUYERS and the HOW MANY SELLERS sliders to control the number of agents. Set the INITIAL HONESTY LEVEL slider, which works only before starting the simulation. Then click the SETUP button to create the world. The blue agents are the buyers, the yellow ones are the sellers. Click GO to start the simulation. By modifyng the RULE OF LAW, the DEMOCRATIC ACCOUNTABILITY and the number of buyers and sellers, the agent’s behavior will be modified, obtaining honest or corrupt transactions.

THINGS TO NOTICE

The program assigns each agent a propensity to be corrupt, which determs whether the transactions will be honest instead of corrupt. This propensity is determined on a random microvariable combined with such variables the user can modify in the interface. The interaction between the agents could be controlled by setting the radius on the HOW DISTANT? slider. The agents will extend or reduce their view. Based on whether the agents around them will be honest or corrupt, their propensity to the corruption will be affected, modifying their behavior.

THINGS TO TRY

Try to make the agents interacting as maximum as possible. However, the program will have to make a lot of calculus, so it will become slow. Let’s have a cup of tea!

EXTENDING THE MODEL

You might introduce interactions as in the model “Segregation - Uri Wilensky”. Many sellers could be “unhappy” since they don’t have enough same-color neighbors. The unhappy agents move to new locations in the vicinity. But in the new locations, the surrounding agents’s behavior will be affected, and other sellers will be prompted to leave.

CREDITS AND REFERENCES

Uri Wilensky (1997). Segregation.
Pietro Terna (2012). Interacting buyers and sellers.

CODE

breed [sellers seller]
breed [buyers buyer]
buyers-own [microVariable Propensity]
sellers-own [microVariable Propensity]
globals [#Agents radius T numberCorrupt numberNon GHL honestyLevel NT s b ]

to setup
      
  clear-all
  reset-ticks
  set honestyLevel initialHonestyLevel   
  create
  setMicroVariable
  setVariable
   
end

to create
  
  if howManyBuyers + howManySellers > count patches - 50
    [ user-message (word "This society only has room for "( count patches - 50) " agents.")
      stop ]
  
  create-buyers howManyBuyers
    [setxy random-xcor random-ycor
     findNewSpot
     set color blue
     set shape "house" 
     ]
    
  create-sellers howManySellers
    [setxy random-xcor random-ycor
     findNewSpot
     set color yellow
     set shape "person"
     ]
   
end

to findNewSpot
  
  while [any? other turtles-here]  
    [lt random 360 repeat 5 [fd 0.5] ]
  
  move-to patch-here
  
end

to setMicroVariable
  
  ask buyers 
  [
   set microVariable random-float 10 + 0.5
  ]
   
  ask sellers
  [
   set microVariable random-float 8 + 0.5
  ]
  
end

to setVariable    
    
  set #Agents howManyBuyers + howManySellers
  set radius howDistant?
  
  set GHL honestyLevel * 0.461 + ruleOfLaw * 0.204 + democraticAccountability * 0.180 + ((ln #Agents ) * -0.2)   
  
  if GHL < 0 [set GHL 0]
  
  ask turtles 
    [
      setPropensity
     ]
  
end

to setPropensity
    
  set Propensity  (GHL * (0.1) +  microVariable * 0.7)   
    
end

to go
  
  set-current-plot "General Honesty Level"
  plot GHL
     
  bornDie 
  getThreshold
  checkAround
  act
  fixNewLevelHonesty  
  setVariable     
    
  tick   
   
end

to bornDie
  
  if howManyBuyers + howManySellers > count  patches - 50
    [ user-message (word "This society only has room for "( count patches - 50) " agents.")
      stop ]
  
  ask one-of turtles
  [
   set b howManyBuyers - count buyers
   while [b != 0] 
     [ifelse b < 0 [kill][generate]]
   
   set s howManySellers - count sellers
   while [s != 0] 
     [ifelse s < 0 [kill][generate]]
  ]
        
end
     
to kill
  
  ask n-of abs(b) buyers [die]
  ask n-of abs(s) sellers [die]
  
  bornDie 

end  

to generate
  
  ask one-of patches with[not any? turtles-here]
  [
   sprout-buyers b [setxy random-xcor random-ycor
                    set color blue
                    set shape "house"
                    set microVariable random-float 10 + 0.5
                    setPropensity 
                    findNewSpot
                    ]
    
   sprout-sellers s [setxy random-xcor random-ycor
                     set color yellow
                     set shape "person"
                     set microVariable random-float 8 + 0.5
                     setPropensity 
                     findNewSpot 
                     ]
    
   bornDie
  ]

end  

to getThreshold
  
  set numberCorrupt 0
  set numberNon 0
  set T 6 + (0.4 * standard-deviation [Propensity] of turtles)
    
end

to checkAround
  
  ask turtles
  [
   while [any? other turtles with [breed = [breed] of myself] in-radius radius with [color = red or color = green ]]
      [lookAround stop]
  ] 
  
end

to lookAround   
  
  let r count other turtles in-radius radius with [breed = [breed] of myself and color = red ] / (count other turtles in-radius radius with [breed = [breed] of myself and color = green ] + 
                                                                                                     count other turtles in-radius radius with [breed = [breed] of myself and color = red ] )
  ifelse r > 0.5 [set Propensity Propensity - (1 + random-float 0.5 + r)] [set Propensity Propensity + (2 + random-float 0.5 - r)]
  
  if Propensity < 0 [set Propensity 0]                  
  
end

to act
  
  ask sellers
  [
   move
   negotiate
   countTransaction
   getColor
   findNewSpot
  ]  
  
end

to move  
  
  while [not any? buyers-here]
    [lt random 360 fd 1 move]
 
end

to negotiate 
             
  let jb item 0 [Propensity] of buyers-here
  let js item 0 [Propensity] of sellers-here 
  
  if T < jb and T < js [ifelse random-float 1 < 0.05 [set NT 1] [set NT 0]]
  if T > jb and T > js [ifelse random-float 1 < 0.95 [set NT 1] [set NT 0]]
  if T < jb and T > js [ifelse random-float 1 < 0.6 [set NT 1] [set NT 0]]
  if T > jb and T < js [ifelse random-float 1 < 0.4 [set NT 1] [set NT 0]] 
   
end

to countTransaction
  
  ifelse NT = 0 [set numberNon numberNon + 1] [set numberCorrupt numberCorrupt + 1]

end

to getColor
  
  ask turtles-here
  [
   ifelse NT = 0 [set color green set size 1.3] [set color red set size 1]
  ]
  
end

to fixNewLevelHonesty
  
  set-current-plot "% transactions"
  set-current-plot-pen "Total transactions"
  plot 100
  set-current-plot-pen "Total /2"
  plot 50
  set-current-plot-pen "Non corrupt  "
  plot (numberNon / (numberCorrupt + numberNon)) * 100
  set-current-plot "# Agents"
  set-current-plot-pen "# Sellers              "
  plot count sellers
  set-current-plot-pen "# Buyers"
  plot count buyers
  set-current-plot "Interaction"
  set-current-plot-pen "How distant?       "
  plot howDistant?

  let r numberCorrupt / (numberCorrupt + numberNon)
  ifelse r > 0.5 [set honestyLevel GHL + (10 * r *(1.66 - exp r) - random-float (r * 3))] [set honestyLevel GHL - (5 * (0.65 +  ln (r + 0.01)) + random-float 2)]
  
  if honestyLevel < 0 [set honestyLevel 0]

end  



; Copyright 2012 Silvia Casale - Matteo Kersbamer - Luca Piero Aldo Rosazza Gat.