Traffic Agents

Nine signalised junctions, five controllers, and an honest way to tell them apart. One PPO policy shared by every junction, scored against four hand-written controllers on identical arrivals.

The result

Delay per vehicle, lower is better. Scored on 5 seeds of arrivals the policy never trained on. The bar is two standard errors of the difference, and it was fixed before the run: beat actuated at 900 and max-pressure at 1,300.

DemandLearnedBest baseline Delay savedBar (2 SE)Verdict
600 veh/h64.57 ± 0.66actuated 64.43 s-0.14 s1.49 sinside noise
900 veh/h92.61 ± 1.28actuated 97.52 s+4.91 s2.94 sbeats it
1,300 veh/h107.33 ± 1.14max-pressure 111.70 s+4.37 s3.60 sbeats it
At the lightest demand the result is inside its own noise, and is reported that way. The junctions are not contested there, so no signal plan can beat a timer by a margin this measurement can see — a win there would be evidence the error bars were wrong.

Every controller at every level

DemandControllerMean delay (s) ± SEThroughput (veh/h)
600 veh/hactuated (best baseline)64.430.3516,729
600 veh/hlearned64.570.6616,651
600 veh/hgreedy66.211.0316,490
600 veh/hmax-pressure66.830.8116,438
600 veh/hfixed-time82.910.5316,342
900 veh/hlearned92.611.2818,686
900 veh/hactuated (best baseline)97.520.7218,637
900 veh/hmax-pressure97.520.4717,958
900 veh/hgreedy98.770.9817,707
900 veh/hfixed-time99.930.8418,460
1,300 veh/hlearned107.331.1419,404
1,300 veh/hmax-pressure (best baseline)111.701.3918,268
1,300 veh/hgreedy111.921.1118,224
1,300 veh/hfixed-time112.481.0618,842
1,300 veh/hactuated113.071.5019,535

Throughput is near-identical across all five, because a grid at this demand is limited by its own capacity. The difference a signal plan makes shows up in waiting time.

Checkpoint ladder

Every saved checkpoint scored on the same arrivals. The best is not the last.

StepsDelay
76,800138.0 s
230,400114.7 s
537,60091.6 s
998,40086.2 s (best)
1,536,00091.1 s

The panel

One pass over the live panel: every control exercised, nothing staged.
01-live-city
Nine signalised junctions on one stream of arrivals. Queue length is the width of the bar on each approach.
02-controller-fixed-time
Fixed-time: a cycle that ignores traffic.
02-controller-max-pressure
Max-pressure, swapped in without resetting the traffic — the change shows in queues that already exist.
03-saturated
Demand raised to 1,100 veh/h, where the difference between controllers stops being a rounding error.
04-why-this-phase
Any junction will say why its phase is green: the pressure on each phase, and what it has been serving.
05-head-to-head
Two controllers stepped on identical arrivals.
06-head-to-head-later
The same race, further in.

What this is not