Marta Fana Evina Sheta

Simulation models for economics

Project work on

"Corruption and collusion in auctions."


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.

powered by NetLogo

view/download model file: corruption_and_collusion_in_auctions.nlogo


This is an agent based model for simulation experiment. The model refers to the procurement of a single item throught a competitive mechanism where the format chosen is the sealed first price auction with predefined reservation price. The model has been enriched by introducing the possibility of corruption, in the form of bribe, in order to revise the offer and undercut rivals. Finally we introduce the set aside scheme,spliting in two parts the contract and seeing whether this solution can improve efficiency and restore competition among bidders.


We call reservation price the maximum amount the buyer is willing to pay for each item.Futhermore we define the market as a patch populated by agents randomly located. There are 100 firms, labeled as "business persons", caracterized by their cost structure. The cost structure is the key variable that determes the competitivness of the firm. Moreover we assume that the cost distribution will be defind by a Uniform distribution over the interval [70,120]. The agent with a cost less or equal that the reservation price can partecipate to the auction. In a second moment we introduce the bribe competition where the highest bribe that can be offered will be a decreasing function of the number of bidders. All agents with cost lower than the difference between reservation price and the max bribe will partecipate to the auction. A collusive Bayesian equilibrium is sustained. Finally in order to restore the competition we introduce the set aside solution; that is the spliting the contract in two parts. Every firm can partecipate in one auction only. We divide the firms based on their cost. We assume that firms on the right behave competitively and the firms on the left behave as before. After the firs stage the winner can pass to the right. The possibility to have a new competitor in the left market break the collusion.


Start the model by clicking setup. After clicking submit_bid the firms will partecipate to the auction competitively: bidder with lowest offer wins, therefore the contract is allocated to the least cost firm. this shows the benchamark situation, according to which efficiency is achieved. Restarting the setup but clicking the "submit_collusive_bid" bottom, agents compete for the bribe offers and the winner is chosen according to the minimum bid offered (if the firms offered the same bid the winner will be chosen randomly). The outcome is a collusive bayesian one in which the contract is allocated at the reservation price and the maximum bribe is paid.
Finally by clicking "set_aside" and "submit set_asid"e the firm will be divided on a cost bases; the winner in the right part becomes more efficient and got the possibility to enter the left side. The game ends when the inefficiency in allocation is less than 2.5. Other than this learning-by-doing mechanism we allow right-side firms to acquire information on left-side ones' cost, in particular if in a small neighborhood there are no competitors higly efficient in terms of cost, right-side bidders enter the left market and compete bidding their own price plus required bribe. This allows low cost firms to undercut rival in the next game if the winning bid is higher than their own cost plus bribe.
Monitors: there are 4 monitors that shows the winner cost and the best cost possible, profit lost and buyer profit. They help us to better understand the ongoing of the market.
Plots: On the right there are 3 graphics that shows the winner cost, the buyer profit in the set aside solution and the created inefficiency. They can be useful to understand how these variables are correlated.


Modify the learning-by-doing process, the bribe function and/or the number of bidders in order to see whethere efficiency improves or not, and therefore buyer's profit under set aside scheme.


A possible extension concerns the introduction of endogenous entry and participation, as often described in theoretical works on this topic. In particular, one can allow new high cost firms to born and participate to the set aside model.


- E. Auriol, Corruption in procurement and public purchase, International Journal of Industrial Organization, Pages 867-885, September 2006

- O. Compte & A. Lambert-Mogiliansky & T. Verdier, Corruption and Competition in Procurement Auctions, RAND Journal of Economics, The RAND Corporation, vol. 36(1), pages 1-15, Spring 2005.

- Peter Cramton and Ian Ayres, Deficit Reduction Through Diversity: How Affirmative Action at the FCC Increased Auction Competition, Stanford Law Review 48 (1996): 761-815.

- Yvan Lengwiler Elmar Wolfstetter Corruption in Procurement Auctions in Handbook of Procurement (ed. By Dimitri, Piga, Spagnolo), Cambridge Univeristy Press 2006.

