Кожного ранку тисячі пасажирів чекають на автобус, не знаючи точного часу прибуття. Пробки, ДТП, поломки — фіксований розклад перетворюється на фікцію. Ми побудували AI-систему, яка передбачає пасажиропотік з точністю до 15 хвилин і динамічно коригує інтервали руху. Результат: час очікування знижується на 20%, операційні витрати — на 15%.
Стек: LightGBM, генетичні алгоритми, MILP-оптимізація. Всі моделі працюють у реальному часі на потокових даних. Наш досвід — більше 8 років у ML-продакшені, 15+ транспортних проєктів. У цій статті розповімо, як ми будуємо прогнозні моделі, налаштовуємо динамічний розклад і керуємо парком електробусів.
Чому традиційні методи не справляються?
Фіксований розклад не враховує реальні коливання попиту. У годину пік автобуси переповнені, а вночі ходять напівпорожніми. Диспетчери реагують постфактум, коли збій уже стався. AI же аналізує дані AFC, GPS, камер і додатків, будує прогноз і перебудовує розклад кожні 1-2 години. Це знижує час очікування на 20% і підвищує заповнюваність на 15%.
Як AI аналізує пасажиропотоки?
Збираємо дані з декількох джерел:
- Турнікети (AFC): точний час входу/виходу, тип квитка
- GPS-трекери: реальне місцезнаходження, відхилення від розкладу
- Камери в салоні: YOLOv8 + трекінг підраховує пасажирів
- Мобільний додаток: геопозиція зі згоди користувачів
Для прогнозу використовуємо LightGBM з лаговими ознаками за 1, 7 і 14 днів, ковзним середнім, а також даними про погоду та свята:
import pandas as pd import numpy as np from lightgbm import LGBMRegressor class PassengerFlowPredictor: """Прогноз пасажиропотоку на зупинці по 15-хвилинних інтервалах""" 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 # Лаги: ті ж інтервали в попередні періоди for lag_days in [1, 7, 14]: df[f'lag_{lag_days}d'] = df['passengers'].shift(lag_days * 96) # 96 інтервалів/день # Ковзне середнє 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']) # Прогноз на наступні 24 години future = df.tail(forecast_horizon)[feature_cols] return model.predict(future).clip(min=0) Модель навчається на історичних даних і кожні 15 хвилин видає прогноз на найближчі 24 години. Точність: MAE 3-5 пасажирів на зупинку.
Чому динамічний розклад кращий за фіксований?
Фіксований розклад не адаптується до коливань попиту: у годину пік автобуси переповнені, вночі — напівпорожні. Динамічний розклад коригує інтервали (headway) кожні 1–2 години на основі прогнозу. Оптимальний headway розраховується за формулою:
Формула оптимального headway
`headway* = sqrt(2 × місткість × вартість_рейсу / (попит × вартість_очікування))` Висновок заснований на роботі Mohring (1972), адаптовано під ML.| Параметр | Фіксований розклад | Динамічний розклад |
|---|---|---|
| Час очікування пасажирів | Високий у непік | Зниження на 20% |
| Заповнюваність місць | Нижче 50% у непік | Вище 85% у пік, 60% у непік |
| Реакція на збої | Тільки в наступному циклі | Миттєва перебудова |
При виході транспорту з ладу AI перерозподіляє інтервали між рештою машин — пасажири не помічають збою.
Порівняння методів оптимізації інтервалів
| Метод | Складність | Точність | Адаптивність |
|---|---|---|---|
| Фіксований headway | Низька | Низька | Відсутня |
| Динамічний headway (ML) | Середня | Висока | Висока |
| Demand Responsive (DRT) | Висока | Дуже висока | Повна |
Як ми оптимізуємо маршрутну мережу?
Використовуємо генетичний алгоритм (GA) для пошуку оптимальної конфігурації маршрутів. Критерії:
- Покриття: 90% жителів у кроковій доступності (500 м) від зупинки
- Середня кількість пересадок ≤ 2
- Мінімізація дублювання паралельних маршрутів
GA перебирає тисячі варіантів за годину, що недоступно ручному плануванню. Для малозаселених зон впроваджуємо Demand Responsive Transport (DRT): пасажир запитує поїздку в додатку, алгоритм об'єднує попутні запити та будує маршрут мікроавтобуса в реальному часі (VRP-solver). Додатково проводимо транспортне моделювання на цифровому двійнику міста, щоб оцінити навантаження на мережу.
Управління парком та заряджання електробусів
Оптимізуємо не лише маршрути, але й кількість машин на лінії. MILP-модель мінімізує порожні пробіги з депо, враховуючи технічний стан. Для електробусів (ЛиАЗ 6274, Yutong E12) прогнозуємо витрати енергії на маршруті з урахуванням рельєфу та навантаження. Будуємо графік заряджання: до 70% вночі за дешевим тарифом, решту — на кінцевих зупинках. Гарантуємо достатній заряд до початку рейсу.
Як впровадити систему?
- Аудит поточної мережі та збір даних (AFC, GPS, GTFS). 2-3 тижні.
- Розробка ML-моделей (прогноз пасажиропотоку, оптимізація headway). 6-8 тижнів.
- Інтеграція з міськими системами (АСКУД, диспетчерськими). 4-6 тижнів.
- Тестування на історичних даних та пілотний запуск на 1-2 маршрутах. 4 тижні.
- Розгортання на всю мережу, навчання диспетчерів, моніторинг. 4-6 тижнів.
Разом: базова платформа — 4-5 місяців, з DRT та електробусами — до 7 місяців. Вартість розраховується індивідуально.
Що входить у нашу роботу
- Бізнес-аналітика та аудит маршрутної мережі
- ML-моделі: прогноз, оптимізація, DRT
- Інтеграція з GTFS, АСКУД, мобільними додатками
- Розгортання on-prem або cloud
- Документація, навчання, 6 місяців підтримки
Отримайте консультацію: ми проаналізуємо дані, оберемо стек та запропонуємо рішення під ключ. Зв'яжіться з нами для оцінки вашого проекту.







