Одно из основных преимуществ AnyLogic – наличие специализированных библиотек для моделирования транспортных потоков (Библиотека дорожного движения), промышленных процессов (Библиотека производственных систем), ж/д перевозок (Железнодорожная библиотека) и транспортировки жидких/сыпучих грузов (Библиотека моделирования потоков).
Задача
В этой статье я хочу поделиться опытом, полученным в ходе реализации проекта для одного из наших клиентов – крупной металлургической компании. Наша команда разрабатывала имитационную модель транспортировки угля в рамках ж/д инфраструктуры заказчика (транспортировка угля от шахт и карьеров на обогащение, а также транспортировка угля на ТЭЦ). Помимо перевозки угля необходимо было учесть процессы, связанные с передвижением контрагентских грузов (продукты питания и другие товары), так как для них использовалась та же система ж/д путей и тот же парк локомотивов.
Перед нами стояла непростая задача, так как нужно было учесть множество особенностей ж/д инфраструктуры:
- высокую вариативность возможных маршрутов ж/д составов (инфраструктура заказчика включает более 350 путей);
- необходимость проведения маневровых операций ж/д составом для движения из пункта А в пункт Б;
- скоростные ограничения на отдельных путях и участках (перегоны, мосты, станции и т.д.).
В ходе реализации модели нам был очень полезен инструментарий, который предлагается встроенной ж/д библиотекой AnyLogic. Мы использовали элементы ж/д путей для разметки пространства, стандартных агентов типа Поезд и Вагон, блоки TrainMoveTo, TrainCouple и TrainDecouple для моделирования операций на железной дороге и другие элементы библиотеки. Это позволило нам правильно передать в модели особенности устройства путей (стрелки и развязки), перемещение поездов, а также операции сцепления и расцепления вагонов.
Для операций сцепления и расцепления отлично подошли стандартные блоки библиотеки, а вот с движением поездов возникли сложности, связанные с особенностями инфраструктуры заказчика:
1. Вариативность маршрутов следования поездов
Инфраструктура Заказчика включает более 350 путей. При этом в каждом конкретном сценарии модели любой из составов может следовать между любыми двумя или несколькими путями этой инфраструктуры, то есть возможных маршрутов следования – огромное количество.
2. Маневровые операции
В ходе следования составу часто приходится совершать маневровые операции. Рассмотрим простой пример:
Существует развязка на 2 пути:
Если состав следует по маршрутам А → Б, Б → А, Б → В или В → Б, то для моделирования этого процесса достаточно одного блока TrainMoveTo.
Если состав следует по маршрутам А → В или В → А, задача усложняется, так как составу нужно совершить маневр (в случае А → В состав должен проследовать на путь Б и реверсом проследовать на путь В). В этом случае, для моделирования процесса существует очевидное решение, использовать два блока TrainMoveTo (один – для следования по маршруту А → Б, второй – из Б в В.
В случае с нашим проектом ж/д инфраструктура заказчика выглядела примерно так:
В случае следования состава из А в Б при использовании подхода, приведенного выше, потребуется не два, а намного больше блоков TrainMoveToС учетом того, что таких маршрутов множество, понадобилось найти другое, более гибкое и универсальное решение.
3. Скоростные ограничения на отдельных путях и участках
Ж/д инфраструктура заказчика включает отдельные пути, где скорость следования состава ограничена:
- ограничениями самой инфраструктуры (путей) и нормами безопасности. Например, действует ограничение по скоростному режиму на станциях;
- грузоподъемностью локомотива и ландшафтом путей. В зависимости от направления движения (условно, "в горку" или "с горки"), скорость движения локомотива может отличаться, особенно, если локомотив следует с большим количеством груженых вагонов.
Стандартный функционал библиотеки AnyLogic позволяет задавать скорость движения состава в блоке TrainMoveTo, но эта скорость задается сразу для всех путей, по которым будет следовать состав, а не для каждого пути по отдельности. Очевидным решением было бы создать по отдельному блоку для каждого участка, но так как в нашей модели путей было более 350, потребовалось искать другое решение.
Решение: расширение от NFP для ж/д библиотеки
Для решения задач, описанных выше, мы разработали расширение для библиотеки – блок TrainMove. Он позволяет:
- Не использовать множество блоков TrainMoveTo и при этом подходит даже для сложных маршрутов;
- автоматически задавать маршрут следования состава из точки А в точку Б с маневрами;
- задавать скоростные ограничения для каждого отдельного пути и его участков.
Принцип работы блока
Расширение работает по принципу оптимизированных циклов.
На стадии планирования маршрута происходят проверки, которые определяют существование пути A → Б, затем, если такой путь существует, алгоритм подбирает кратчайший путь при минимально возможном количестве маневров и расстоянии до конечной точки. После формируется маршрут и состав начинает следование с указанными заранее для него параметрами (скорость по умолчанию, отступы и т.д.).
В случае, если маршрут невозможен (например, длина состава не позволяет выполнить маневр на единственном коротком пути для последующего следования до конечной цели), блок TrainMove выдаст ошибку о том, что следование невозможно, с указанием "проблематичных" путей.
Подробнее о расширении – в файле документации >>
Работу расширения от компании NFP можно протестировать на демо-модели: