PIMPS — программа имитационного моделирования работы железнодорожной станции на Python. Модель объединяет тяговые расчёты (ОДУ движения поезда по ПТР РЖД 2016) и дискретно-событийную симуляцию станционных процессов (SimPy) с учётом режимов управления интервалами: классическая автоблокировка (АБ) и виртуальная сцепка (ВС).
Проект разработан в рамках выпускной квалификационной работы для количественной оценки влияния виртуальной сцепки на пропускную способность станции.
Warning
Проект ещё находится в разработке.
- Одномерная модель движения поезда по пути S — система ОДУ
dV/ds,dt/ds, решаемая черезscipy.integrate.solve_ivp(RK45). - Характеристики локомотива (тяговая кривая, тормозные параметры, сопротивление движению) загружаются из YAML-конфигов.
- На выходе — профили V(S) и T(S), а также
head_to_tail_s(разность времени прохода головы и хвоста по участку).
- Дискретно-событийная модель на базе SimPy.
- Топология станции (пути, стрелки, маршруты, секции, конфликтующие маршруты) описывается в YAML.
- Центральный диспетчер (
_dispatcher_process) управляет очередью поездов и назначением маршрутов. - Модель электрической централизации (ЭЦ) проверяет конфликты маршрутов и блокировку секций через
InterlockingEngine.
| Режим | Описание |
|---|---|
АБ (ControlMode.AB) |
Классическая автоблокировка. Маршрут освобождается целиком после проследования поезда. |
ВС, Методика А (ControlMode.VC, vc_methodology="A") |
Виртуальная сцепка с секционным освобождением: входная секция маршрута освобождается через vc_min_headway_s после начала движения, что позволяет следующему поезду занять маршрут раньше. |
ВС, Методика Б (ControlMode.VC, vc_methodology="B") |
Специальный режим по Бушуеву–Голочалову: предварительное резервирование маршрутов для всего пакета, синхронизация отправлений, приоритет пакетных маршрутов. |
Сравнение Методик А и Б — предмет специального вопроса ВКР.
| Сценарий | Что моделирует |
|---|---|
Demo-AB |
Базовый режим АБ, 8 поездов |
Demo-VC-A |
ВС, Методика А — те же поезда с укороченными интервалами |
Demo-VC-B |
ВС, Методика Б — пакетное резервирование |
VC-Packet-Split |
Разделение пакета на подходе (поезд отклоняется на другой путь) |
VC-Recovery |
Восстановление графика после сбоя (задержка 480 с), режим ВС |
AB-Recovery |
Восстановление графика после сбоя, режим АБ (для сравнения) |
- CSV по каждому поезду: времена прибытия/отправления, время хода, средняя и максимальная скорость (
sim_results_*.csv). - Задержки относительно плановых времён (
delays_*.csv). - Лог событий станции (
events_log_*.csv). - Сводная таблица
throughput_comparison.csvпо всем запущенным сценариям. - Графики: профили движения, диаграммы занятости маршрутов, сравнение пропускной способности.
- Markdown-отчёты
report_<scenario>.md.
git clone https://github.com/fedotdev/PIMPS.git
cd PIMPS
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txtNote
Требуется Python 3.10+.
PIMPS/
├── run_example.py # Точка входа: запуск сценариев и генерация отчётов
├── requirements.txt
│
├── config/ # Конфигурации подвижного состава
│ ├── 2ES5k.yaml # Локомотив 2ЭС5К (тяговые/тормозные характеристики)
│ ├── demo_loco.yaml # Демо-локомотив
│ └── demo_train.yaml # Демо-поезд (масса, длина, число осей)
│
├── stations/ # Конфигурации станций
│ ├── demo_station.yaml # Упрощённая демо-станция
│ └── miitovskaya_station.yaml # Станция «Миитовская» (маршруты, секции, стрелки)
│
├── src/
│ ├── models.py # Dataclass-модели: StationConfig, TrainState,
│ │ # SimResult, PhysicsResult и др.
│ ├── simulation.py # SimPy-модель: train_process, диспетчер,
│ │ # секционное освобождение
│ │
│ ├── traction/ # Тяговые расчёты
│ │ ├── loader.py # Парсинг YAML (тяговые/тормозные характеристики)
│ │ └── dynamics.py # ОДУ движения поезда (solve_ivp, RK45)
│ │
│ ├── interlocking/ # Модель электрической централизации
│ │ ├── loader.py # Загрузка схемы станции из YAML
│ │ └── engine.py # InterlockingEngine: конфликты, маршрутизация,
│ │ # секционное и пакетное управление
│ │
│ └── renderers/ # Вывод результатов
│ ├── metrics.py # Агрегированные метрики, экспорт CSV
│ └── plots.py # Графики (профили, занятость, throughput)
│
├── tests/ # Тесты
│ ├── conftest.py
│ ├── test_traction_loader.py
│ ├── test_traction_dynamics.py
│ ├── test_interlocking_loader.py
│ ├── test_interlocking_engine.py
│ └── test_simulation.py
│
└── output/ # Генерируется при запуске
├── data/ # CSV с профилями и результатами
├── profiles/ # PNG-графики V(S), T(S)
├── station/ # Диаграммы занятости маршрутов
└── summary/ # throughput_comparison, отчёты, графики
.venv/Scripts/python.exe run_example.pyСкрипт последовательно запускает все определённые сценарии. Результаты записываются в output/.
После запуска в output/ появятся:
| Файл | Содержание |
|---|---|
data/sim_results_<scenario>.csv |
Поездные результаты: времена, скорости |
data/delays_<scenario>.csv |
Задержки относительно расписания |
data/events_log_<scenario>.csv |
Журнал событий станции |
summary/throughput_comparison.csv |
Сводная таблица по всем сценариям |
summary/report_<scenario>.md |
Краткий Markdown-отчёт |
station/occupancy_<scenario>.png |
Диаграмма занятости маршрутов |
profiles/*.png |
Профили движения V(S), T(S) |
import pandas as pd
throughput = pd.read_csv("output/summary/throughput_comparison.csv") print(throughput[["scenario", "throughput_trains_per_hour", "headway_avg_s", "delay_depart_avg_s"]])
Силы тяги и сопротивления рассчитываются по формулам ПТР РЖД 2016 (сопротивление Вирта, кривые F(v), тормозные характеристики). Движение описывается системой ОДУ, решаемой методом Дорманда–Принса (RK45).
Результат — структура PhysicsResult:
vprofile— скорость по пути;tprofile— время;spoints— координаты;head_to_tail_s— разность времени между проходом головы и хвоста.
Для каждого поезда создаётся SimPy-процесс train_process:
- Поезд прибывает в расчётное время.
- Диспетчер (
_dispatcher_process) назначает маршрут с учётом конфликтов ЭЦ. - Время прохождения маршрута берётся из
PhysicsResult. - В режиме ВС (Методика А) входная секция освобождается через
vc_min_headway_s— следующий поезд может начать движение раньше. - В режиме ВС (Методика Б) маршруты резервируются для всего пакета заранее.
- Маршрут освобождается после завершения движения.
События (прибытие, запрос, захват, отправление, освобождение) логируются в events_log_*.csv.
| Метрика | Описание |
|---|---|
throughput_trains_per_hour |
Пропускная способность за расчётный интервал |
headway_avg_s |
Средний интервал отправления |
dwell_avg_s / dwell_max_s |
Средний / максимальный простой на станционных путях |
throat_utilization |
Доля времени занятости горловины |
delay_arrive_avg_s / delay_depart_avg_s |
Средние задержки прибытия / отправления |
packet_integrity_ratio |
Доля сохранённых пакетов (только ВС) |
max_intra_packet_gap_s |
Максимальный разрыв внутри пакета |
Описывает топологию: пути приёма/отправления, стрелки, сигналы, маршруты (приёма и отправления), секции каждого маршрута и матрицу конфликтующих маршрутов.
- Тип тока, напряжение.
- Масса, длина, число осей.
- Таблицы тяговой и тормозной характеристик, коэффициенты сопротивления.
pytest tests/ -vПокрытие: загрузка конфигов (тяга и станция), корректность ОДУ, логика интерлокинга (конфликты, блокировка секций), базовые сценарии симуляции.
- Модель одномерная — профиль пути задаётся последовательностью участков с уклонами и радиусами, без детальной продольной схемы станции.
- Движение внутри станционного маршрута упрощено до «проталкивания» профиля V(S) через ресурс маршрута (нет пошаговой модели роспуска, маневров).
- Сценарии ориентированы на демо-пример, а не на точное воспроизведение конкретной станции РЖД.
- Виртуальная сцепка моделируется на уровне управления интервалами; координация между бортовыми системами поездов (V2V) не реализована.