- NetLogo User Manual version 4.1.3 April 3, 2011


  reservation_price             ;;min proce the buyer is willing to pay in standard procedure
  reservation_price_sa          ;;min price the buyer is willing to pay in the set aside contract
  reservation_price_big         ;;min price the buyer is willing to pay in the non set aside contract
  best_bid                      ;;minimum bid offered in the standard procedure with competitive behaviour (lowest cost)  
  best_bid_sa                   ;;minimum bid in the set aside contract among firms with higher costs
  best_bid_big                  ;;minimum bid in the set aside contract among firms with lower costs
  buyer_profit                  ;;buyer's profit in standard procedure
  buyer_profit_sa               ;;buyer's profit with set aside
  best_turtle                   ;;winner of the competitive auction
  best_turtle_sa                ;;winner of the set aside auction
  winner                        ;;winner in the game with corruption
  best_turtle_big               ;;winner in the set aside among low cost firms
  profit_lost                   ;;difference between the competitive profit and the collusive profit
  inefficiency                  ;;difference in costs between the winner and the most efficient firm
  inefficiency_sa               ;;difference in costs between the winner and the most efficient firm in the set aside
  bribe                         ;;bribe paid as decreasing function of the number of bidders
  bribe_sa                      ;;bribe paid in the auction with set aside 
  winner_s_cost                 ;;winner's cost in non set aside contract

  cost                         ;;firsm's cost
  bid                          ;;firm's bid

;-----------------------------;;  SET UP  ;;---------------------------------------------------------

