2017 · Problem B — Ski Slope
Network flow Queueing Terrain / DEM SimulationThe prompt, restated
A resort developer owns a parcel of mountainous land and wants to lay out a new ski area on it. The team must design the resort: choose where on the terrain to put ski runs, where to put chairlifts, what capacity each lift should have, and how to balance run difficulty (beginner / intermediate / expert) so the resort attracts a mixed market. The developer also wants the design to be safe — too many skiers per acre creates collisions and lift-line backups; too few wastes the investment.
The team is asked to (1) build a model that takes a piece of terrain (a digital elevation model, DEM, or a stylized contour map provided in the problem) and produces a candidate run layout, including a difficulty classification rule based on slope and width; (2) decide how many chairlifts, of what capacity, and where to place their base and summit stations; (3) simulate a peak day with a stated number of skiers and estimate throughput, average wait time at lifts, and on-slope density; (4) recommend a design and write a one-page memo to the developer covering capacity, safety, and what would have to change if climate warming shortens the operating season.
Key modeling idea
Two coupled subproblems. First, terrain $\to$ runs is a geometric / routing problem on a DEM: a run is a polyline from a high node to a lower node whose slope stays inside a target band (e.g., 25–40% grade for intermediate). Second, runs + lifts + skiers is a queueing network — each lift is an M/M/c server with capacity $c$ chairs per hour, each run is a "service station" with mean transit time depending on skier skill and slope. Steady-state throughput is bounded by the slowest lift or by an on-slope density limit.
Suggested approach
- Step 1 — Build the slope field. From the DEM (e.g., USGS 3DEP 10 m tiles), compute slope and aspect at every cell. Classify cells as green (< 25% grade), blue (25–40%), black (40–60%), or unusable (> 60% or wrong aspect for sun exposure).
- Step 2 — Route candidate runs. Treat each cell as a node in a weighted graph; edges go downhill only. Use shortest-path / minimum-cost paths (technique 7) from candidate summit points to base lodge candidates, with cost penalizing slope changes (skiers dislike flats and sudden drop-offs). Target ~6–10 runs across a balanced difficulty mix.
- Step 3 — Place lifts. Each lift connects a base elevation to a summit; lift capacity is roughly $c = N_{\text{chairs}} \times s_{\text{seats}} \times 3600 / \tau$ where $\tau$ is the loop time. Industry capacities: fixed-grip quad ~1,800 pph, detachable six-pack ~3,000 pph, gondola ~3,600 pph.
- Step 4 — Simulate a peak day. Each skier follows a Markov / random policy over runs they prefer; arrival at lift bottom is an M/M/c queue. Discrete-event sim for 1,000–5,000 skiers (technique 11). Outputs: lift wait time distribution, on-slope density (skiers per acre, target < 20).
- Step 5 — Recommendation. Trade off capex (~\$3M per fixed quad, ~\$10–15M per detachable six-pack [illustrative]) vs. ticket revenue vs. a comfort score (mean wait < 5 min, density below regulator threshold). Add a climate-warming stress test: raise the freezing line by 200 m and re-evaluate which lower runs remain skiable.
Data sources to consider
| Source | What you get |
|---|---|
| USGS 3DEP elevation tiles | 10 m or 1 m DEM for any real US site (Vail, Snowbird, etc.) |
| NOAA / NRCS SNOTEL stations | Snow-water-equivalent and base-depth time series at real ski resorts |
| NSAA (National Ski Areas Association) facts | Visitor counts, capex norms, ski area injury baselines |
| Lift industry catalogs (Doppelmayr, Leitner-Poma) | Real chair capacities, line speeds, costs |
| OpenStreetMap "piste" tag | Real run polylines from existing resorts — great for validation |
Common pitfalls
- Designing on a flat grid. The problem is fundamentally about elevation; if you do not use a DEM (or at least a 2D contour map) you've already lost the geometry.
- Confusing capacity and throughput. Installed lift capacity in passengers-per-hour is an upper bound; real throughput is limited by run length and ski speed. Bring both into the calculation.
- No on-slope density check. Many teams optimize lift capacity and forget that dumping 3,000 skiers/hour onto a single beginner run is dangerous. Target < 20 skiers/acre.
- Skill mix ignored. A resort that is 80% expert terrain will fail commercially. Industry mix is roughly 25% green, 50% blue, 25% black.
- No climate sensitivity. 2017 judges flagged teams that did not address how a warming climate threatens low-elevation runs and snow-making demand.
Python sketch
Toy DEM, slope classification, and a single-lift M/M/c queue.
import numpy as np
from math import factorial
# --- 1. synthetic DEM: a conical mountain ---
N = 200
x, y = np.meshgrid(np.linspace(-1, 1, N), np.linspace(-1, 1, N))
r = np.sqrt(x**2 + y**2)
elev = 1000 + 800 * np.exp(-1.5 * r) # metres, peak ~1800 m
# --- 2. slope field (rise/run, %) ---
dz_dy, dz_dx = np.gradient(elev, 50.0, 50.0) # 50 m cell size
slope = np.hypot(dz_dx, dz_dy) * 100 # percent grade
green = slope < 25
blue = (slope >= 25) & (slope < 40)
black = (slope >= 40) & (slope < 60)
print(f"green {green.mean():.1%} blue {blue.mean():.1%} black {black.mean():.1%}")
# --- 3. M/M/c lift queue: detachable six-pack ---
def mmc_wait(lam, mu, c):
"""Mean wait in queue (Erlang-C)."""
rho = lam / (c * mu)
if rho >= 1: return float("inf")
s = sum((c*rho)**k / factorial(k) for k in range(c))
p0 = 1 / (s + (c*rho)**c / (factorial(c) * (1 - rho)))
pq = ((c*rho)**c / (factorial(c) * (1 - rho))) * p0
return pq / (c*mu - lam)
lam = 2400 / 60 # 2,400 skiers/hour arriving, per minute
mu = 1 / 6 # service rate: 6-minute lift ride
c = 300 # six-pack carries 6 per chair, ~50 chairs in transit
print(f"avg lift wait = {mmc_wait(lam, mu, c)*60:.1f} s")
Sensitivity & validation checklist
- Vary peak-day skier count from 50% to 150% of design — does any lift saturate?
- Vary skill mix: 20/60/20 vs. 30/50/20 vs. 25/40/35; does revenue or wait time flip the recommended layout?
- Run climate stress: snow base < 30 cm closes runs below 1,400 m. What fraction of vertical drop survives a +2 °C scenario?
- Validate run geometry against a real comparable resort using OSM piste data — your total run length and lift count should be within a factor of ~2.
- Spot-check the queue model: at $\rho \to 1$, the Erlang-C wait time should explode.