← 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

Problem

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

My contribution

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.

Recorded 24-hour interface showing agents, exposure and three priced zones

Model and controller

Each agent received a departure time, vehicle type, origin, destination, willingness to pay and time sensitivity. Demand came from Dublin SCATS detector counts; direct NO₂ factors came from COPERT v5 and roadside evidence.

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

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

Results

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.

The benefit was not network-wide. External-boundary trips rose 18.9%, creating new exposure along parts of the cordon. The central finding is that 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

Limits and next steps

Simplified atmospheric dispersion, relative detector counts, perfect-information routing and reduced-scale sensitivity tests limit 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

Complete 41-page report covering the data pipeline, simulation architecture, validation, experiments and limitations.

Next projectActive wind blade stabilization