Skip to content

Huff Probability Model

The Huff model answers: given our restaurant’s size and location, what fraction of nearby diners will choose us over competitors?

It’s based on the core idea that a customer’s probability of choosing any restaurant is proportional to its attractiveness and inversely proportional to the distance to it — summed across all options.

P(choose us) = Aᵢ / (Aᵢ + Σ Aⱼ)

Where attraction A = size × distance^(-β). Our attraction is computed at 10 m (effectively zero distance). Competitor attractions use actual distances from the API.

Our attraction:

sizeScore = min(10, (floorArea / 800) × 7 + 3)
uniqueBonus = 2.5 if cuisines ≤ 1 AND competitors < 5, else 0
ourAttraction = (sizeScore + uniqueBonus) × 10^(-β)

Competitor attraction (nearest 20):

attraction = 5.0 × max(distance, 50)^(-β)

Remaining competitors beyond nearest 20: Modeled at 1.3 × avg distance of nearest 20, each with attraction 5.0.

captureProb = (ourAttraction / totalAttraction) × 100

Then clamped by maxCapture and floored at 0.5% (previously 5%):

Competitor countMax capture
≤ 355%
≤ 1040%
≤ 3025%
≤ 10010%
≤ 3005%
300+3%

Output precision: 2 decimal places (e.g. 12.47%).

Beta is set by calcBeta() before Huff runs:

Service model / priceBetaDecay function
Delivery0.3Exponential
Takeaway0.5Exponential
High-end HKD 200+2.5Power
Premium HKD 100-2001.5Power
Budget / Mid (dine-in)0.8Exponential
  • Floor area: user input (sqft)
  • Competitors: FEHD licence database, filtered within 800 m, nearest 20 used directly
  • Beta: derived from service model and price band
captureProbMeaning
40–55%Near-monopoly — very few nearby competitors
20–40%Strong position in a competitive market
10–20%Average for a busy urban district
< 10%Highly competitive environment — differentiation critical
  • Uses FEHD F&B licences as a proxy for competitor count — excludes unlicensed stalls and hawkers
  • All competitors assigned the same baseline attraction (5.0) regardless of size or quality
  • Nearest 20 used directly; remainder modeled at a flat 1.3× average distance
  • No time-of-day variation (lunch competition may differ from dinner)
DateChange
2026-03-25Floor lowered from 5% → 0.5%; precision changed to 2 decimal places; granular maxCapture tiers added (55/40/25/10/5/3 based on competitor count)
2026-02-10Initial implementation — single 50% cap, 5% floor