Шаг 4. Моделируем сортировку вагонов

Теперь давайте промоделируем процесс сортировки вагонов и их распределения на разные пути согласно их типу.

Нарисуйте дополнительные ж/д пути
  1. Нарисуйте дополнительно несколько ж/д путей, как показано на рисунке ниже. На этих путях будет происходить накопление вагонов, на каждом пути будут собираться вагоны определенного типа. Чтобы нарисовать подобную топологию ж/д путей, необходимо вначале нарисовать несколько длинных путей, ведущих до самого конца сортировочного парка, и уже затем от некоторых из них рисовать ответвления. 

  1. Присвойте путям осмысленные имена: trackN1 ... trackN6.

  1. Добавьте элемент Точка ж/д пути на каждый путь назначения (всего шесть штук). Назовите их stopLineN1, ... stopLineN6. Таким образом, мы задаем линию остановки для каждого пути. Вагоны, которые катятся вниз под действием силы земного притяжения, будут останавливаться у этих точек.

Задайте логику диаграммы процесса

Поезд, прибывающий на сортировочную станцию, может содержать несколько вагонов одного и того же типа, расположенных друг за другом. Такие вагоны могут быть отправлены на свой путь все вместе.

  1. Добавьте Функцию, которая будет подсчитывать количество следующих одним за другим вагонов одного типа в поезде, который находится на горке. Назовите ее carsOfSameType и измените ее свойства следующим образом:

  1. Создайте еще одну Функцию и назовите ее departurePointOnTrack.
Она будет определять путь назначения для вагонов в сортировочном парке (представляющем собой пути, где сортируются вагоны определенного типа).

Эта функция использует поезд как аргумент, затем проверяет тип первого вагона поезда (так как обычно поезд и состоит всего лишь из одного вагона).

Мы находим тип вагона с помощью оператора Java instanceof. Он возвращает true, если объект является единицей заданного класса.

В итоге, функция возвращает элемент Точка ж/д пути, который зависит от типа вагона.

Внесите в свойства следующие изменения:

  1. Перетащите элемент Переменная в графическую диаграмму из палитры Агент. Эта переменная будет содержать ссылку на путь, где требуемое количество вагонов одного типа готово покинуть станцию как новый поезд.

                Настройте Переменную:
                Назовите ее trackReadyToDepart.
                Выберите Другой в выпадающем списке Тип. В появившемся справа поле выберите RailwayTrack.

Добавьте блоки в диаграмму процесса

  1. Блок TrainDecouple расцепляет вагоны, когда поезд находится на горке. Поезд может содержать несколько вагонов одного типа, следующих друг за другом. Такие вагоны откатываются на свой путь назначения сразу же. (Мы определяем, сколько вагонов нужно откатить, функцией carsOfSameType, созданной на предыдущем шаге). Путь назначения задается созданной нами функцией departurePointOnTrack.
                    Укажите следующее в свойствах блока TrainDecouple:
                    Количество вагонов для отцепленияcarsOfSameType(train)
                    Новый поезд: Train
  1. Имеется короткая задержка перед тем, как поезд продолжит расцепляться.
                    Укажите следующее в свойствах блока Delay:
                    Время задержки: 5 секунд
  1. Теперь мы должны определить, содержит ли поезд еще вагоны, которые можно отцепить. Этим занимается блок SelectOutput. Мы проверяем, содержит ли поезд еще хоть один вагон (помните, что и сам локомотив считается вагоном). Если это так, то поезд снова поступает в блок TrainDecouple. Цикл повторяется до тех пор, пока поезд не содержит только локомотив, готовый покинуть станцию.
                    Укажите следующее в свойствах блока SelectOutput:
                    Выход true выбирается: при выполнении условия
                    Условие: agent.size() > 1
  1. Не забудьте присоединить правый порт блока SelectOutput к входному порту блока trainMoveTo4, чтобы вернуть поезд на горку.
 Промоделируйте, как привезший разнородный состав локомотив покидает станцию

  1. Мы снова будем использовать блок TrainMoveTo, чтобы промоделировать движение локомотива. В качестве точки назначения мы укажем нижний путь (trackN6).
                    Укажите следующее в свойствах блока TrainMoveTo:
                    Маршрут: Вычисляется автоматически…
                    Цель движения: Заданное смещение на пути
                    Путь: trackN6
  1. В конце концов, локомотив удаляется из модели блоком TrainDispose.
Задайте логику скатывания вагонов на пути сортировочного парка

