Shenzhen Urban Village Simulation
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
WHAT IS IT?
The model simulates the spatial development of housing stock and relocation of residents in a city with Urban Villages like Shenzhen. Urban villages are more crowded with densely built low-rise blocks but providing affordable housing for new migrants to the city, while formal gated communities (common housing type in China) are higher rises with higher rents but better living conditions.
There are two scenarios considered: 1) urban villages can be redeveloped into formal gated community to provide more housing for increasing population; 2) urban villages are preserved by government and not allowed to redevelop, while housing demand keeps increasing with growing population.
For both scenarios, the model is trying to determine how housing rents (prices) would change based on changing demand and how residents will have to relocate or be priced out of the city based on their financial capacities.
From a planning perspective, a model like this can contribute to producing strategies to provide affordable housing for increaeing population but also keeps thie identities of the city (like villages)
The model succeeds because the emergent conforms to our expectation about the model.
HOW IT WORKS
Here are the rules.
1.We assume 60% blocks are formal communities and the rest are villages. The residents are located on village patches or formal patches based on the defined occupancy rate. The maximum occupancy of a Village patch is 1, while that of a Formal patch is 3.
The rent value of patches are calculated according to the multipliers of CBD and key transit lines. Rent value of formal patches are assumed 2 times of villages patches holding other factors constant.
Then the financial capacity of residents are assumed correlated with the rent value there, and calculated by the financial multipliers.
2.If redevelopment is allowed, it always happens in the urban village with the highest rent value. When a village is redeveloped, the patches of the block will become a formal community. Housing stock of the block will increase from 25 (5x5x1) to 48 (16x3).
3.If redevelopment is happening. The residents in the urban villages which are redeveloped will need to find an affordable patch that is available (where the occupants are fewer than 1 if it is a village or fewer than 3 if it is formal settlement). Affordable means the rent value of the patch should be no larger than the financial capacity of those residents. If such an affordable patch exists, those village residents will relocate to the nearest affordable patch otherwise they will be priced out of the city (move to patch 30 30, dead).
4.In the meantime, for each running time, new residents will be added to sandbox randomly based on the growth rate. It is assumed that they can afford the housing there, so their financial capacity will be calculated based on rent-value there.
5.Rent value will then be updated according to the demand and supply relationship (the changing ratio of population and housing stock here)
6.When rent value changes, residents in the sandbox may thus be impacted. If the financial capacity of residents is no smaller than the new rent value of their patch, they will stay at the same place. Otherwise, they will need to move to an affordable patch or they will be priced out (dead) if no affordable patch available.
HOW TO USE IT
BEFORE SETUP: parameters can be specified by slider bars 1. Initial Rent Value Calculation: adjust CBD and Transit Multipliers as you like. 2. Initial Occupancy Rate: adjust occupancy slider 3. Initial inancial Capacity: adjust Financial-Multiplier to change financial capacity as n-times of rent-value here 4. Population Growth Rate: change Increase Rate Multiplier
TO SET UP click on "SET UP": now you have the city and renters
TO RUN SCENARIO 1: VILLAGE REDEVELOPMENT click on "GO: DEVELOP VILLAGES FOR MORE HOUSING" urban village block will be redeveloped into formal community, the process will continue until you reclick the button.
TO RUN SCENARIO 2: NO VILLAGE REDEVELOPMENT click on: "GO: NO VILLAGE DEVELOPMENT" no urban village will be redeveloped but new residents still move in and rent value changes every round, the process will continue until you reclick the button.
TO SHOW VALUE click "SHOW RENT VALUE", "SHOW FINANCIAL CAPACITY" AND "SHOW DENSITY" to observe such attributes on sandbox
(IT IS HIGHLY RECOMMENDED TO RUN SCENARIO 1, STOP AND RUN SCENARIO 2 WITHIN ONE SETUP TO SEE THE EMMERGENT PHENOMENON OF THE GOVERNMENT RESTRICTION ON VILLAGE DEMOLITION)
THINGS TO NOTICE
For SCENARIO 1, village residents will be relocated to surrounding affordable patches, while new residents will move in. Then more residents would be impacted to relocate to more affordable space. As the process goes on, there will be residents priced out as no more affordable patches can be found. It can notice in the plot, the rent value of urban villages will increase much faster than formal communities (the affordable housing stock in village is decreasing)
For SCENARIO 2, new residents move in, rent value goes up but no relocation happenes at the beginning. Then many more rensidents would be impacted to relocate to more affordable housing or be priced out of the area. The plot shows the rent value of formal communities are increasing at a similar speed to village rents.
For both SCENARIOS, as demand reaches a threshold value, the rent value increases to a level that most residents cannot afford, leading to a large amount of relocation. Then the surviving population would stop increasing or even decreasing, and rent would slightly reduce. This reflects a clear supply-demand relationship.
WARNING: changing parameter sliders can change the phenomenon (happening sooner or later), especially financial capacity and increase_rate
THINGS TO TRY
CHANGE PARAMETERS TO SEE CHANGES IN PHENOMENONS 1.You can change CBD and Transit multipliers to change the spatial distribution of rent values before any redevelopment happens. 2.You can change “occupancy” to change the initial occupancy of formal communities and urban villages (the initial number of turtles in the sandbox). 3.You can change “financial capacity” and “increase rate” to change financial capacity of residents and the growth rate of residents. This will lead to different phenomenons
PLOT check the plots to see the rent value trends, population change and count of relocation and priced out turtles (dead turtles)
EXTENDING THE MODEL
SHORTCOMINGS: First, our model assumes all residents are renters and we did not take housing ownership into consideration. Second, the initial rent value is a function of distance to CBD districts and key transit lines, but it doesn’t include any other factors which may also influence rent value. Third, the real situation of urban villages are more complicated than this, as the village dwelling are more flexible in density and can accommodate much more population when needed.
GENERALIZABLE?: The model is generalizable for similar urban context like in Chinese cities like Guangzhou, because urban villages are a major habitat for citizens in these cities and renters takes up most of the population. However, it may not be applicable for other cities where urban villages play a less important role for the city.
THEORY: The theory of urban villages here is focusing on reflecting the market. It is good that we have tried to take as many factors into account as possible and complicate the model to make it more realistic. However, the social aspect of urban villages are not examined much. For example, urban villages are best and most affordable options for new migrants, where they form social bond with each other, which would affect the relocation decision.
Also, we assumed land capacity is fixed unless the rban village is redeveloped into formal community. Considering that people may choose to live in shared apartments for cheaper price, We can set land capacity to grow (supply) to improve the model. For instance, as simulation goes, a village patch can hold more than one turtle as villagers may share rooms or increase the floors of village buildings to accommodate more residents.
BOTTOM-UP APPROACH: AGENT BASED MODELING
The bottom-up approach here is effective for modeling this phenomenon of urban villages redevelopment. Since urban villages are a very complicated including a lot of agents, rules and behaviours, using agent-based modeling, compared to top-down models, can clearly demonstrate the process and the evolvement of urban villagers in cities. It is very intriguing to observe those changes and trends in the model.
However, the model here is slightly oversimplified compared with reality considering the time given. It should be improved by adding more factors. It would be great if the GIS plug-in or better agent-based modeling tools can be utilized for the modeling to demonstrate the real geographical conditions.
Last, for most urban problems, planners should still use the combination of top-down and bottom-up approaches. For example, it would probably be better for the initial housing rent value and capacity to be predicted by regression model, when the model is put in a real urban context.
NETLOGO FEATURES
output and plot functions are used
RELATED MODELS
The setup code is based on Ken Steif's sandbox. The rest of code is all originally written.
CREDITS AND REFERENCES
Special thanks to Ken, who has helped us complete the model.
Comments and Questions
globals [affordable-patches affordable-for-formals affordable-for-villagers] breed [formals formal] ;a breed for formal community residents (high affordabilituy) breed [villagers villager] ; a breed for village residents (low financial-capacity) breed [new_vs new_v] breed [new_fs new_f] breed [deads dead] patches-own [ street ; the patch a street or not key-transit ; major transportation line rent-value ; a measure of proximity to transit and thypes of residence Parcel ; village, formal or park block ; block identity, center parcel to define parcels with in a block, 1 or o block_type ; formal or village landuse ; what is built on a patch CBD_Dist ; measure and scale distance CBD_Metric ; metric for CBD distance Transit_Dist ; mesure of distance to key transit line Transit_Metric ; metric of transit distance Density ] Villagers-own [financial-capacity] ; place holder for renters Formals-own [financial-capacity] ; place holder for renters to setup ca ;????proportion of block are formal gated communities ;set up streets and key transit lines ask patches with [pxcor != 0 and pycor != 0 or pycor = 1 ] [ if abs pxcor mod 6 = 0 or pycor mod 6 = 0 [set pcolor 7 set street 1] ask patches with [pxcor = 0 or pycor = 0 ] [set pcolor 6 set street 1 set key-transit 1] ] ;set up blocks ask patches with [abs pxcor mod 6 = 3 and pycor mod 6 = 3] [set block 1] ;set up formal blocks-- ask n-of (count patches with [block = 1]* .60) patches with [block = 1] [set block_type "formal"] ask patches with [street = 0 and count patches with [block_type = "formal"] in-radius 3 = 1 and count patches with [street = 1] in-radius 1 > 0] [set parcel "formal"] ask patches with [parcel = 0 and count patches with [block_type = "formal"] in-radius 2 = 1] [set parcel "park"] ;set up village blocks ask patches with [block = 1 and block_type = 0] [set block_type "village"] ask patches with [street = 0 and count patches with [block_type = "village"] in-radius 3 = 1] [set parcel "village"] ;set up color ask patches with [parcel = "formal"] [set pcolor 135] ask patches with [parcel = "park"] [set pcolor 8] ask patches with [parcel = "village"] [set pcolor 137] ask patches with [parcel ="formal" or parcel = "village"] [set landuse "residential"] end to create-renter-points ;with financial-capacity reflected from current rent value ; sprout formal renters with financial-capacity (formal patch: capacity 3) Ask n-of (count patches with [parcel = "formal"] * occupancy) patches with [parcel = "formal"] [sprout-formals 3] Ask formals [ Set color white Set shape "circle" Set size .7 ] ;sprout village renters with financial-capacity (village patch capacity 1) Ask n-of (count patches with [parcel = "village"] * occupancy) patches with [parcel = "village"] [sprout-villagers 1] Ask villagers [ Set color white Set shape "x" Set size .7 ] ;density ask patches [set density count turtles-here] end to calculate-rent-value ask patches with [parcel = "formal" or parcel = "village"] [ ;access to CBD set CBD_Dist distance patch 0 0 ;acces to key transit set Transit_Dist distance min-one-of patches with [key-transit = 1] [distance myself] ] ;CBD and transit Metric for formal let a sort [CBD_Dist] of patches with [parcel = "formal"] let nlist length a print nlist ask patches with [parcel = "formal" and CBD_Dist <= item (0.1 * (nlist + 1)) a] [set CBD_Metric 20] ask patches with [parcel = "formal" and CBD_Dist > item (0.1 * (nlist + 1)) a and CBD_Dist <= item (0.2 * (nlist + 1)) a] [set CBD_Metric 18] ask patches with [parcel = "formal" and CBD_Dist > item (0.2 * (nlist + 1)) a and CBD_Dist <= item (0.3 * (nlist + 1)) a] [set CBD_Metric 16] ask patches with [parcel = "formal" and CBD_Dist > item (0.3 * (nlist + 1)) a and CBD_Dist <= item (0.4 * (nlist + 1)) a] [set CBD_Metric 14] ask patches with [parcel = "formal" and CBD_Dist > item (0.4 * (nlist + 1)) a and CBD_Dist <= item (0.5 * (nlist + 1)) a] [set CBD_Metric 12] ask patches with [parcel = "formal" and CBD_Dist > item (0.5 * (nlist + 1)) a and CBD_Dist <= item (0.6 * (nlist + 1)) a] [set CBD_Metric 10] ask patches with [parcel = "formal" and CBD_Dist > item (0.6 * (nlist + 1)) a and CBD_Dist <= item (0.7 * (nlist + 1)) a] [set CBD_Metric 8] ask patches with [parcel = "formal" and CBD_Dist > item (0.7 * (nlist + 1)) a and CBD_Dist <= item (0.8 * (nlist + 1)) a] [set CBD_Metric 6] ask patches with [parcel = "formal" and CBD_Dist > item (0.8 * (nlist + 1)) a and CBD_Dist <= item (0.9 * (nlist + 1)) a] [set CBD_Metric 4] ask patches with [parcel = "formal" and CBD_Dist > item (0.9 * (nlist + 1)) a] [set CBD_Metric 2] let b sort [transit_Dist] of patches with [parcel = "formal"] let nlist2 length b ask patches with [parcel = "formal" and transit_Dist <= item (0.1 * (nlist2 + 1)) b] [set transit_Metric 20] ask patches with [parcel = "formal" and transit_Dist > item (0.1 * (nlist2 + 1)) b and transit_Dist <= item (0.2 * (nlist2 + 1)) b] [set transit_Metric 18] ask patches with [parcel = "formal" and transit_Dist > item (0.2 * (nlist2 + 1)) b and transit_Dist <= item (0.3 * (nlist2 + 1)) b] [set transit_Metric 16] ask patches with [parcel = "formal" and transit_Dist > item (0.3 * (nlist2 + 1)) b and transit_Dist <= item (0.4 * (nlist2 + 1)) b] [set transit_Metric 14] ask patches with [parcel = "formal" and transit_Dist > item (0.4 * (nlist2 + 1)) b and transit_Dist <= item (0.5 * (nlist2 + 1)) b] [set transit_Metric 12] ask patches with [parcel = "formal" and transit_Dist > item (0.5 * (nlist2 + 1)) b and transit_Dist <= item (0.6 * (nlist2 + 1)) b] [set transit_Metric 10] ask patches with [parcel = "formal" and transit_Dist > item (0.6 * (nlist2 + 1)) b and transit_Dist <= item (0.7 * (nlist2 + 1)) b] [set transit_Metric 8] ask patches with [parcel = "formal" and transit_Dist > item (0.7 * (nlist2 + 1)) b and transit_Dist <= item (0.8 * (nlist2 + 1)) b] [set transit_Metric 6] ask patches with [parcel = "formal" and transit_Dist > item (0.8 * (nlist2 + 1)) b and transit_Dist <= item (0.9 * (nlist2 + 1)) b] [set transit_Metric 4] ask patches with [parcel = "formal" and transit_Dist > item (0.9 * (nlist2 + 1)) b] [set transit_Metric 2] ;CND and transit Metric for village let c sort [CBD_Dist] of patches with [parcel = "village"] let nlist3 length c print nlist3 ask patches with [parcel = "village" and CBD_Dist <= item (0.1 * (nlist3 + 1)) c] [set CBD_Metric 10] ask patches with [parcel = "village" and CBD_Dist > item (0.1 * (nlist3 + 1)) c and CBD_Dist <= item (0.2 * (nlist3 + 1)) c] [set CBD_Metric 9] ask patches with [parcel = "village" and CBD_Dist > item (0.2 * (nlist3 + 1)) c and CBD_Dist <= item (0.3 * (nlist3 + 1)) c] [set CBD_Metric 8] ask patches with [parcel = "village" and CBD_Dist > item (0.3 * (nlist3 + 1)) c and CBD_Dist <= item (0.4 * (nlist3 + 1)) c] [set CBD_Metric 7] ask patches with [parcel = "village" and CBD_Dist > item (0.4 * (nlist3 + 1)) c and CBD_Dist <= item (0.5 * (nlist3 + 1)) c] [set CBD_Metric 6] ask patches with [parcel = "village" and CBD_Dist > item (0.5 * (nlist3 + 1)) c and CBD_Dist <= item (0.6 * (nlist3 + 1)) c] [set CBD_Metric 5] ask patches with [parcel = "village" and CBD_Dist > item (0.6 * (nlist3 + 1)) c and CBD_Dist <= item (0.7 * (nlist3 + 1)) c] [set CBD_Metric 4] ask patches with [parcel = "village" and CBD_Dist > item (0.7 * (nlist3 + 1)) c and CBD_Dist <= item (0.8 * (nlist3 + 1)) c] [set CBD_Metric 3] ask patches with [parcel = "village" and CBD_Dist > item (0.8 * (nlist3 + 1)) c and CBD_Dist <= item (0.9 * (nlist3 + 1)) c] [set CBD_Metric 2] ask patches with [parcel = "village" and CBD_Dist > item (0.9 * (nlist3 + 1)) c] [set CBD_Metric 1] let d sort [transit_Dist] of patches with [parcel = "village"] let nlist4 length d ask patches with [parcel = "village" and transit_Dist <= item (0.1 * (nlist4 + 1)) d] [set transit_Metric 10] ask patches with [parcel = "village" and transit_Dist > item (0.1 * (nlist4 + 1)) d and transit_Dist <= item (0.2 * (nlist4 + 1)) d] [set transit_Metric 9] ask patches with [parcel = "village" and transit_Dist > item (0.2 * (nlist4 + 1)) d and transit_Dist <= item (0.3 * (nlist4 + 1)) d] [set transit_Metric 8] ask patches with [parcel = "village" and transit_Dist > item (0.3 * (nlist4 + 1)) d and transit_Dist <= item (0.4 * (nlist4 + 1)) d] [set transit_Metric 7] ask patches with [parcel = "village" and transit_Dist > item (0.4 * (nlist4 + 1)) d and transit_Dist <= item (0.5 * (nlist4 + 1)) d] [set transit_Metric 6] ask patches with [parcel = "village" and transit_Dist > item (0.5 * (nlist4 + 1)) d and transit_Dist <= item (0.6 * (nlist4 + 1)) d] [set transit_Metric 5] ask patches with [parcel = "village" and transit_Dist > item (0.6 * (nlist4 + 1)) d and transit_Dist <= item (0.7 * (nlist4 + 1)) d] [set transit_Metric 4] ask patches with [parcel = "village" and transit_Dist > item (0.7 * (nlist4 + 1)) d and transit_Dist <= item (0.8 * (nlist4 + 1)) d] [set transit_Metric 3] ask patches with [parcel = "village" and transit_Dist > item (0.8 * (nlist4 + 1)) d and transit_Dist <= item (0.9 * (nlist4 + 1)) d] [set transit_Metric 2] ask patches with [parcel = "village" and transit_Dist > item (0.9 * (nlist4 + 1)) d] [set transit_Metric 1] ; ; calculate rent value ask patches with [parcel = "formal" or parcel = "village"] [ set rent-value (CBD_Metric * CBD_Multiplier)+(transit_Metric * transit_Multiplier) ] end to update-rent-value ;calculate-new-rent ask patches with [parcel = "village"] [ set rent-value count turtles-on patches with [parcel = "village"] / count patches with [parcel = "village"]/ occupancy * rent-value ] ask patches with [parcel = "formal"] [ set rent-value count turtles-on patches with [parcel = "formal"] / (count patches with [parcel = "formal"] * 3 )/ occupancy * rent-value ] end to calculate-financial-capacity ask formals [set financial-capacity [rent-value] of patch-here * financial-multiplier] ask villagers[set financial-capacity [rent-value] of patch-here * financial-multiplier] ;20% village renters can afford higher rents ask n-of (count villagers * 0.2) villagers [set financial-capacity [rent-value] of patch-here * 1.5] end to develop ;develop a village let development-point max-one-of patches with [block_type = "village"] [rent-value] ask patches with [parcel = "village" and distance development-point < 4 and count patches with [street = 1] in-radius 1 > 0] [set parcel "formal" set rent-value rent-value * 2 set pcolor 84] ask patches with [parcel = "village" and distance development-point < 4] [set parcel "park" set landuse 0 set rent-value 0 set pcolor 8 ] ask development-point [set block_type "formal"] ;displaced villagers ask villagers with [distance development-point < 4] [ set affordable-patches patches with [landuse = "residential" and count villagers-here < 1 and count formals-here < 3 and rent-value < [financial-capacity] of myself ] ifelse any? affordable-patches [ move-to min-one-of affordable-patches [distance myself] ifelse [parcel] of patch-here = "formal" [set breed formals set color 87 set shape "circle"] [set breed villagers set color 87 set shape "x"] ] [move-to patch 30 30 set color red set breed deads] ;die ] end to grow ;new comers and update financial-capacity ;new comers ;new formal residents ifelse (count patches with [parcel = "formal"] * 3 - count formals-on patches with [landuse = "residential"]) >= (increase_rate * count formals * 0.4) [ ask patch -30 -30 [sprout-new_fs (increase_rate * count formals * 0.4)] ask new_fs [ move-to one-of patches with [parcel = "formal" and count formals-here < 3] ] ] [ ask patches with [parcel = "formal"] ;no enough housing available: rent increases [set rent-value rent-value * 1.05] if any? patches with [parcel = "formal" and count formals-here < 3] [ask patch -30 -30 [sprout-new_fs (count patches with [parcel = "formal"] * 3 - count formals-on patches with [landuse = "residential"])] ask new_fs [ move-to one-of patches with [parcel = "formal" and count formals-here < 3] ] ] ] ask new_fs [ Set color yellow Set size .7 set breed formals set shape "circle" set financial-capacity [rent-value] of patch-here * financial-multiplier ] ;new villagers ifelse count patches with [parcel = "village" and count villagers-here = 0] >= (increase_rate * count villagers * 0.6) [ ask n-of (increase_rate * count villagers * 0.6) patches with [parcel = "village" and count villagers-here = 0] [sprout-new_vs 1] ] [ ask patches with [parcel = "village"] ;if not enough space available, rent increses) [set rent-value rent-value * 1.05] if any? patches with [parcel = "village" and count villagers-here = 0] [ask patches with [parcel = "village" and count villagers-here = 0] [sprout-new_vs 1] ] ] ask new_vs [ Set color yellow Set size .7 set breed villagers set shape "x" set financial-capacity [rent-value] of patch-here * financial-multiplier ] end to impact-relocation ;if rent value here becomes larger than financial-capacity, turtle would relocate or die update-rent-value ; capacity update ask formals [set financial-capacity financial-capacity * 1.1] ask villagers [set financial-capacity financial-capacity * 1.1] ; impacted villagers ask villagers [ set affordable-for-villagers patches with [landuse = "residential" and count villagers-here < 1 and count formals-here < 3 and rent-value < [financial-capacity] of myself ] if [financial-capacity] of self < [rent-value] of patch-here [ifelse any? affordable-for-villagers [ move-to min-one-of affordable-for-villagers [distance myself] ifelse [parcel] of patch-here = "formal" [set breed formals set color 87 set shape "circle"] [set breed villagers set color 87 set shape "x"] ] [move-to patch 30 30 set color red set breed deads] ;die ] ] ;impacted formal residents ask formals [ set affordable-for-formals patches with [landuse = "residential" and count villagers-here < 1 and count formals-here < 3 and rent-value < [financial-capacity] of myself] if [financial-capacity] of self < [rent-value] of patch-here [ifelse any? affordable-for-formals [ move-to min-one-of affordable-for-formals [distance myself] ifelse [parcel] of patch-here = "formal" [set breed formals set color 87 set shape "circle"] [set breed villagers set color 87 set shape "x"] ] [move-to patch 30 30 set color red set breed deads] ;die ] ] ;density ask patches [set density count turtles-here] end to show-rent-value ask patches [ set pcolor scale-color 116 rent-value min [rent-value] of patches max [rent-value] of patches ] end to show-financial-capacity ask turtles-on patches with [landuse = "residential"] [ set color scale-color 116 financial-capacity min [financial-capacity] of turtles-on patches with [landuse = "residential"] max [financial-capacity] of turtles-on patches with [landuse = "residential"] ] end to show-density ask patches with [landuse = "residential"] [ set pcolor scale-color grey count turtles-here 0 3 ] end to output-death output-print count turtles-on patch 30 30 end to setup-plot setup-plots end to plot-result update-plots end
There is only one version of this model, created over 5 years ago by Tong Wu.
This model does not have any ancestors.
This model does not have any descendants.