← Selected work

Dynamic congestion pricing for Dublin

A full-day agent-based model testing whether emissions-responsive tolls can protect the city centre without shifting the problem elsewhere

Year
2026
Role
Simulation development, data pipeline and system design
Tools
Python, OSMnx, Rustworkx, NumPy
Comparison of baseline and dynamically priced nitrogen dioxide exposure across Dublin
Core-zone exposure, toll response and the spatial redistribution of emissions over 24 hours

The question

Road pricing usually targets delay or revenue. This project treated pricing as an environmental controller: charges rise with modelled NO₂ exposure and influence route choice before core concentrations exceed 12 µg/m³. Dublin supplied a real road network, detector data and a clear test of the trade-off between local exposure, mobility and affordability.

1,004,648Trips attempted in the full-day model
619,520Trips detoured under dynamic pricing
80.8%Reduction in through-traffic

Building the model

I led development of the custom discrete-time Python engine and geographic-data workflow, turning the team's system logic into a 1,440-step daily simulation. OSMnx supplied road topology, Rustworkx and NetworkX handled repeated routing, and NumPy and SciPy supported demand and spatial exposure. Full-scale runs took 12-14 hours.

Loading the full-resolution 24-hour run…
driver agentsNO₂ fieldpriced zones

Rendered from the completed simulation output: agent paths, minute-by-minute emissions, pricing response and spatial impact. Space toggles playback; arrow keys move 15 minutes.

Demand, exposure and pricing

I assigned each agent a departure time, vehicle type, origin, destination, willingness to pay and time sensitivity. I built travel demand from Dublin SCATS detector counts and estimated direct NO₂ emissions with COPERT v5 factors and roadside evidence.

Three nested zones charged entry according to local exposure. Agents balanced time against toll cost, while the model assigned route emissions to a spatial grid and decayed them minute by minute.

Baseline peak nitrogen dioxide exposure on the Dublin road network
Untolled baseline used to validate demand and spatial exposure

What the model showed

Dynamic pricing preserved completed trips while cutting core through-traffic by 80.8%. It detoured 619,520 trips, collected 55,525 tolls and generated €385,159 over the modelled day.

Dynamic pricing did not reduce exposure across the entire network. External-boundary trips rose 18.9%, creating new exposure along parts of the cordon. Protecting the core can transfer the burden unless the controller optimizes the surrounding network as well.

No-toll baseline versus dynamic pricing

MetricNo tollDynamic pricingChange
Trips completed1,004,5451,004,545No change
Through-traffic113,57321,845-80.8%
External-boundary trips486,279578,007+18.9%
Trips detoured-619,52061.7% of completed
Tolls collected-55,525€6.94 average
Total toll revenue-€385,158.97Full day
Peak nitrogen dioxide concentration across three Dublin pricing zones over 24 hours
Core exposure stays near the target while larger peaks move outward

What remains

The model simplifies atmospheric dispersion, scales demand from relative detector counts, assumes perfect-information routing and uses reduced-scale sensitivity tests. These choices limit direct policy interpretation. A next iteration should add queueing, sensitive locations, price inertia and a network-wide exposure objective.

Dynamic Congestion Pricing for Urban Emission Exposure

Dynamic Congestion Pricing for Urban Emission Exposure, page 1 of 41
Next projectShark StainForce portable cleaner