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: san-francisco_park.nlogo
The model tries to explain the behavior of agents while searching for available parking spaces, and the automatic adjustment of prices of those parking spaces.
We have built this model in order to simulate a new project which is actually taking place in the city of San Francisco. The principal aim is to use new technologies to improve the parking in the city, reduce traffic and help drivers find available parking spaces more quickly.
At the beginning of the simulation, houses are created at the corners of our hypothetical city, central parking spaces are created exactly in the middle of the city, and peripheral parking spaces are spread randomly around the city. Agents are created initially in their houses.
As the simulation starts, the agents immediately go to the central parking spaces (since we are assuming they are the most desirable ones), and only if they don’t find an available parking lot there , they start looking for the peripheral parking spaces, which are less desirable, but also less costly.
In order to start the simulation, click on the button setup: the initial world is created. To run the simulation click on go: the cars start looking for parking spaces.
In the interface there are also different monitors and plot.
You can modify, through the special slider, the number of cars, the number of parking lots, the parking time of cars, the amount of increase or decrease in the automatic adjustment mechanism, and the prices of the peripheral parking spaces and of the central ones.
Also you can keep trace of the time passed, of the number of parking spaces available, and of the prices while running the simulation.
The most interesting things to notice while running the program are surely the plot of prices and the one of parking available, since the entire model is based on the automatic adjustment of them.
As the program is running, you can keep trace of all the adjustment of prices, noting that the black line represent the prices of the central parking spaces, while the red line represent the prices of all the parking spaces.
Also another interesting thing to notice is the monitor called “months-passed”, since we have assumed that 1 month is equal to 100 ticks, and that the automatic adjustment of prices are every month.
Thanks to the use of sliders, the user can modify our program in many different ways.
First of all, you can decide how many agents to create, moving the slider called “population”.
Then you can modify the number of parking spaces available through the slider “NumberOfParkingLots”.
Moreover you can choose and modify all the things related to prices: the peripheral parking price, the central parking price, and also the amount of increase and decrease in prices you want in the automatic adjustment mechanism.
Valid experiments to try are, for example, to create a model with a high number of agents and a low number of parking spaces and see what happens to the prices, or modify the prices of the peripheral parking spaces and of the central ones, and see how prices change through time.
If you want to extend the model even further there are some things that you can change. For example you could add a slider for the duration of the months. We assumed a fixed value for them (100 ticks) but you can see how prices vary if the months are shorter, more frequent adjustments and more flexibility of prices, or longer. Another modification that can be added is on the reservation price of the car drivers. We assume it to be constant but it could adjust over time following the growing center parking prices. This gradual adjustment would reflect the willingness of drivers to find a satisfactory parking location over their aversion to spend more money.
The most interesting feature is how the passing of time is shown and used. We have created two variables, one to make the price adjust in a given period (since we needed a longer adjustment time then just one tick) and the other to make it more user friendly, by showing the amount of periods while they go by. Another interesting feature is that instead of asking NetLogo to create the turtles, which generates them in the center, we have asked the corner patches to sprout them.
Least but not last is the procedure “to driving”. This is the fulcrum of the turtle’s movements and it is what helped us recreate a life like driving behavior.
There are many related models. For city simulations you can find a good replica of a urban environment in the Models Library (Traffic Grid). Many others though were developed, such as:
http://dugodij.hu/szimulacio_en.php
We have got the idea for this simulation thanks to a real life experiment that has been taking place in some parts of the city of San Francisco. This experiment is based on Donald Shoup’s theories about the price of parking. You can find more in his book “The high cost of free parking” (the link to the first chapter is http://shoup.bol.ucla.edu/Chapter1.pdf). To follow how the experiment is going you can visit the site http://sfpark.org/ which explains in detail how it is being carried out.
patches-own [ parking-space ;; amount of parking space on this patch
home-number ;; number (1) to identify home patches
price
full?
crowded
empty]
turtles-own [ reservation-price
time-at-arrival
parked?
tries
turtle-home ]
globals [time-counter
months-passed]
to setup
clear-all
set-default-shape turtles "car"
cars
ask patches [ setup-home
setup-central-parking ]
AddParking
setup-prices
reset-ticks
end
to cars
ask patch max-pxcor max-pycor
[ sprout (population / 4)]
ask patch max-pxcor min-pycor
[ sprout (population / 4)]
ask patch min-pxcor max-pycor
[ sprout (population / 4)]
ask patch min-pxcor min-pycor
[ sprout (population / 4)]
ask turtles [set size 2
set color red
set turtle-home patch-here]
end
to setup-home
if (distancexy max-pxcor max-pycor) < 5
[ set home-number 1 ]
if (distancexy max-pxcor min-pycor) < 5
[ set home-number 1]
if (distancexy min-pxcor max-pycor) < 5
[ set home-number 1 ]
if (distancexy min-pxcor min-pycor) < 5
[ set home-number 1 ]
if home-number = 1
[ set pcolor green ]
end
to setup-central-parking
if (distancexy 0 0) < 2
[set pcolor violet]
if pcolor = violet
[set parking-space 1]
end
to AddParking
while [(count (patches with [pcolor = violet])) < (NumberOfParkingLots)]
[ask (patch random-pxcor random-pycor)
[if (pcolor != violet and home-number != 1)
[set pcolor violet
set parking-space 1]]]
end
to setup-prices
ask patches [if pcolor = violet and (distancexy 0 0) < 2 [set price random central-parking-price]
if pcolor = violet and (distancexy 0 0) > 2 [set price random periferical-parking-price]]
ask turtles [set reservation-price random 5]
end
to go
driving
time
CheckParking
adjust-prices
tick
end
to driving
ask turtles [ifelse parked? = true
[LeaveParking?]
[move]]
end
to LeaveParking?
if (time-at-arrival + parking-time) < ticks
[set parked? false
go-home]
end
to move
ifelse (pcolor = violet and reservation-price > price and ( patch-here != any? turtles ))
[set parked? true
set time-at-arrival ticks ]
[ifelse tries < 5
[move-to one-of patches with [(distancexy 0 0) < 2]
set tries (tries + 1)]
[ifelse (pcolor = violet and reservation-price > price and ( patch-here != any? turtles ) and (distancexy 0 0) > 2 )
[set parked? true
set time-at-arrival ticks]
[set heading (random 360)
fd random 5]]]
end
to go-home
move-to turtle-home
set tries 0
end
to CheckParking
ask patches with [pcolor = violet]
[ifelse any? turtles-here [set full? true
set parking-space 0]
[set full? false
set parking-space 1]]
end
to adjust-prices
ask patches with [pcolor = violet]
[if full? = false
[set empty (empty + 1)]
if full? = true
[set crowded (crowded + 1)]
if ((time-counter = 0) and (empty - crowded) > 10)
[set price (price - decrease-price-by)
set crowded 0
set empty 0]
if ((time-counter = 0) and (crowded - empty) > 10)
[set price (price + increase-price-by)
set empty 0
set crowded 0 ]
if price < 0
[set price 0]]
end
to time
set time-counter (time-counter + 1 )
if time-counter = 100
[set time-counter 0
set months-passed (months-passed + 1)]
end
;;; quanti sono i parcheggi che non hanno mai avuto una macchina
;; fissare i prezzi per la distanza dal centro
;;Slider che permetta di discriminare più o meno i prezzi fra centro e periferia
;;;prendere l'intervallo dato azzeriamo pieno e vuoto e
;;;guardiamo se fra pieno e vuoto che differenza c'è se ce n'è molta aumentiamo o diminuiamo il prezzo