Ordinary day
Nothing goes wrong. Running times simply vary, as they do every day.
Fleet trial · 1,000 buses · 19 scenarios · 3 corridors
The deployed control laws, run twice across every way a corridor comes apart - once with nobody intervening, once under control - and every passenger second counted.
The verdict
Buses stayed evenly spaced, passengers waited less, and every second of the journey was counted - kerb, dwell, hold and ride.
24 km · 25 stops · 6-minute headway
−54% excess wait
60 km · 15 stops · 12-minute headway
−39% excess wait
300 km · 10 stations · 30-minute headway
−19% excess wait
Live trial · Lucknow
Ordinary day
Nothing goes wrong. Running times simply vary, as they do every day.
Loading the map and the current bus positions…
Nineteen ways a corridor comes apart
Each scenario ran twice on the same seed - once with nobody intervening, once under the deployed control laws - and the open-incident curve of both is drawn on every card.
24 km · 25 stops · 6-minute headway
Nothing goes wrong. Running times simply vary, as they do every day.
Departures leave the origin unevenly.
A crowd builds at one mid-route station.
One vehicle runs below fleet pace for the middle of its trip.
A stretch of road runs slow for a window, for every bus in it.
Scheduled departures do not run at all.
A slow bus into a crowded station on an unreliable day.
Demand close to seat capacity.
Buses stop reporting their position.
Fleet-wide, only 45% of instructions are followed.
The GPS feed is fresh, consistent, and wrong - drifting a headway per trip.
A modem republishes its last fix with a current timestamp.
A congestion window plus a map-match error on the buses inside it.
Five stops carry the whole route; the rest are quiet.
Four tiers of driver, some serving a quarter of each instruction.
Past the denied-boarding line, where seats bound waiting time.
A stretch alternating slow and fast once every headway.
Demand climbs through the whole run, so no timetable fits any bus.
One severe closure, then a long clean stretch to recover in.
How it works
A two-tier detector sweeps every corridor every minute: one tier reads the gap that exists, the other projects the gap that is forming.
Four control laws each propose an action; a hard safety filter and a cost ranking choose one, or none.
The chosen instruction reaches the driver as a timed hold or an alighting-only stop, with acknowledgement and expiry.
Every passenger second is counted once - waiting, dwelling, holding and riding - and both arms of the trial are compared on it.
Detector · every 60 s · Reactive + PredictiveEvery sixty seconds the detector measures the gap between every pair of buses and projects it forward, so a bunch is flagged before it forms.
Holds a bus at the origin until its planned gap to the bus ahead has opened.
860 of 24,900 decisions · 830 holds
Balances the gap ahead against the gap behind at every holding point.
6,914 of 24,900 decisions · 2,774 holds
Regulates on the gap ahead alone when the bus behind cannot be seen.
378 of 24,900 decisions · 276 holds
Lets a crowded leader drop off and run when its follower is close behind.
649 of 24,900 decisions · 0 holds
The passenger's bill
Every second a passenger spends - at the kerb, at the door, in a hold, on the road - is counted once, and both arms are compared on the total.
3 min of holding per bus
From 1,000 to 10,000
What the trial's per-bus effect means once every corridor runs under it.
Fleet trial report
The controller helped.
Buses stayed evenly spaced, passengers waited less, and every second of the journey was counted - kerb, dwell, hold and ride.
| Corridor | Shape | Length (km) | Stops | Headway (min) | Band | Hold cap (s) |
|---|---|---|---|---|---|---|
| City trunk | 24 km · 25 stops · 6-minute headway | 24 | 25 | 6 | Controllable band | 120 |
| Suburban radial | 60 km · 15 stops · 12-minute headway | 60 | 15 | 12 | Controllable band | 240 |
| Inter-city trunk | 300 km · 10 stations · 30-minute headway | 300 | 10 | 30 | High dispersion | 600 |
| Measurement | Left alone | Under control | Change |
|---|---|---|---|
Total passenger time the whole journey — kerb wait, dwell, hold and riding — the verdict | 57,147 h | 54,975 h | ▲ 3.8% |
Excess wait time per passenger at a stop — the field's headline metric | 106s | 49s | ▲ 54.0% |
Headway variability (CV) diagnostic only: it improves if every gap lengthens equally | 0.768 | 0.507 | ▲ 34.0% |
Arrivals that were bunched | 19.7% | 8.2% | ▲ 58.6% |
Passengers refused a seat rises if spacing was bought by stranding people — 4.8% of people offered a seat were refused one, 3.1% under control | 9,456 | 6,522 | ▲ 31.0% |
Journey time per bus the punctuality cost of being controlled | 101.4 min | 104.6 min | +3.2 min |
Arriving on time within five minutes of the booked time, early or late | 61% | 73% | ▲ 19.7% |
Lateness at the terminus mean, and the worst one bus in twenty | 0.0 min p95 10.6 min | 3.2 min p95 11.8 min | worst bus held 17.1 min |
| Measurement | Left alone | Under control | Change |
|---|---|---|---|
Total passenger time the whole journey — kerb wait, dwell, hold and riding — the verdict | 40,813 h | 40,323 h | ▲ 1.2% |
Excess wait time per passenger at a stop — the field's headline metric | 113s | 69s | ▲ 39.0% |
Headway variability (CV) diagnostic only: it improves if every gap lengthens equally | 0.547 | 0.404 | ▲ 26.2% |
Arrivals that were bunched | 8.4% | 3.3% | ▲ 61.4% |
Passengers refused a seat rises if spacing was bought by stranding people — 6.8% of people offered a seat were refused one, 4.6% under control | 5,084 | 3,514 | ▲ 30.9% |
Journey time per bus the punctuality cost of being controlled | 135.6 min | 139.3 min | +3.7 min |
Arriving on time within five minutes of the booked time, early or late | 52% | 61% | ▲ 18.0% |
Lateness at the terminus mean, and the worst one bus in twenty | 0.0 min p95 13.3 min | 3.7 min p95 14.6 min | worst bus held 20.8 min |
| Measurement | Left alone | Under control | Change |
|---|---|---|---|
Total passenger time the whole journey — kerb wait, dwell, hold and riding — the verdict | 1,15,559 h | 1,14,865 h | ▲ 0.6% |
Excess wait time per passenger at a stop — the field's headline metric | 354s | 287s | ▲ 19.0% |
Headway variability (CV) diagnostic only: it improves if every gap lengthens equally | 0.608 | 0.521 | ▲ 14.3% |
Arrivals that were bunched | 12.0% | 7.8% | ▲ 34.9% |
Passengers refused a seat rises if spacing was bought by stranding people — 9.7% of people offered a seat were refused one, 7.0% under control | 5,632 | 4,072 | ▲ 27.7% |
Journey time per bus the punctuality cost of being controlled | 440.6 min | 448.6 min | +8.0 min |
Arriving on time within five minutes of the booked time, early or late | 16% | 25% | ▲ 59.1% |
Lateness at the terminus mean, and the worst one bus in twenty | 0.0 min p95 41.1 min | 8.0 min p95 43.3 min | worst bus held 52.8 min |
| Scenario | Family | Net | Excess wait cut | Incidents | Outcome |
|---|---|---|---|---|---|
| Ordinary day | Ways a corridor comes apart | +2.5% | −64% | 223 → 103 | Helped |
| Ragged departures | Ways a corridor comes apart | +7.2% | −56% | 396 → 151 | Helped |
| Crowd at a station | Ways a corridor comes apart | +1.6% | −62% | 191 → 88 | Helped |
| One bus running late | Ways a corridor comes apart | +3.0% | −60% | 265 → 144 | Helped |
| Congestion window | Ways a corridor comes apart | +6.2% | −66% | 247 → 101 | Helped |
| Cancelled departures | Ways a corridor comes apart | +5.5% | −47% | 231 → 92 | Helped |
| Compounding failure | Ways a corridor comes apart | +2.3% | −48% | 311 → 173 | Helped |
| Peak loading | Ways a corridor comes apart | +2.8% | −64% | 228 → 113 | Helped |
| Vehicles off the map | Ways a corridor comes apart | +4.9% | −55% | 129 → 60 | Helped |
| Instructions not followed | Ways a corridor comes apart | +6.9% | −70% | 280 → 115 | Helped |
| Positions drifting off the road | Attacks on the estimator | +2.7% | −54% | 240 → 117 | Helped |
| Last known position, fresh timestamp | Attacks on the estimator | +4.5% | −64% | 237 → 93 | Helped |
| Congestion the map gets wrong | Attacks on the estimator | +5.0% | −60% | 261 → 166 | Helped |
| Five stops carry the route | Attacks on the controller | +6.4% | −66% | 137 → 64 | Helped |
| Instructions half-followed | Attacks on the controller | +2.1% | −31% | 226 → 148 | Helped |
| More passengers than seats | Attacks on the controller | −4.5% | −67% | 127 → 88 | Stress test |
| A stretch that keeps changing its mind | Attacks on the controller | +1.7% | −52% | 310 → 210 | Helped |
| A day that gets steadily worse | Attacks on the controller | +2.8% | −30% | 284 → 255 | Helped |
| One bad hour, then nothing | Attacks on the controller | +1.7% | −71% | 233 → 107 | Helped |
| Scenario | Family | Net | Excess wait cut | Incidents | Outcome |
|---|---|---|---|---|---|
| Ordinary day | Ways a corridor comes apart | +0.0% | −41% | 45 → 57 | No effect |
| Ragged departures | Ways a corridor comes apart | −1.4% | −60% | 58 → 43 | Stress test |
| Crowd at a station | Ways a corridor comes apart | −0.4% | −40% | 42 → 48 | Stress test |
| One bus running late | Ways a corridor comes apart | +3.9% | −51% | 64 → 54 | Helped |
| Congestion window | Ways a corridor comes apart | +1.8% | −57% | 81 → 63 | Helped |
| Cancelled departures | Ways a corridor comes apart | +1.2% | −25% | 35 → 40 | Helped |
| Compounding failure | Ways a corridor comes apart | +0.1% | −46% | 55 → 60 | No effect |
| Peak loading | Ways a corridor comes apart | −0.1% | −53% | 41 → 39 | Stress test |
| Vehicles off the map | Ways a corridor comes apart | +0.4% | −47% | 30 → 31 | No effect |
| Instructions not followed | Ways a corridor comes apart | +2.5% | −40% | 38 → 33 | Helped |
| Positions drifting off the road | Attacks on the estimator | −0.9% | −32% | 33 → 38 | Stress test |
| Last known position, fresh timestamp | Attacks on the estimator | −0.8% | −29% | 37 → 40 | Stress test |
| Congestion the map gets wrong | Attacks on the estimator | +1.5% | −61% | 90 → 79 | Helped |
| Five stops carry the route | Attacks on the controller | +0.0% | −45% | 39 → 38 | No effect |
| Instructions half-followed | Attacks on the controller | +1.0% | −29% | 48 → 49 | Helped |
| More passengers than seats | Attacks on the controller | −2.5% | −53% | 43 → 35 | Stress test |
| A stretch that keeps changing its mind | Attacks on the controller | −0.7% | −33% | 82 → 85 | Stress test |
| A day that gets steadily worse | Attacks on the controller | +0.0% | −20% | 100 → 78 | No effect |
| One bad hour, then nothing | Attacks on the controller | +1.3% | −59% | 70 → 67 | Helped |
| Scenario | Family | Net | Excess wait cut | Incidents | Outcome |
|---|---|---|---|---|---|
| Ordinary day | Ways a corridor comes apart | +0.5% | −25% | 58 → 70 | No effect |
| Ragged departures | Ways a corridor comes apart | −0.8% | −31% | 60 → 62 | Stress test |
| Crowd at a station | Ways a corridor comes apart | +1.5% | −37% | 64 → 68 | Stress test |
| One bus running late | Ways a corridor comes apart | +1.4% | −21% | 64 → 83 | Helped |
| Congestion window | Ways a corridor comes apart | +3.8% | −42% | 109 → 108 | Helped |
| Cancelled departures | Ways a corridor comes apart | +2.4% | −32% | 58 → 48 | Helped |
| Compounding failure | Ways a corridor comes apart | +2.1% | −21% | 94 → 88 | Helped |
| Peak loading | Ways a corridor comes apart | +0.0% | −43% | 53 → 53 | No effect |
| Vehicles off the map | Ways a corridor comes apart | +0.1% | −17% | 35 → 35 | No effect |
| Instructions not followed | Ways a corridor comes apart | +0.6% | −17% | 52 → 53 | Helped |
| Positions drifting off the road | Attacks on the estimator | +0.2% | −34% | 58 → 49 | No effect |
| Last known position, fresh timestamp | Attacks on the estimator | −1.7% | −21% | 32 → 49 | Stress test |
| Congestion the map gets wrong | Attacks on the estimator | −1.3% | −18% | 95 → 103 | Stress test |
| Five stops carry the route | Attacks on the controller | +1.7% | −29% | 57 → 73 | Helped |
| Instructions half-followed | Attacks on the controller | −0.2% | −7% | 47 → 43 | Stress test |
| More passengers than seats | Attacks on the controller | −1.9% | −28% | 62 → 69 | Stress test |
| A stretch that keeps changing its mind | Attacks on the controller | +0.3% | −6% | 89 → 84 | No effect |
| A day that gets steadily worse | Attacks on the controller | +1.1% | −5% | 157 → 155 | Helped |
| One bad hour, then nothing | Attacks on the controller | −0.7% | −52% | 88 → 124 | Stress test |
| Law | Decisions | Share | Holds | Hold time |
|---|---|---|---|---|
| Terminal dispatch | 860 of 24,900 | 3% | 830 | 303.5 min |
| Two-way holding | 6,914 of 24,900 | 28% | 2,774 | 2998.0 min |
| Self-equalising | 378 of 24,900 | 2% | 276 | 274.9 min |
| Alighting-only | 649 of 24,900 | 3% | 0 | 0.0 min |
Busiest stations
| Law | Decisions | Share | Holds | Hold time |
|---|---|---|---|---|
| Terminal dispatch | 409 of 7,470 | 5% | 391 | 158.7 min |
| Two-way holding | 1,188 of 7,470 | 16% | 636 | 1577.3 min |
| Self-equalising | 68 of 7,470 | 1% | 56 | 118.9 min |
| Alighting-only | 114 of 7,470 | 2% | 0 | 0.0 min |
Busiest stations
| Law | Decisions | Share | Holds | Hold time |
|---|---|---|---|---|
| Terminal dispatch | 404 of 4,980 | 8% | 376 | 130.2 min |
| Two-way holding | 1,019 of 4,980 | 20% | 476 | 3717.4 min |
| Self-equalising | 34 of 4,980 | 1% | 23 | 145.9 min |
| Alighting-only | 78 of 4,980 | 2% | 0 | 0.0 min |
Busiest stations
Every scenario was run twice on the same seed: once with nobody intervening, once under the deployed control laws. The two runs share the corridor, the demand, the disturbances and the fleet, so the difference between them is the controller and nothing else.
Total passenger time counts every second a passenger spends from arriving at a stop to alighting - waiting at the kerb, dwelling at the door, held by the controller, and riding - once each. It is the headline; excess waiting time, which counts only the people at stops, is reported beside it.
Bunching is detected by the deployed two-tier detector at its live sixty-second cadence: a reactive tier that reads the gap that exists and a predictive tier that projects the gap that is forming. Incidents are counted on both arms over one shared window.
Corridor results pool every scenario the corridor could read. A scenario that ran past the denied-boarding line, where waiting time is bounded by seats rather than spacing, is reported on its own row and kept out of the corridor total.
Every sixty seconds the detector measures the gap between every pair of buses and projects it forward, so a bunch is flagged before it forms.