to setup
  set-default-shape turtles "person business"               ;;CREATE TURTLES
  crt 100
  random-seed 2011
   ask turtles                                                     
          [setxy random-xcor random-ycor                    ;;random position       
          set size 1                                        ;;turtles dimension
          set color white                                   ;;agents default color
  ask turtles 
    [set cost ((random-float 50) + 70)                      ;;random costs tra 50 e 120
  set reservation_price 90                                  ;;set the max amount the buyer is willing to pay 
  set bribe  ((10 *(count turtles) - 1) / (count turtles) ^ 2)                          ;;define the bribe as a decreasing function of the number of bidders in the left part of the market

;--------------------------;;  THE COMPETITIVE AUCTION  ;;------------------------------------------------------

to submit_bid 
  set best_bid 100                                                                             ;;START A SEQUENTIAL ITERATION FOR EACH AGENT:
  ask turtles[
       if (cost <= reservation_price) [set color green]                                        ;;if the cost is lower than the reservation price become green (ACTIVE)
       if (cost > reservation_price) [ht]                                                      ;;if the cost is higher than the reservation price hide the agent   
       if (cost <= best_bid) [set best_bid cost                                                ;;if the cost is smaller than the best_bid then update best_bid 
                              set best_turtle min-one-of turtles [cost]]                       ;;keep the agent with the lowest cost up to now
 ask best_turtle [set color red
                  set label cost]                                                              ;; once the best_turtle is found, set color red
 show [cost] of best_turtle                                                  
 set buyer_profit (reservation_price - [cost] of best_turtle)                                  ;;set buyer's profit
 show buyer_profit

;-------------------------;; THE COLLUSIVE AUCTION  ;;----------------------------------------------------------

to submit_collusive_bid
  ask turtles[
    if (cost <= reservation_price) [set color green]                                                      ;;let the active agents being green
    ifelse (cost >= reservation_price - bribe) [
       ht]                                                                                                ;;let die all those turtles that cannot breakeven with bribe
       [set bid (reservation_price + bribe)]                                                              ;;define the collusive bid
       set winner one-of turtles with [cost < reservation_price - bribe]                                  ;;chose randomply the winner 
  ask winner [
       set color red                                                                                      ;;characterize the winner by the red color
       set label cost
  show winner  
  show count turtles                                                                                      ;;counts the number of bidders partecipating in the auction
  set buyer_profit (reservation_price - [cost] of winner)                                                 ;;set buyer's profit
  set inefficiency ([cost] of winner - min [cost] of turtles with [cost <= reservation_price])            ;;determine the profits lost with respect to the competitive case

;-------------------------;; THE SET ASIDE  ;;-------------------------------------------------------------------

to setup_set_aside
  set-default-shape turtles "person business"
  crt 100
  random-seed 2011
  ask turtles[
          set cost ((random-float 50) + 70)]                     ;;random costs between 50 e 120
  ask turtles                                                     
          [setxy random-xcor random-ycor                         ;;random position       
          set size 1                                             ;;turtles dimension
          set color white                                        ;;agents default color
  ask turtles[
    if (cost > mean [cost] of turtles)                           ;;divide firms on costs
      [set color yellow                                          ;;if firms are high costs set color yellow
       set xcor random-float 10]                                 ;;& set random position on the right side of the market
   if (cost <= mean [cost] of turtles)                           ;;if low cost firm 
      [set xcor random-float -10]]                               ;;set random position on the left side of the market
 graphics                                                        ;;update graphics

to set_aside
  set reservation_price_sa 100
  set reservation_price_big 100
  set bribe_sa ((10 *(count turtles with [xcor <= 0]) - 1) / (count turtles with [xcor <= 0]) ^ 2)
  set best_bid_sa 100
  set best_bid_big 100

  ask turtles [
    if (xcor > 0)                                                               ;;bidding behaviour inthe right part of the market
       [if (cost <= best_bid_sa)                                                ;;if the cost is smaller than the best_bid then update best_bid 
          [set bid cost                                       
           set best_turtle_sa min-one-of turtles-here [bid]]]]                  ;;keep the agent with the lowest cost up to now  
  ask turtles [   
    if (xcor <= 0)            
       [if (cost <= reservation_price_big) and (color != magenta)
           [set bid (reservation_price_big + bribe_sa)]                         ;;set collusive bid  
        if  (color = magenta)                                                   ;;if new entrant because of imitation
           [set bid (cost + bribe_sa)]]                                         ;;do not collude                                                                   
    set best_turtle_big min-one-of turtles with [xcor <= 0] [bid]               ;;keep the agent with the lowest cost up to now
        if ([bid] of best_turtle_big >= cost)
           [set bid (cost + bribe_sa)]]
 ask best_turtle_sa [set color red]                                             ;;once the best_turtle_sa is found, set color red
 ask best_turtle_big [set color green]                                          ;;once the best_turtle_big is found, set color green
;;---------------------------------------------;; OUTCOMES ;;------------------------------------------------------------

set buyer_profit_sa (0.77 * ((reservation_price_big) - [bid] of best_turtle_big) + (0.23 * ((reservation_price_sa) - [bid] of best_turtle_sa)))         ;;compute the overall buyer's profit 
set inefficiency_sa ([cost] of best_turtle_big - min [cost] of turtles with [xcor <= 0])                                                                ;;compute allocative inefficiency
set winner_s_cost ([cost] of best_turtle_big)
show [cost] of best_turtle_sa                                                                                                                           ;;display winner's costs of right market 
show [cost] of best_turtle_big                                                                                                                          ;;display winner's costs of left market
show bribe_sa


ifelse (inefficiency_sa > (([bid] of best_turtle_big) - ([cost] of best_turtle_big))) [learn] [stop]                                   ;;impose the learning mechanism if the number of inefficient firms is still too high otherwise stop the game


    to graphics                                                                  ;;make graphs
  set-current-plot "buyer_profit_sa"                                             
  set-current-plot-pen "buyer_profit_sa"
  set-plot-y-range -100 50
  set-plot-pen-mode 0
  plot buyer_profit_sa

   to graphic_ineff
  set-current-plot "Inefficiency_sa"
  set-current-plot-pen "inefficiency_sa"
  set-plot-pen-mode 0
  plot inefficiency_sa 
   to graph_winner_s_cost
  set-current-plot "winner's cost"
  set-current-plot-pen "winner's cost"
  set-plot-pen-mode 0
  plot winner_s_cost

;--------------------------------------------;; INTRODUCE LEARNING BY DOING and IMITATION ;;---------------------------------------

to learn
  ask best_turtle_sa [                                                                                           ;;the learning mechanism for the winner in the right market
    set cost ((0.95) * cost)                                                                                     ;;reduce cost by 0,5% of the previous level
    if (cost <= (max [cost] of turtles with [xcor < 0]))                                                         ;;allow best_turtles_sa to participate the other market if the condition holds
    [set xcor random-float -15
     set color blue]]                                                                                            ;;highlight the new entrant
  ask turtles with [color = yellow] [                                                                            ;;the imitation mechanism for less efficient firms
    if any? turtles with [cost > (mean [cost] of turtles with [xcor < 0] + bribe_sa) and xcor < 0] in-radius 3   ;;pass into the other market if near firms are not too strong once bribe is required
   [set color magenta                                                                                            ;;highlight the new entrants
   set xcor random-float -15]]
  show [cost] of best_turtle_sa                                                                                  ;;display winner's costs of right market 
  show [cost] of best_turtle_big                                                                                 ;;display winner's costs of left market
  show bribe_sa

set_aside                                                                                                        ;;iterate