Regional v CIty Malls

Regional v CIty Malls preview image

2 collaborators

Terry Bossomaier (Advisor)

Tags

marketing 

Tagged by Steven D'Alessandro 2 days ago

retailing 

Tagged by Steven D'Alessandro 2 days ago

Visible to everyone | Changeable by the author
Model was written in NetLogo 7.0.3 • Viewed 29 times • Downloaded 4 times • Run 0 times
Download the 'Regional v CIty Malls' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


WHAT IS IT?

This agent-based model simulates shopping mall dynamics under varying economic pressures, exploring how regional and city malls differ in their resilience to economic shocks. The model demonstrates critical thresholds, cascade failures, and the multi-dimensional nature of retail shopping experience in physical retail environments.

The model is grounded in retail agglomeration theory (Christaller, 1933; Huff, 1964) and extends prior work on spatial retail competition by incorporating dynamic customer experience formation, social network effects, and viability-based shop closure mechanisms.

HOW IT WORKS

Agents and Environment

Customers (1000 for Regional, 6000 for City malls): - Make probabilistic decisions to visit the mall based on accumulated experience - Shop across six retail categories: Food Retailing, Household Goods, Clothing & Footwear, Department Stores, Cafes & Food, and Other Services - Update experience through a multi-dimensional mechanism incorporating purchase success, value obtained, and mall vitality - Share experiences through social networks, creating network effects

Shops (48 for Regional, 321 for City malls): - Distributed across six categories matching Australian Bureau of Statistics retail trade data - Accumulate revenue from customer purchases - Face quarterly viability checks against revenue targets - Close permanently if revenue falls below target (occupied? = false)

Key Mechanisms

1. Multi-Dimensional Experience Formation

Customer experience (Xj) is calculated as the average of three components:

  • Purchase Success Rate = purchases made / shops visited
    Measures shopping effectiveness

  • Value Obtained = spending / $300 (normalized, capped at 1.0)
    Measures economic satisfaction

  • Mall Vitality = open shops / total shops encountered
    Measures environmental quality

Current experience = (purchaserate + valuescore + vitality_score) / 3

Experience updates with hysteresis:
Xj(v) = ζXj(v-1) + (1-ζ) × current_experience

Where ζ (zeta) controls the weight of historical experience.

Dead shop penalty:
If dead shops encountered: Xj = Xj × β

Where β (beta, default 0.95) penalizes encounters with closed shops.

2. Social Network Effects

Network experience incorporates social influence:
X̄j = λXj + (1-λ) × mean(Xj of network neighbors)

Where λ (lambda) balances personal vs. social experience.

3. Visit Decision

Probability of visiting mall:
pj = 1 / (1 + exp(-α × combined_factor))

Where combined_factor incorporates: - Time since last visit (tj) - Network experience (X̄j) - Bricks preference (Ψj) - Mall vitality (ς, proportion of open shops)

4. Shop Viability

Shops must meet revenue targets calculated from:
R = α × P̄c × (Ts/Tv) × Nc / Ns × 1.2

Where: - α = economic pressure parameter - P̄c = average item cost for category - Ts = shop check period (default 90 days) - Tv = typical visit interval (default 30 days) - Nc = number of customers - Ns = number of shops

Shops failing to meet targets close permanently, triggering: - Experience penalties for all customers (β effect) - Reduced mall vitality for future visits - Potential cascade failures

5. Coffee Break Constraint

Customers must visit a cafe every break-interval ticks (default 4 = 1 hour). Failure to find a cafe forces mall exit, making cafes "keystone" retailers critical to mall function.

Mall Types

Regional Mall: - 48 shops, 1000 customers - Higher economic pressure (default α = 1.4) - More vulnerable to cascade failures - Critical threshold α ≈ 1.6 triggers rapid collapse

City Mall: - 321 shops, 6000 customers
- Lower economic pressure (default α = 0.7) - More resilient to economic shocks - Exhibits graceful degradation rather than collapse