Промоделируйте скатывание вагонов на свои пути назначения в сортировочном парке под действием силы земного притяжения (пути, где вагоны сортируются).

  1. Движение, как обычно, моделируется блоком TrainMoveTo. Поезд содержит отдельные вагоны или сцепленные вагоны одного типа. Назначение задается функцией departurePointOnTrack, которую мы указали ранее.
                    Укажите следующее в свойствах блока TrainMoveTo:
                    МаршрутВычисляется автоматически…
                    Цель движения: Заданная точка пути
                    Точка ж/д пути: departurePointOnTrack(train)
                    При окончании движения: Затормозить и остановиться
  1. Если на пути назначения уже есть какие-то вагоны, то они комбинируются вместе с только что прибывшими вагонами в блоке TrainCouple.
  1. Вагоны продолжают соединяться, пока не будет достигнуто определенное количество вагонов на пути (тогда локомотив приезжает туда и забирает вагоны со станции). Блок SelectOutput проверяет, когда сбор вагонов можно прекратить. Мы указываем, что количество собранных вагонов должно быть меньше 8. 
                    Укажите следующее в свойствах блока SelectOutput:
                    Выход true выбираетсяпри выполнении условия
                    Условие: agent.size() < 8

Добавьте логику отправления готового поезда, собранного из вагонов однго типа, со станции

  1. Сначала мы сцепляем вагоны с локомотивом при помощи блока TrainCouple (логику поведения локомотива мы зададим на следующем шаге).
  2. Затем поезд покидает станцию (это моделируется блоком TrainMoveTo).
                    Укажите следующее в свойствах блока TrainMoveTo:
                    Маршрут: Не задан (поезд будет следовать согласно стрелкам)
                    Цель движения: Не задана
  1. В конце концов мы удаляем поезд из модели блоком TrainDispose.
Добавьте логику локомотива, забирающего готовые к отправке вагоны

Сейчас мы смоделируем, как локомотивы забирают со станции готовые поезда, составленные из вагонов одного типа.

  1. Сначала давайте добавим блок TrainSource, моделирующий прибытие локомотива. Поезд состоит только из одного вагона (сам локомотив). Выберите ручной режим создания поездов – вызовами функции inject(), так как этот блок будет создавать поезда, только когда новый поезд готов отправиться со станции. Локомотив должен появиться на пути, заданном переменной trackReadyToDepart (мы определяем путь - значение этой переменной - на следующем шаге).
                    Укажите следующее в свойствах блока TrainSource:
                    Имя: newLoco
                    Поезда прибывают согласно: Вызовам метода inject()
                    Кол-во вагонов (включая локомотив): 1
                   
Точка входа задается как: Смещение на пути
                   
Путь: trackReadyToDepart
                   
Смещение от: начала пути
                   
Смещение первого вагона: tracklength - 15 метров
                   
Новый поезд: Train
                    Новый вагон: Locomotive
  1. Этот блок проверяет, имеется ли достаточное количество вагонов одного типа на пути или еще нет. 
                   Укажите следующее в свойстве При выходе (false) секции Действия блока SelectOutput:

            trackReadyToDepart = agent.getTrack( true );

                       
newLoco.inject();

Действие При выходе (false) выполняется, когда появляется требуемое количество вагонов. 
Строка trackReadyToDepart = agent.getTrack( true ); получает текущий путь, на ктоторм скопились готовые к отправке вагоны, и записывает его в локальную переменную trackReadyToDepart.
Строка newLoco.inject(); генерирует новый локомотив в блоке newLoco. Когда локомотив создан, он следует к блоку, который мы создаем далее.
  1. Блок TrainMoveTo моделирует движение локомотива к готовым к отправке вагонам. Обратите внимание на направление его движения – Назад (локомотив движется в направлении, обратном направлению пути, справа налево). Затем локомотив сцепляется с вагонами и получившийся поезд проходит ту часть диаграммы процесса, которая моделирует отправление поезда с сортировочной горки.
                    Укажите следующее в свойствах блока TrainMoveTo:
                    Направление движения: Назад
                    Маршрут: Не задан (поезд будет следовать согласно стрелкам)
                    Цель движения: Не задана
                    Крейсерская скорость: 10 м/с

В итоге, ваша диаграмма должна выглядеть так:

Запустите модель. Вы увидите, как вагоны сортируются по типу. Когда набирается достаточное количество вагонов одного типа, локомотив забирает их с сортировочной станции.

Мы завершили решение небольшой задачи, типовой для железнодорожной библиотеки AnyLogic. Чаще эта библиотека используется не для моделирования железнодорожных сетей целых регионов, а моделирует именно определенные участки - грузовые или пассажирские ж/д узлы.

Контрольная модель: Сортировочная горка - Шаг 4




  Шаг 3. Создаем типы вагонов