ProjectsTraffic

Traffic

A commuter transit app I got carried away building at Georgia State, paired with two browser models on how local driving rules create jams and how to route when live maps are noisy.

Trigger a stop-and-go shockwave

Click any vehicle on the 1,600m corridor to tap its brakes, then switch between tight tailgating and cooperative headways.

Click any car on the highway (or press Tap brakes) to force a 3-second slowdown.

Mean speed88 km/h
Crawling (<29 km/h)0 cars
Throughput (60s)0 / min
On corridor36 cars
Corridor mean speed (last 90s)t = 0s · seed 42

Why I built TraffiQ

Getting to class across downtown Atlanta meant watching the Downtown Connector, surface streets, MARTA rail, and campus shuttles break down in completely different ways during the same rush hour. Trying to model when switching modes actually saved time pulled me into queueing theory and car-following math.

At Georgia State, that turned into our senior capstone, TraffiQ, a mobile app combining live road traffic, MARTA rail and bus feeds, and GSU’s Panther Express shuttles so students could compare real door-to-door times across driving, walking, and transit. I treated it as a personal project, ended up writing almost the entire codebase myself, and won Best in Class at the CS department showcase despite how scrappy parts of that code look to me now.

The highway simulator above strips away the transit feeds to isolate the core bottleneck physics: each driver only reacts to the gap immediately ahead, yet one tap of the brakes near capacity spawns a backward-moving shockwave long after the first car has accelerated away. Resetting reloads seed 42 with the exact same 36 cars so you can compare tight tailgating against cooperative headways on identical arrivals.

Arrival rate + ramp mergeLocal car-following gapsBackward shockwavesThroughput + speed trace

Routing when you don’t trust the map

The other question that stuck with me from building TraffiQ is what “fastest route” actually means when live congestion estimates are noisy. Shortest distance falls apart as soon as a central arterial clogs up, and pure expected-time routing ignores tail risk.

In this small directed graph from A to H, the Explore objective borrows from bandit algorithms: it gives a small score credit for testing an uncertain link (B to E), trading a slightly slower trip today for better travel-time data tomorrow.

TraffiQ corridor graph (A → H)

Choosing a route under noisy ETAs

Minimizes expected travel minutes using current speed estimates, ignoring variance on congested connectors.

1.9m1.9m2.5m1.6m2.5m ±?3.0m1.6m1.6m3.2m2.2m1.5m1.6mAHomeBNorth AveCEdgewoodDConnectorEPeachtreeFPiedmontGFive PointsHGSU Campus