Step 1 — Trip Generation HOW MANY trips?
Question: For each traffic zone, how many trips start there (productions Pi) and how many trips end there (attractions Aj)? This is the total demand — no information yet about where the trips go.
Input
- Zone system (TAZ) with socio-economic data
- Households by car ownership (0 / 1 / 2+ cars)
- Employment by type: retail & non-retail jobs
- Trip rates (trips per household / per job, per day)
- Purpose rates (cross-class)
- Regression β coefficients (regression)
Output
- Pi — trips produced in zone i
- Aj — trips attracted to zone j
- Balanced so that ΣP = ΣA (a key consistency rule)
Method selector
Switch method — the panel and the results update. Compare them side-by-side at the bottom.
Method inputs
Trip rates (the model coefficients)
Rate matrix: Every household category has an average number of daily trips. Change a rate and watch all productions change.
Zone data (the input table)
Edit any cell. Total households is computed for you.
| Zone | HH 0 cars | HH 1 car | HH 2+ cars | Retail jobs | Non-retail jobs | Total HH |
|---|
📚 Further Explorations
Expand your Trip Generation modelling capabilities.
Results — Trip Rate Pi and Aj
These are the numbers that will be handed to Step 2.
| Zone | Pi | Aj raw | Aj balanced |
|---|
Method comparison
Same zone data, three different generation models.
Balancing control
The 4-step model requires
$$
\sum P = \sum A
$$
Attractions are usually scaled up/down to match productions.
➡ Hand-off to Step 2 (Trip Distribution)
| Zone | Pi (trips/day) | Aj (trips/day) |
|---|
Step 2 — Trip Distribution WHERE do trips go?
Question: Of the Pi trips produced in zone i, how many go to each zone j? The answer is to build an origin-destination O-D matrix Tij, solved with a gravity model.
Input
- Pi and Aj from Step 1
- An impedance / skim matrix cij — travel time (or cost) between every zone pair
- A deterrence function f(c) — e.g. exp(−βc) or c−n
Output
- O-D matrix Tij (trips/day from i to j) with one, both, or no exact constraints
- Row sums ≈ Pi, column sums ≈ Aj
- Average trip time — a key validation statistic
Method
1 · Inputs from Step 1 FIXED
These are read-only here — go back to Step 1 to change them.
| Zone | Pi (prod.) | Aj (attr.) |
|---|
2 · Deterrence & skim function f(cij)
Controls how strongly travel time discourages trips. Higher β (or n) → shorter trips.
3 · Impedance (skim) matrix cij — minutes
Symmetric travel time between every zone pair. The diagonal is the intrazonal time.
Constraint check
Results — O-D matrix Tij (trips/day)
Darker blue = more trips. Row sums should recover Pi; column sums should recover Aj.
Convergence & validation statistics
➡ Hand-off to Step 3 (Mode Choice)
Each cell Tij of the matrix above will now be split into transport modes
(car / bus / rail / …) using a logit model.
Before trusting the matrix, a planner checks:
• do row sums equal Pi and column sums equal Aj?
• is the average trip time plausible for this city?
• does the trip-length distribution look sensible?
Step 3 — Mode Choice WHICH transport mode?
Question: For each O-D pair, how many travellers use car, bus, rail, bike, walk…?
Input
- O-D matrix Tij from Step 2
- Level-of-service per mode: in-vehicle time, wait, walk, cost
- Traveller characteristics (income, car ownership)
- Behavioural coefficients βtime, βcost (from surveys)
Output
- Mode-specific O-D matrices: Tijcar, Tijbus
- Modal split shares (% car / % bus)
- Average level-of-service per mode
1 · Level-of-service per mode
These define how attractive each mode is. Time scales with the skim matrix; cost has a flat component plus a distance-based one.
2 · Behavioural coefficients β
Negative β means "more of this = less utility". Ratio of the two gives the value of time.
Multinomial Logit Model
$$ V_m = \beta_{\text{time}} \cdot \text{time}_m + \beta_{\text{cost}} \cdot \text{cost}_m $$ $$ \text{Pr}(m) = \frac{\exp(V_m)}{\sum_{k} \exp(V_k)} $$ $$ T_{ij}^m = T_{ij} \cdot \text{Pr}(m) $$Utility $V$ dictates choice. It is what the traveller "likes". Higher utility $\rightarrow$ higher probability.
Results — modal split
Mode-specific O-D matrices
Click any cell to inspect the LOS / utility / probability for that O-D pair.
O-D pair inspector
➡ Hand-off to Step 4 (Network Assignment)
Only the O-D matrix of the modes with the "Add vehicles to Traffic Assignment" checkbox ticked (in their respective mode configurations above) will be passed to Step 4. Person-trips for these modes are divided by their Occupancy (pax/veh) and multiplied by their PCU equivalent. These PCUs are summed into a single demand matrix to calculate physical road congestion.
Step 4 — Multimodal Network Assignment WHICH route?
Question: Which links of the road network carry the people trips, and how congested do the vehicles make it?
Input
- Car O-D matrix from Step 3
- Network topology: nodes, links, free-flow time t0, capacity
- Volume-Travel time function (e.g. BPR, Greenshields) parameters
- Assignment Algorithm & objective (All-or-Nothing / User Equilibrium/ System Optimal)
Output
- Link flows va (veh/day or veh/h)
- Congested travel times ta, v/c ratios
- Network performance metric: total vehicle-hours, average speed
- Price of Anarchy (UE vs SO)
Network links
Time of day
Assignment uses the demand of the selected period. Peak-hour profiles are the standard for congestion analysis.
Assignment controls
BPR Volume-Delay & User Equilibrium
$$ t_a(v_a) = t_{0,a} \left[ 1 + \alpha \left(\frac{v_a}{C_a}\right)^\beta \right] $$Equilibrium (Wardrop's First Principle): No traveller can unilaterally reduce their travel time by changing routes.
Assignment is where the network's capacity finally matters — the same demand produces very different flows on a sparse vs. dense network.
🔀 Advanced: MSA vs Frank-Wolfe Convergence
Compare algorithmic efficiency. Frank-Wolfe uses mathematical line-search, while MSA blindly averages sequential loads.
📈 Advanced: Price of Anarchy (PoA) Sweep
Test how selfish routing (UE) degrades the system compared to social optimum (SO) as overall traffic demand scales up from 40% to 200%.
🏘 Advanced: Induced Demand & Land-Use
"Build it and they will come." Simulates how improving road capacity induces new trips and shifts demographics.
🔄 Advanced: Full 4-Step Feedback Loop
When enabled, congested link times are fed back as the new skim, and Steps 2-4 are re-run iteratively until the skim stabilises. This is how real-world master plans are resolved.
📚 Further Explorations
Bridge the gap between macro-level planning and physical reality.
Network map
Emissions summary
Link results
Performance
➡ End of the 4-step model
The multimodal network flows and congestion metrics above represent the final baseline product of the classical 4-step process. From here, a planner can:
• Environmental Impact: Check total system $CO_2$ emissions and localized congestion hotspots.
• Infrastructure Evaluation: Propose a scheme (e.g., convert a car lane to a dedicated bus lane) and observe the modal shift.
• Advanced Feedback: Expand the collapsibles above to run Induced Demand loops or assess the Price of Anarchy.