HOW TO USE IT

Setup

  1. Select Mall Type: Choose "Regional" or "City" from chooser
  2. Set Parameters: Adjust sliders for desired economic conditions
    • alpha (0.5-2.5): Economic pressure - higher = more stress
    • zeta (0.1-1.0): Experience memory - higher = slower updating
    • lambda (0.0-1.0): Social influence - higher = more network effects
    • beta (0.85-0.99): Dead shop penalty - lower = stronger penalty
  3. Click Setup: Creates shops and customers according to mall type
  4. Click Go: Runs simulation (Forever mode for continuous running)

Monitoring

Plots: - Occupancy Rate: Shows percentage of shops still operating (0-100%) - Average Experience: Multi-dimensional customer experience (0-1.0) - Shop Count by Category: Tracks which retail categories fail first - Customer Count: Number of shoppers currently in mall

Key Indicators: - Day Counter: Simulation time in days - Dead Shops: Cumulative shop closures - Occupancy %: Current mall occupancy

Typical Run

Day 0-89: Initial period, no closures Day 90: First viability check - some shops may close Day 180: Second check - cascade effects may begin Day 270+: Pattern stabilizes or accelerates depending on mall type and α

THINGS TO NOTICE

Critical Thresholds

Regional Malls exhibit a critical threshold around α = 1.6: - Below threshold: Stable or slow decline - At threshold: Rapid cascade failure - Above threshold: Catastrophic collapse (occupancy → 20-30%)

City Malls show graceful degradation: - More resilient across α values - Slower decline rate - Higher equilibrium occupancy

Cascade Failure Sequence

