Каждое утро тысячи пассажиров ждут автобус, не зная точного времени прибытия. Пробки, ДТП, поломки — фиксированное расписание превращается в фикцию. Мы построили 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 месяцев поддержки
Получите консультацию: мы проанализируем данные, выберем стек и предложим решение под ключ. Свяжитесь с нами для оценки вашего проекта.







