Every morning, thousands of passengers wait for a bus without knowing the exact arrival time. Traffic jams, accidents, breakdowns — a fixed schedule becomes fiction. We built an AI system that predicts passenger flow with 15-minute accuracy and dynamically adjusts headways. Result: wait times reduced by 20%, operational costs by 15%.
Stack: LightGBM, genetic algorithms, MILP optimization. All models run in real time on streaming data. Company metrics: 8+ years in ML production, 15+ transportation projects, 5+ years on the market. This article explains how we build predictive models, set up dynamic scheduling, and manage electric bus fleets.
What Are the Limitations of Traditional Methods?
Fixed schedules ignore real demand fluctuations. During peak hours, buses are overcrowded; at night, they run half empty. Dispatchers react after the fact, once a disruption has already occurred. AI analyzes data from AFC, GPS, cameras, and apps, builds forecasts, and reshuffles the schedule every 1-2 hours. This reduces wait times by 20% and increases load factor by 15%.
How Does AI Analyze Passenger Flows?
We collect data from multiple sources:
- Fare gates (AFC): exact entry/exit times, ticket type
- GPS trackers: real-time location, deviation from schedule
- In-vehicle cameras: YOLOv8 + tracking counts passengers
- Mobile app: geolocation with user consent
For prediction, we use LightGBM with lag features from 1, 7, and 14 days, moving averages, plus weather and holiday data:
import pandas as pd
import numpy as np
from lightgbm import LGBMRegressor
class PassengerFlowPredictor:
"""Predicts passenger flow at a stop for 15-minute intervals"""
def build_features(self, df):
df = df.copy()
df['hour'] = df['timestamp'].dt.hour
df['minute_bin'] = df['timestamp'].dt.minute // 15
df['dayofweek'] = df['timestamp'].dt.dayofweek
df['is_weekend'] = df['dayofweek'].isin([5, 6]).astype(int)
df['month'] = df['timestamp'].dt.month
# Lags: same intervals in previous periods
for lag_days in [1, 7, 14]:
df[f'lag_{lag_days}d'] = df['passengers'].shift(lag_days * 96) # 96 intervals/day
# Moving average
df['ma_7d'] = df['passengers'].rolling(7 * 96).mean()
return df
def train_and_predict(self, historical_df, forecast_horizon=96):
df = self.build_features(historical_df)
feature_cols = ['hour', 'minute_bin', 'dayofweek', 'is_weekend', 'month',
'lag_1d', 'lag_7d', 'lag_14d', 'ma_7d', 'is_holiday',
'weather_temp', 'weather_rain']
train = df.dropna(subset=feature_cols + ['passengers'])
model = LGBMRegressor(n_estimators=300, learning_rate=0.05, num_leaves=64)
model.fit(train[feature_cols], train['passengers'])
# Forecast for next 24 hours
future = df.tail(forecast_horizon)[feature_cols]
return model.predict(future).clip(min=0)
The model trains on historical data and every 15 minutes outputs a forecast for the next 24 hours. Accuracy: MAE 3-5 passengers per stop.
Advantages of Dynamic Scheduling
Fixed schedules cannot adapt to demand fluctuations: peak-hour buses are overcrowded, night-time buses nearly empty. Dynamic scheduling adjusts headways every 1-2 hours based on forecasts. Optimal headway is calculated using the formula:
Optimal headway formula
`headway* = sqrt(2 × capacity × run_cost / (demand × wait_cost))` Derivation based on Mohring (1972), adapted for ML.| Parameter | Fixed Schedule | Dynamic Schedule |
|---|---|---|
| Passenger wait time | High off-peak | 20% reduction |
| Load factor | Below 50% off-peak | >85% peak, 60% off-peak |
| Response to disruptions | Only next cycle | Instant rescheduling |
Dynamic scheduling is 1.3 times more efficient than fixed schedules, achieving a 1.5x improvement in load factor. When a vehicle breaks down, AI redistributes headways among remaining buses — passengers are unaware of the disruption.
Comparison of Headway Optimization Methods
| Method | Complexity | Accuracy | Adaptability |
|---|---|---|---|
| Fixed headway | Low | Low | None |
| Dynamic headway (ML) | Medium | High | High |
| Demand Responsive (DRT) | High | Very high | Full |
Route Network Optimization
We use a genetic algorithm (GA) to find the optimal route configuration. Criteria:
- Coverage: 90% of residents within a 500 m walking distance of a stop
- Average number of transfers ≤ 2
- Minimize duplication of parallel routes
GA explores thousands of configurations in an hour — impossible with manual planning. For low-density zones, we deploy Demand Responsive Transport (DRT): the passenger requests a ride via app, the algorithm merges similar requests and builds a minibus route in real time (VRP solver). Additionally, we run transport simulation modeling on a digital twin of the city to evaluate network load.
How Is Fleet Management and Electric Bus Charging Optimized?
We optimize not only routes but also the number of vehicles in service. A MILP model minimizes empty trips from the depot while considering technical condition. For electric buses (LiAZ 6274, Yutong E12), we forecast energy consumption per route considering terrain and load. We build a charging schedule with electric bus charging optimization: up to 70% overnight at cheap rates, the rest at terminals. Guarantees sufficient charge before departure.
Implementation Steps
- Audit of the current network and data collection (AFC, GPS, GTFS). 2-3 weeks.
- Development of ML models (passenger flow forecast, headway optimization). 6-8 weeks.
- Integration with city systems (traffic management, dispatch). 4-6 weeks.
- Testing on historical data and pilot launch on 1-2 routes. 4 weeks.
- Full network deployment, dispatcher training, monitoring. 4-6 weeks.
Total: basic platform — 4-5 months, with DRT and electric buses — up to 7 months. Typical project cost for a mid-size city: $200,000–$500,000, with annual savings of $2M–$5M. Cost is calculated individually.
What Our Work Includes
- Business analytics and route network audit
- ML models: forecasting, optimization, DRT
- Integration with GTFS, traffic management, mobile apps
- On-prem or cloud deployment
- Documentation, training, 6 months support
- Deliverables include: documentation, system access, training, and ongoing support
Our company has 8+ years of experience in ML production, completed 15+ transportation projects, and has been on the market for 5+ years. Our approach combines machine learning for transit with genetic algorithm route planning and electric bus charging optimization. Get a consultation: we will analyze your data, choose the stack, and propose a turnkey solution. Contact us for a project assessment.