When regional malls collapse, observe: 1. Food retailers fail first (low margins, high revenue needs) 2. Cafes close (lose customer base from food closures) 3. Coffee constraint triggers exodus (customers can't complete visits) 4. Remaining categories collapse (insufficient traffic)

Experience Dynamics

Watch Average Experience plot for: - Initial stability (0.8-0.9 range) - Stepwise drops at viability check days (90, 180, 270) - β penalty effects accumulating over time - Social amplification when lambda is high

Keystone Species Effect

Cafes function as "keystone retailers": - Small representation (18% regional, 21% city) - Disproportionate impact on system stability - Cafe failure → customer exodus → mall collapse - Removing break-interval constraint improves survival dramatically

THINGS TO TRY

Experiment 1: Economic Shock Response

Question: How do regional vs. city malls respond to economic shocks?

Method: 1. Setup Regional mall, α = 1.6 2. Run and observe collapse pattern 3. Setup City mall, α = 1.6 4. Compare resilience

Expected: Regional collapses (occupancy → 30%), City degrades gracefully (occupancy → 70-80%)

Experiment 2: Critical Threshold Identification

Question: What is the exact critical α for regional mall collapse?

Method: 1. Run Regional mall at α = 1.0, 1.2, 1.4, 1.6, 1.8, 2.0 2. Record final occupancy rates at Day 360 3. Plot occupancy vs. α to identify threshold

Expected: Sharp transition around α = 1.6

Experiment 3: Social Network Amplification

Question: Does social influence amplify or dampen mall decline?

Method: 1. Regional mall, α = 1.5 2. Run with lambda = 0.2 (low social influence) 3. Run with lambda = 0.8 (high social influence) 4. Compare experience trajectories

Expected: High lambda amplifies negative experiences, accelerating decline

Experiment 4: Keystone Cafe Effect

Question: How critical are cafes to mall survival?

Method: 1. Modify break-interval from 2 to 8 2. Observe how cafe necessity affects mall stability 3. Compare occupancy outcomes

Expected: Longer break-interval (less cafe dependency) → higher survival rates

Experiment 5: Viability Check Frequency

Question: Do more frequent checks accelerate or prevent collapse?

Method: 1. Regional mall, α = 1.5 2. Run with shop-check-days = 30 (monthly checks) 3. Run with shop-check-days = 180 (semi-annual checks) 4. Compare collapse patterns

Expected: More frequent checks → faster initial closure → stronger cascade

Experiment 6: Experience Memory Effects

Question: Does experience hysteresis affect mall resilience?

Method: 1. Regional mall, α = 1.5 2. Run with zeta = 0.3 (low memory, rapid updating) 3. Run with zeta = 0.9 (high memory, slow updating) 4. Compare experience volatility and mall stability

Expected: Low zeta → more volatile experience → faster response to decline

EXTENDING THE MODEL

Possible Enhancements

  1. Anchor Store Effects
    Add large anchor stores with different revenue models and externality effects on specialist retailers

  2. Online Competition
    Incorporate online shopping channel with risk/convenience trade-offs affecting mall visit probability

  3. Rent Dynamics
    Model landlord rent-setting behavior responding to occupancy rates

  4. Spatial Heterogeneity
    Add explicit 2D geography with distance-based shop attractiveness and corridor effects

  5. Marketing Interventions
    Test promotional campaigns, loyalty programs, or experience enhancements

  6. Renovation Investment
    Allow mall operators to invest in improvements affecting overall attractiveness

  7. Heterogeneous Customer Segments
    Differentiate customers by income, preferences, or shopping frequency

  8. Seasonal Effects
    Add quarterly variation in shopping intensity and category preferences

NETLOGO FEATURES

Technical Implementation

Error-Tolerant Plotting:
Uses carefully command to handle missing plots gracefully, allowing model to run with partial interface

Multi-Dimensional Measurement:
Experience calculation combines three normalized components (0-1 scale) reflecting different aspects of retail satisfaction

Dynamic Network Formation:
Social networks created at setup with random connections (3-8 neighbors per customer)

Logistic Decision Functions:
Visit probability uses logistic transformation to bound probabilities (0-1) while maintaining smooth response to experience

State-Based Agent Behavior:
Customers track multiple states (in-mall?, purchases-this-visit, spending-this-visit) reset per visit cycle

RELATED MODELS

NetLogo Library Models

  • Segregation (Schelling): Analogous threshold dynamics and tipping points
  • Virus on Network: Network effects and contagion spreading
  • Traffic Grid: Spatial congestion and flow dynamics

Published Agent-Based Retail Models

  • Heppenstall et al. (2006): Agent-based retail location modeling
  • Ge et al. (2018): Spatial retail competition with bounded rationality
  • D'Alessandro et al. (2015): Online vs. brick-and-mortar channel choice with social networks

THEORETICAL FOUNDATIONS

Retail Agglomeration Theory

Christaller (1933) - Central Place Theory:
Hierarchical organization of retail centers based on threshold populations and range of goods

Huff (1964) - Gravity Model:
Probabilistic customer allocation based on store attractiveness and distance

Hotelling (1929) - Spatial Competition:
Strategic clustering and location decisions in competitive retail markets

Experience Formation

Ben-Akiva & Lerman (1985) - Discrete Choice:
Utility-based shopping decisions with stochastic components

Hysteresis in Consumer Behavior:
Path-dependent experience formation (zeta parameter) reflects psychological persistence

Network Effects

Social Influence Theory:
Lambda parameter captures social vs. individual decision-making balance (lambda = 0 → fully individual, lambda = 1 → fully social)

KEY FINDINGS FROM MODEL

1. Critical Thresholds in Retail Ecosystems

Regional shopping centers exhibit non-linear collapse at critical economic pressure (α ≈ 1.6), while city centers show graceful degradation. This suggests fundamental differences in retail ecosystem resilience based on scale and diversity.

Implication: Small format retail centers face existential risk from economic shocks, while large diverse centers absorb shocks through redundancy.

2. Cascade Failure Mechanisms

Shop closures create negative feedback loops: 1. Reduced revenue → shop closure 2. Closure → experience penalty (β) → reduced visits 3. Reduced visits → further revenue decline → more closures 4. Accelerating collapse

Implication: Early intervention critical - once cascade begins, collapse accelerates

3. Keystone Retailer Effect

Cafes represent 18-21% of shops but have disproportionate impact on system stability through the break-interval constraint. Cafe closure forces customer exodus regardless of other shop availability.

Implication: Mall management should prioritize retaining amenity/service retailers (cafes, food courts) over merchandise retailers during economic stress

4. Multi-Dimensional Experience

Shopping experience determined by: - Purchase success (functional outcome) - Value obtained (economic satisfaction)
- Mall vitality (environmental quality)

All three dimensions necessary to predict visit behavior.

Implication: Mall performance metrics should extend beyond sales to include success rates, perceived value, and occupancy levels

5. Social Amplification

Higher social influence (lambda) amplifies both positive and negative experiences, creating tipping point dynamics. Malls can tip into "success spiral" or "failure spiral" depending on network sentiment.

Implication: Social media and word-of-mouth effects can accelerate both mall growth and decline

CREDITS AND REFERENCES

Model Development

Author: Steven D'Alessandro
Institution: Edith Cowan University
Contact: s.dalessandro@ecu.edu.au
Date: April 2026
Version: 1.0

Key References

Retail Agglomeration Theory:

Christaller, W. (1933). Die zentralen Orte in Süddeutschland. Jena: Gustav Fischer.

Huff, D. L. (1964). Defining and estimating a trading area. Journal of Marketing, 28(3), 34-38.

Hotelling, H. (1929). Stability in competition. Economic Journal, 39(153), 41-57.

Discrete Choice & Consumer Behavior:

Ben-Akiva, M., & Lerman, S. R. (1985). Discrete choice analysis: Theory and application to travel demand. Cambridge, MA: MIT Press.

Agent-Based Modeling in Retail:

Heppenstall, A. J., Evans, A. J., & Birkin, M. H. (2006). Using hybrid agent-based systems to model spatially-influenced retail markets. Journal of Artificial Societies and Social Simulation, 9(3).

Ge, Y., Curland, C. R., Brint, A., & Macredie, R. (2018). Modelling consumer spatial behaviour in retail distribution. Journal of Modelling in Management, 13(1), 146-166.

Related Modeling Work:

D'Alessandro, Steven, et al. "Browsing or buying: Adding shop dynamics and additional mall visit constraints in regional versus city mall simulations." 15th International Conference on Modeling and Applied Simulation: MAS 2016. CAL-TEK Srl, 2016.

Retail Data Sources:

Australian Bureau of Statistics (ABS). Retail Trade Australia (Cat. 8501.0). Category distributions for Regional and City shopping centers.

Acknowledgments

This model builds on retail agglomeration theory, agent-based modeling techniques from the NetLogo community, and empirical retail data from the Australian Bureau of Statistics.

COPYRIGHT AND LICENSE

Copyright 2026 Steven D'Alessandro

This model may be used and modified for academic research purposes. Please cite appropriately if used in publications.

Suggested citation:
D'Alessandro, Steven (2026). Shopping Mall Ecosystem Dynamics: An Agent-Based Model of Retail Agglomeration Under Economic Stress. NetLogo model. Edith Cowan University.

MODEL SUMMARY

Purpose: Explore critical thresholds and cascade failures in shopping mall ecosystems

Agents: Customers (experience-based shopping decisions) and Shops (viability-based survival)

Key Innovation: Multi-dimensional experience (purchase success + value + vitality)

Main Finding: Regional malls exhibit critical threshold collapse (α ≈ 1.6), while city malls show resilience through scale and diversity

Applications: Retail strategy, mall management, economic policy, urban planning

Platform: NetLogo 6.2+

Computational Requirements: Low (runs quickly on standard hardware)

Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

breed [customers customer]
breed [shops shop]

customers-own [
  my-experience          ; Xj - customer experience with mall
  my-network             ; social network connections
  days-since-visit       ; tj - time since last mall visit
  in-mall?               ; currently visiting mall
  path-length            ; current path length in mall
  ticks-in-mall          ; time spent in current visit
  last-coffee-tick       ; when last visited cafe
  disposable-income      ; available money
  days-since-payday      ; counter for income
  bricks-preference      ; Ψj - preference for physical vs online
  category-preferences   ; ϕj(q) - preferences for each category
  network-experience     ; X̄j - mean experience including network
  
  ; Visit tracking for multi-dimensional experience
  purchases-this-visit   ; number of purchases made
  spending-this-visit    ; total money spent
  shops-visited-count    ; shops encountered this visit
]

shops-own [
  shop-category          ; which retail category (1-6)
  revenue                ; accumulated revenue
  revenue-target         ; R - breakeven revenue needed
  customers-served       ; count of customers this period
  item-cost              ; average item cost
  occupied?              ; is shop still operating
]

globals [
  ; Retail categories
  FOOD-RETAILING
  HOUSEHOLD-GOODS
  CLOTHING-FOOTWEAR
  DEPARTMENT-STORES
  CAFES-FOOD
  OTHER-SERVICES
  
  ; Category costs
  category-costs
  category-names
  
  ; Mall parameters (note: mall-type created by chooser widget)
  total-shops
  occupancy-rate
  day-counter
  
  ; Model parameters (note: alpha, zeta, lambda, beta, shop-check-days, visit-interval, break-interval created by slider widgets)
  max-path-length        ; P - maximum possible path (40 ticks)
  
  ; Statistics
  total-customers-ever
  shops-by-category
  dead-shops-count
]

to setup
  clear-all
  
  ; Initialize constants
  set FOOD-RETAILING 1
  set HOUSEHOLD-GOODS 2
  set CLOTHING-FOOTWEAR 3
  set DEPARTMENT-STORES 4
  set CAFES-FOOD 5
  set OTHER-SERVICES 6
  
  ; Set category costs (from ABS data in paper)
  set category-costs [150 250 100 200 10 50]
  set category-names ["Food" "Household" "Clothing" "Dept Store" "Cafe" "Other"]
  
  ; Interface variables (mall-type, alpha, zeta, lambda, beta, shop-check-days, visit-interval, break-interval) 
  ; are set by chooser/sliders - no need to initialize here
  
  set max-path-length 40          ; 10 hours in 15-min intervals
  
  set day-counter 0
  set total-customers-ever 0
  set dead-shops-count 0
  
  ; Create mall based on type
  setup-mall
  setup-customers
  setup-social-networks
  
  reset-ticks
end 

to setup-mall
  ; Set total-shops based on mall type to avoid division by zero
  ifelse mall-type = "Regional"
  [
    set total-shops 48            ; Expected total for regional mall
    ; Regional mall distribution (from paper Table 1)
    create-shops 1 [ setup-shop FOOD-RETAILING ]           ; 2% -> 1 shop
    create-shops 4 [ setup-shop HOUSEHOLD-GOODS ]          ; 7% -> 4 shops
    create-shops 12 [ setup-shop CLOTHING-FOOTWEAR ]       ; 24% -> 12 shops
    create-shops 1 [ setup-shop DEPARTMENT-STORES ]        ; 3% -> 1 shop
    create-shops 9 [ setup-shop CAFES-FOOD ]               ; 18% -> 9 shops
    create-shops 21 [ setup-shop OTHER-SERVICES ]          ; 42% -> 21 shops
  ]
  [
    set total-shops 321           ; Expected total for city mall
    ; City mall distribution (from paper Table 1)
    create-shops 6 [ setup-shop FOOD-RETAILING ]           ; 2% -> 6 shops
    create-shops 13 [ setup-shop HOUSEHOLD-GOODS ]         ; 4% -> 13 shops
    create-shops 109 [ setup-shop CLOTHING-FOOTWEAR ]      ; 34% -> 109 shops
    create-shops 3 [ setup-shop DEPARTMENT-STORES ]        ; 1% -> 3 shops
    create-shops 68 [ setup-shop CAFES-FOOD ]              ; 21% -> 68 shops
    create-shops 122 [ setup-shop OTHER-SERVICES ]         ; 38% -> 122 shops
  ]
  
  set total-shops count shops  ; Update to actual count
  update-occupancy-rate
  
  ; Position shops in a grid pattern
  let shop-list sort shops
  let cols ceiling sqrt total-shops
  let row 0
  let col 0
  foreach shop-list [ s ->
    ask s [
      setxy (col * 3 - max-pxcor + 5) (row * 3 - max-pycor + 5)
      set col col + 1
      if col >= cols [
        set col 0
        set row row + 1
      ]
    ]
  ]
end 

to setup-shop [category]
  set shop-category category
  set shape "house"
  set occupied? true
  
  ; Set color based on category
  if category = FOOD-RETAILING [ set color yellow ]
  if category = HOUSEHOLD-GOODS [ set color orange ]
  if category = CLOTHING-FOOTWEAR [ set color pink ]
  if category = DEPARTMENT-STORES [ set color violet ]
  if category = CAFES-FOOD [ set color blue ]
  if category = OTHER-SERVICES [ set color green ]
  
  set size 1.5
  set item-cost item (category - 1) category-costs
  
  ; Expected customer count based on mall type
  let expected-customers ifelse-value (mall-type = "Regional") [1000] [6000]
  
  ; Revenue target varies by category - lower cost items need more transactions
  ; R = α * P̄c * (Ts/Tv) * Nc / Ns (from equation 4 in paper)
  set revenue-target (alpha * item-cost * (shop-check-days / visit-interval) * 
                      expected-customers / total-shops * 1.2)  ; 20% markup
  
  set revenue 0
  set customers-served 0
end 

to setup-customers
  let num-customers ifelse-value (mall-type = "Regional") [1000] [6000]
  
  create-customers num-customers [
    set shape "person"
    set color white
    set size 1
    
    ; Initialize experience to random value between 0.8 and 1.0 (equation 3)
    set my-experience 0.8 + random-float 0.2
    set network-experience my-experience
    
    ; Random starting position
    setxy random-xcor random-ycor
    
    ; Initialize customer properties
    set days-since-visit random visit-interval
    set in-mall? false
    set path-length 0
    set ticks-in-mall 0
    set last-coffee-tick 0
    
    ; Income management
    set disposable-income 500 + random 1000
    set days-since-payday random 14
    
    ; Preferences (higher means stronger preference for physical shopping)
    set bricks-preference 0.5 + random-float 0.5
    
    ; Category preferences (how much they like each category)
    set category-preferences []
    repeat 6 [
      set category-preferences lput (0.3 + random-float 0.7) category-preferences
    ]
    
    ; Initialize visit tracking variables
    set purchases-this-visit 0
    set spending-this-visit 0
    set shops-visited-count 0
    
    set my-network []
  ]
  
  set total-customers-ever num-customers
end 

to setup-social-networks
  ; Create random social networks - each customer connected to ~5 others
  ask customers [
    let connections-needed 3 + random 5
    let potential-friends other customers
    
    repeat connections-needed [
      if any? potential-friends [
        let friend one-of potential-friends
        set my-network lput friend my-network
        ask friend [ set my-network lput myself my-network ]
        set potential-friends potential-friends with [self != friend]
      ]
    ]
  ]
end 

to go
  if not any? customers [ stop ]
  if not any? shops with [occupied?] [ stop ]
  
  ; Increment day counter
  set day-counter day-counter + 1
  
  ; Update customer income every 14 days (bi-weekly pay)
  ask customers [
    set days-since-payday days-since-payday + 1
    if days-since-payday >= 14 [
      set disposable-income disposable-income + (300 + random 700)
      set days-since-payday 0
    ]
  ]
  
  ; Customers decide whether to visit mall
  ask customers with [not in-mall?] [
    if decide-to-visit-mall? [
      start-mall-visit
    ]
    set days-since-visit days-since-visit + 1
  ]
  
  ; Customers currently in mall continue shopping
  ask customers with [in-mall?] [
    continue-mall-visit
  ]
  
  ; Update social network experiences
  ask customers [
    update-network-experience
  ]
  
  ; Check shop viability every 90 days
  if day-counter mod shop-check-days = 0 [
    check-shop-viability
  ]
  
  update-occupancy-rate
  refresh-displays
  tick
end 

to-report decide-to-visit-mall?
  ; Probability of visiting mall based on equation 4:
  ; pj = arctan(tj * X̄j * βj * ς * Ψj)
  
  let time-factor days-since-visit / visit-interval
  let occupancy-factor occupancy-rate
  let experience-factor network-experience
  let preference-factor bricks-preference
  
  ; Apply penalty for dead shops
  let dead-penalty beta ^ dead-shops-count
  
  ; Logistic probability function: 1 / (1 + exp(-α * factors))
  let combined-factor (time-factor * experience-factor * 
                       dead-penalty * occupancy-factor * 
                       preference-factor)
  
  let visit-probability 1 / (1 + exp (- alpha * combined-factor))
  
  report random-float 1 < visit-probability
end 

to start-mall-visit
  set in-mall? true
  set days-since-visit 0
  set ticks-in-mall 0
  set last-coffee-tick 0
  set path-length 0
  set purchases-this-visit 0
  set spending-this-visit 0
  set shops-visited-count 0
  set color red
  
  ; Move to mall entrance
  move-to one-of shops with [occupied?]
end 

to continue-mall-visit
  set ticks-in-mall ticks-in-mall + 1
  set path-length path-length + 1
  
  ; Check if need coffee break (every 4 ticks = 1 hour)
  if ticks-in-mall - last-coffee-tick >= break-interval [
    ; Try to find a cafe
    let nearby-cafes shops with [occupied? and shop-category = CAFES-FOOD] in-radius 5
    
    ifelse any? nearby-cafes [
      ; Visit cafe and reset coffee timer
      move-to one-of nearby-cafes
      set last-coffee-tick ticks-in-mall
      
      ; Make purchase at cafe
      attempt-purchase [shop-category] of one-of nearby-cafes
    ]
    [
      ; No cafe available - must leave mall
end -mall-visit
      stop
    ]
  ]
  
  ; Shop at a random store if not at coffee break
  if random-float 1 < 0.3 [  ; 30% chance to enter a shop each tick
    let nearby-shops shops with [occupied?] in-radius 5
    if any? nearby-shops [
      let target-shop one-of nearby-shops
      move-to target-shop
      attempt-purchase [shop-category] of target-shop
    ]
  ]
  
  ; Decide whether to leave mall
  if path-length >= max-path-length or random-float 1 < 0.05 [
end -mall-visit
  ]
end 

to attempt-purchase [category]
  let cost item (category - 1) category-costs
  let pref item (category - 1) category-preferences
  
  ; Count this as a shop visit
  set shops-visited-count shops-visited-count + 1
  
  ; Purchase probability based on preference and disposable income
  if disposable-income >= cost and random-float 1 < pref [
    set disposable-income disposable-income - cost
    
    ; Track purchase for experience calculation
    set purchases-this-visit purchases-this-visit + 1
    set spending-this-visit spending-this-visit + cost
    
    ; Record sale for shop
    let target-shop one-of shops-here with [shop-category = category]
    if target-shop != nobody [
      ask target-shop [
        set revenue revenue + cost
        set customers-served customers-served + 1
      ]
    ]
  ]
end 

to end-mall-visit
  ; Calculate multi-dimensional experience (average of 3 components):
  
  ; 1. Purchase success rate (purchases / shops visited)
  let purchase-rate 0
  if shops-visited-count > 0 [
    set purchase-rate purchases-this-visit / shops-visited-count
  ]
  
  ; 2. Value obtained (normalized spending, capped at 1.0)
  ; Expected spending per visit ~$300, so normalize to 0-1 range
  let value-score min list 1.0 (spending-this-visit / 300)
  
  ; 3. Mall vitality (proportion of open shops encountered)
  let nearby-shops shops in-radius 10
  let vitality-score 1.0  ; default if no shops nearby
  if any? nearby-shops [
    set vitality-score count nearby-shops with [occupied?] / count nearby-shops
  ]
  
  ; Average the three dimensions
  let current-experience (purchase-rate + value-score + vitality-score) / 3
  
  ; Apply hysteresis: Xj(v) = ζXj(v-1) + (1-ζ) * current experience
  set my-experience zeta * my-experience + (1 - zeta) * current-experience
  
  ; Penalty for encountering dead shops (beta penalty)
  let encountered-dead? any? shops in-radius 10 with [not occupied?]
  if encountered-dead? [
    set my-experience my-experience * beta
  ]
  
  set in-mall? false
  set color white
  
  ; Return home
  setxy random-xcor random-ycor
end 

to update-network-experience
  ; Calculate mean experience including social network (equation 5):
  ; X̄j = λXj + (1-λ) * Σ(Xj of neighbors) / n
  
  ifelse length my-network > 0 [
    let network-avg mean [my-experience] of turtle-set my-network
    set network-experience lambda * my-experience + (1 - lambda) * network-avg
  ]
  [
    set network-experience my-experience
  ]
end 

to check-shop-viability
  ask shops with [occupied?] [
    ; Shop must meet revenue target or it closes
    ifelse revenue >= revenue-target [
      ; Shop survives - reset revenue counter
      set revenue 0
      set customers-served 0
    ]
    [
      ; Shop fails
      set occupied? false
      set color gray
      set dead-shops-count dead-shops-count + 1
      
      ; Penalize all customers who have this shop in their experience
      ask customers [
        set my-experience my-experience * beta
      ]
    ]
  ]
  
  update-occupancy-rate
end 

to update-occupancy-rate
  ifelse total-shops > 0 [
    set occupancy-rate count shops with [occupied?] / total-shops
  ]
  [
    set occupancy-rate 0
  ]
end 

to refresh-displays
  ; Use carefully to avoid errors if plots don't exist
  
  carefully [
    set-current-plot "Customer Count"
    plot count customers with [in-mall?]  ; Changed: shows customers currently in mall
  ] []
  
  carefully [
    set-current-plot "Shop Count by Category"
    set-current-plot-pen "Food"
    plot count shops with [occupied? and shop-category = FOOD-RETAILING]
    set-current-plot-pen "Household"
    plot count shops with [occupied? and shop-category = HOUSEHOLD-GOODS]
    set-current-plot-pen "Clothing"
    plot count shops with [occupied? and shop-category = CLOTHING-FOOTWEAR]
    set-current-plot-pen "Dept Store"
    plot count shops with [occupied? and shop-category = DEPARTMENT-STORES]
    set-current-plot-pen "Cafes"
    plot count shops with [occupied? and shop-category = CAFES-FOOD]
    set-current-plot-pen "Other"
    plot count shops with [occupied? and shop-category = OTHER-SERVICES]
  ] []
  
  carefully [
    set-current-plot "Occupancy Rate"
    plot occupancy-rate * 100
  ] []
  
  carefully [
    set-current-plot "Average Experience"
    if any? customers [
      plot mean [my-experience] of customers
    ]
  ] []
end 

There is only one version of this model, created 2 days ago by Steven D'Alessandro.

Attached files

File Type Description Last updated
Regional v CIty Malls.png preview Preview for 'Regional v CIty Malls' 2 days ago, by Steven D'Alessandro Download

This model does not have any ancestors.

This model does not have any descendants.