Изменение диаграммы процесса 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Изменение диаграммы процесса



Теперь мы внесем небольшие изменения в диаграмму процесса.

Измените диаграмму процесса

1. Освободите место для нового блока на нашей диаграмме. Сдвиньте блоки goToTrains и inflowSink вправо, как показано на рисунке:

2. Теперь мы можем вставить блок PedService в нашу диаграмму. Блок PedService моделирует то, как пешеходы движутся к сервисам, заданным графически элементом разметки и проходят через сервис. Перетащите блок PedService из палитры Пешеходной библиотеки в графическую диаграмму, поместите сразу за блоком создания пешеходов. Размещая блок посередине соединителя, мы соединяем порты автоматически (но помните, что нужно присоединить правый порт блока pedService, а не нижний).

3. Объект появится в диаграмме.

Если Вы выделите соединитель щелчком мыши, и его конечные точки в портах будут подсвечиваться светло-зеленым цветом, то это будет означать, что Вы успешно соединили порты. Иначе же Вам придется проверить, обе ли конечные точки соединителя были помещены точно в порты, и если нет, то передвиньте их туда.

Измените блоки диаграммы

1. Откройте панель Свойства блока pedService.

2. Измените название блока на checkTickets.

3. Выберите fareGates (название нашего элемента разметки Сервис с очередями) в поле Сервисы.

4. Вы увидите, что заданное Время задержки распределено по равномерному закону с минимальным значением, равным 2 секундам и максимальным, равным 3 секундам. Оставьте это значение, поскольку оно является типичным временем задержки при прохождении турникетов.

Мы задали новую логику и теперь можем запустить модель и наблюдать за динамикой моделируемого процесса.

Постройте Вашу модель с помощью кнопки панели инструментов Построить модель . Если в модели есть какие-нибудь ошибки, то построение не будет завершено, и в панель Ошибки будет выведена информация об ошибках, обнаруженных в модели. Двойным щелчком мыши по ошибке в этом списке Вы можете перейти к предполагаемому месту ошибки, чтобы исправить ее.

После того, как Вы исправите все ошибки и успешно построите Вашу модель, Вы можете ее запустить. Запустив модель, вы автоматически обновляете существующую версию.

Запустите модель

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

6 турникетов. Моментально образуются огромные очереди.

2. Остановите модель и снова откройте свойства элемента сервиса. Увеличьте количество сервисов и очередей до 7.

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

Вы можете изменить скорость выполнения модели с помощью кнопок панели инструментов Замедлить и Ускорить .

На данный момент, Вам лучше всего переключиться в режим виртуального времени, чтобы модель выполнялась на максимально возможной скорости, и Вы смогли быстро промоделировать работу системы за долгий период времени.

Чтобы переключиться в режим виртуального времени, нужно щелкнуть мышью по кнопке панели инструментов Реальное/виртуальное время .

Итак, очереди все еще растут, не так быстро как раньше, но иногда они могут стать довольно значительными. Семи турникетов до сих пор недостаточно, чтобы обслуживать поток из четырех тысяч пешеходов в час. (Не забывайте, что наши турникеты имеют время задержки, равное двум-трем секундам).

Итак, давайте еще раз увеличим количество турникетов. Измените, количество сервисов и количество очередей до 8 и снова запустите модель.

Наконец наша конфигурация приемлема: станция успешно справляется с таким потоком пешеходов.

8 турникетов. Очереди в пределах разумного.

Итак, мы впервые извлекли практическую пользу из нашей модели. Данная модель помогла нам найти требуемое количество точек сервиса. Вы можете изменять интенсивность пассажиропотока в настройках блока PedSource и наилучшим образом моделировать средства обслуживания согласно нагрузке.

Сохраните изменения в модели, щелкнув кнопку панели инструментов Сохранить  (продолжайте в дальнейшем сохранять изменения время от времени). Теперь мы можем продолжить разрабатывать нашу модель дальше.

Задание 3. Отображение карты плотности пешеходов

Мы создали модель динамики пешеходного потока в здании павильона метро. Теперь нам хотелось бы получить статистические данные этого потока. Самым значительным инструментом в моделировании пешеходов является Карта плотности пешеходов.

Отобразите карту плотности пешеходов

1. Перетащите элемент Карта плотности пешеходов  из секции Разметка пространства палитры Пешеходная библиотека в графический редактор. В отличие от других объектов библиотек, у этого объекта вместо привычного небольшого значка отображается шкала. На анимации отображается легенда карты. Легенда карты плотности помогает понять, какие цвета соответствуют каким значениям плотности.

2. Откройте панель Свойства этого блока и сбросьте флажок Отображать имя.

3. Выберите значение ground из списка Этаж.

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

Карта плотности

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

Карта плотности чаще всего используется для обнаружения участков пространства, на которых значение плотности достигает критических значений. Такие области отображаются на карте плотности красным цветом. По умолчанию значение критической плотности задано равным 1,5 пешехода на квадратный метр. Вы можете изменить это значение в свойстве Критическая плотность (отображается красным), пешеходов/м2 элемента Карта плотности пешеходов. Синий цвет используется для участков низкой плотности. При нулевой плотности закрашивание соответствующего участка не производится вообще. Приведенная на рисунке шкала информирует нас о том, что, например, желтый цвет на карте плотности будет соответствовать плотности 0,75 пешеходов/м2.

По умолчанию AnyLogic использует логарифмическую цветовую схему. При логарифмической схеме цвет стремительно приближается к «критическому» (красному) только при приближении к зоне критических значений плотности, а при малых значениях остается нейтральным. Вы можете сменить логарифмическую схему на линейную, выбрав Линейная в свойстве Цветовая схема. В этом случае цвета будут меняться от синего к красному линейно согласно градиенту спектра цветов. При желании вы можете задать и свою собственную цветовую схему любой сложности, выбрав Другая в свойстве Цветовая схема. В расположенном ниже свойстве Другой цвет вы можете написать выражение, которое, в зависимости от значения плотности, будет возвращать тот или иной цвет.

Вы можете заметить, что даже когда в области совсем нет пешеходов, карта плотности все равно отображается. Это обусловлено там, что карта плотности может либо запоминать и отображать цвета, соответствующие максимальным историческим значениям (когда затухание выключено), либо карта будет соответствовать картине, полученной только за недавнее время (когда затухание включено). Затухание включено по умолчанию. Если опция выбрана, и карта плотности будет затухать, то цвет будет постепенно стремиться к текущему значению плотности (не моментально, а с заданным опозданием). Чтобы включить затухание, установите флажок Включить затухание в свойствах элемента Карта плотности пешеходов.

Если Вас не устраивает плотность карты на чертеже тем, что его практически не видно, Вы можете увеличить степень прозрачности отображаемой на анимации карты плотности. С помощью бегунка Прозрачность (0=прозрачный, 1=непрозрачный) на панели свойств элемент Карты плотности пешеходов выберите значение, лежащее в интервале [0..1]. Значение 0 соответствует абсолютной прозрачности (карта плотности не видна), значение 1 - абсолютной непрозрачности (цвет полностью закрашивает анимацию).

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

Задание 4. Добавление автоматов продажи билетов

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

На станции могут находиться различные виды услуг продажи билетов. Небольшие павильоны метро могут быть оборудованы только автоматами по продаже билетов, а большие и просторные станции могут также иметь билетные кассы.

Давайте сначала добавим в нашу модель автоматы продажи билетов. Создавая такую модель, нам необходимо знать количество автоматов, требуемое для того, чтобы успешно обслужить такое количество пассажиров; также, мы сможем найти самое подходящее место расположения автоматов, чтобы минимизировать пересечения потоков пассажиров и образование толп.

Как и турникеты, автоматы продажи билетов логично моделировать элементом Сервис с очередями.

Нарисуйте автоматы продажи билетов

1. Перетащите элемент Сервис с очередями  из секции Разметка палитры Пешеходная Библиотека в графический редактор.

2. Повращайте элементы сервиса и разместите их так, как показано на рисунке:

3. Откройте страницу свойств сервисов и настройте эту группу сервисов.

4. В этот раз наши сервисы не линейные, а точечные. Точечные сервисы используются тогда, когда для того, чтобы быть обслуженным, пешеход должен просто подойти к любой точке фигуры, задающей соответствующий сервис и провести там время, заданное как Время задержки дляэтого сервиса. Так что оставьте выбор Точечный в свойстве Тип сервиса.

5. Назовите сервисы ticketMachines.

6. Увеличьте параметр Количество сервисов до 7. Соответственно, увеличьте параметр Количество очередей так же до 7.

Теперь мы хотим направить некоторых из пассажиров сразу к турникетам, а некоторых - на обслуживание у автоматов продажи билетов.

Измените диаграмму модели

1. Добавьте объект PedSelectOutput, чтобы разделить поток пассажиров. Нам нужен этот объект, чтобы перенаправлять пассажиров без билетов к автоматам продажи билетов, а пассажиров с билетами – к турникетам. Объект PedSelectOutput является блоком принятия решения Пешеходной библиотеки. Пешеход, вошедший в блок PedSelectOutput, будет перенаправляться в один из пяти выходных портов в зависимости от заданных для этих портов коэффициентов предпочтения.

2. Добавьте еще один объект PedService. Этот блок будет моделировать обслуживание пассажиров у автоматов продажи билетов. Поместите его между объектом PedSelectOutput и ранее созданным объектом PedService (checkTickets).

3. Соедините блоки, как показано на рисунке.

4. Измените свойства объекта PedSelectOutput. Назовите его routePassengers. Укажите значение 0.7 в поле Коэфф. предпочтения 1 (коэффициент для потока, направляющегося напрямую к турникетам)и значение 0.3 в поле Коэфф. предпочтения 2 (коэффициент для потока пассажиров, направляющихся к автоматам продажи билетов соответственно). На этой диаграмме мы допускаем, что количество пассажиров, которые уже купили билеты, значительно выше. Укажите в полях Коэфф. предпочтения 3, 4, 5 значение, равное 0.

5. Настройте только что добавленный объект PedService. Переименуйте его как atTVM.

6. Выберите ticketMachines (название нашего элемента разметки Сервис с очередями) в свойстве Сервисы.

7. Измените параметр Время задержки. Введите в поле: triangular(7, 12, 40) и выберите секунды в качестве единиц времени. Мы допускаем, что время обслуживания неравнозначно распределено с минимальным значением 7 секунд, средним 12, и максимальным 40 секунд.

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

Практическая работа №11

Тема: Сортировочная горка (Моделирование ж/д узла)

Цель: - разработать имитационную модель сортировочная горка.

Вид работы: фронтальный

Время выполнения: 2 часа

Ход работы

Задание 1. Создание железнодорожного узла

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

Мы начнем с топологии железнодорожной сети, как на рисунке ниже:

Создайте новую модель. Назовите ее Hump Yard и укажите минуты в качестве единиц модельного времени.

Задайте топологию путей. Сначала нарисуйте ж/д пути.

Начните с прямого пути. На этом пути будут появляться поезда, поэтому мы назовем его trackEntry. Мы будем давать осмысленные имена только тем путям, на которые будут ссылаться блоки диаграммы процесса. Остальные пути могут остаться названными по умолчанию.

Нарисуйте прямой ж/д путь

1. Сначала выделите двойным щелчком элемент Ж/д путь в секции Разметка пространства палитры Железнодорожная библиотека.

2. Щелкните в любой точке графического редактора, чтобы начать рисовать путь.

3. Чтобы нарисовать прямой сегмент пути, добавьте щелчком мыши конечную точку сегмента.

4. Завершите рисование двойным щелчком.

5. Назовите этот ж/д путь trackEntry.

Если это первый ж/д путь в модели, вы увидите сообщение с предложением сменить масштаб модели на: 2,0 пикселя в 1 метре. Мы советуем согласиться, так как предлагаемый масштаб часто используется в железнодорожных моделях.

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

Нарисуйте ж/д путь дуговой формы

1. Совершите двойной щелчок по элементу Ж/д путь  в палитре Железнодорожная библиотека. Затем щелкните по ранее нарисованному пути (см. рисунок ниже, пункт 1), чтобы начать рисовать новый ж/д путь. Круг, обозначающий стрелку, появится автоматически.

2. Последовательно щелкая мышью, нарисуйте несколько сегментов пути, чтобы получился путь, как на рисунке ниже. Чтобы добавить дуговой элемент, не отпускайте кнопку мыши после щелчка, а переместите курсор, удерживая кнопку мыши. При этом вы увидите, как меняется радиус дуги. Отпустите кнопку мыши, когда посчитаете, что сегмент приобрел нужную форму. Завершите рисование ж/д пути двойным щелчком рядом с фигурой первого пути (см. пункт 2 на рис. ниже). Сразу поставить конечную точку на тот же путь, с которого начали рисовать (trackEntry), не получится.

3. Перетащите конечную точку (2) на ранее нарисованный путь (trackEntry), чтобы создать стрелку.

Отредактируйте ж/д путь дуговой формы

1. Выделите путь, который хотите отредактировать, щелкнув по нему.

2. Щелкните правой кнопкой мыши по выделенному пути и выберите Редактировать направляющие из контекстного меню.

3. Чтобы переместить крайнюю точку сегмента, перемещайте квадратную метку-манипулятор.

4. Чтобы изменить радиус кривизны, перемещайте круглую метку-манипулятор на конце пунктирной направляющей линии.

Железнодорожные стрелки

· Железнодорожная сеть состоит из путей и стрелок. Железнодорожные стрелки появляются автоматически в виде круга в точках соединения ж/д веток с существующими путями. В существующую точку соединения нельзя добавить дополнительные ж/д пути.

· Два из трех образованных стрелкой углов должны быть тупыми. Это необходимо для определения возможных путей движения на данной стрелке (см. рисунок ниже).

Модифицируйте железнодорожный узел

Каждый раз при создании железнодорожных стрелок, ж/д путь разбивается на отдельные пути. В нашем случае мы создали две железнодорожные стрелки, соединив объездной путь с существующим путем в двух точках. В результате существующий путь разделился на три пути, каждый со своим именем и свойствами.

Сейчас мы дадим осмысленное имя сегменту ж/д пути между железнодорожными стрелками и добавим элементы Точка ж/д пути в наш железнодорожный узел.

1. Назовите этот путь trackArrival, так как он обозначает место прибытия поезда.

2. Перетащите элемент Точка ж/д пути из палитры Железнодорожная библиотека и расположите его, как показано на рисунке ниже. Назовите его stopLineEntry. Он будет определять место появления поездов.

3. Добавьтеэлемент Точка ж/д пути: stopLineArrival. В этой точке поезд остановится, чтобы отцепить все вагоны, что позволит локомотиву продолжить путь уже без вагонов.

4. Добавьтеэлемент Точка ж/д пути: stopLineHump. Здесь будет производиться сортировка вагонов.

Точка ж/д пути

Точка ж/д пути является элементом разметки пространства, который используется, чтобы задать точную позицию на ж/д пути. Это может понадобиться, когда вы задаете:

· позицию на пути, где появляется поезд;

· позицию на пути, где поезд должен остановиться.

В этой части учебного пособия мы создали железнодорожный узел, который будет далее использоваться в нашей модели.

Обратите внимание, для каждого шага моделирования имеются контрольные модели. Вы можете использовать их, чтобы сравнить свою модель с аналогичной моделью, созданной нами. Далее приведена ссылка на контрольную модель для этого шага.

Задание 2. Задаем логику

Задайте логику процесса с помощью блоков Железнодорожной библиотеки

1. Добавьте следующие блоки на диаграмму процесса: TrainSource, TrainMoveTo, TrainDecouple, TrainCouple, TrainDispose. С помощью этих блоков мы зададим логику, согласно которой будет передвигаться наш поезд.

Начните диаграмму с блока TrainSource, который создает поезда, затем добавьте блок TrainMoveTo, расположив его рядом с первым блоком таким образом, чтобы они могли автоматически соединиться. Добавьте оставшиеся блоки на диаграмму процесса, как показано на рисунке ниже.

2. В свойствах блоков TrainSource и trainMoveTo укажите следующее:

Сначала мы укажем, чтобы поезда появлялись у ж/д точки stopLineEntry каждые 15 минут.

TrainSource:

Время между прибытиями: 15 минут

Кол-во вагонов (включая локомотив): 11

Точка ж/д пути: stopLineEntry

После создания, каждый поезд будет направляться к ж/д точке stopLineArrival, у которой он будет замедляться, после чего окончательно остановится.

TrainMoveTo:

Маршрут: Вычисляется автоматически от текущего пути до пути назначения

Цель движения: Заданная точка пути

Точка ж/д пути: stopLineArrival

При окончании движения: Затормозить и остановиться

3. Мы также добавили блок TrainDecouple, задача которого отцеплять заданное количество вагонов от поступающего поезда. В свойствах блока можно увидеть, что по умолчанию он отцепляет один вагон от поезда, а именно первый (в нашем случае - это локомотив). Локомотив будет покидать блок через нижний порт outDecoupled (мы добавим это соединение на следующем шаге).

4. Блок TrainCouple нужен для сцепления локомотива и вагонов в один состав.

Ниже приведены описания блоков Железнодорожной библиотеки, которые мы используем.

Блок Железнодорожной Библиотеки Описание
Train Source Создает поезда, выполняет начальную настройку и помещает их в железнодорожную сеть. Начинает любую ж/д диаграмму процесса. Поддерживает несколько типов расписаний прибытия.
Train Dispose Удаляет поезда из модели.
Train Move To Моделирует движение поездов. Может рассчитывать маршрут и положение стрелок по ходу движения поезда по маршруту. Поддерживает функции ускорения и торможения.
Train Couple Сцепляет два поезда, которые «касаются» друг друга, в один.
Train Decouple Расцепляет вагоны поступающего в блок поезда и создает из них новый поезд.
Train Enter Помещает поступающего в блок агента-поезд на заданный путь ж/д сети.
Train Exit Извлекает поступающий в объект поезд из ж/д сети и передает агента-поезд далее в обычную диаграмму процесса.
RailSettings Задает специфические настройки для железнодорожной сети.

 Продолжим рисование диаграммы процесса

Добавьте три блока TrainMoveTo и соедините их, как показано на рисунке, следуя описанным ниже шагам. С помощью этих блоков мы зададим поведение поезда на железнодорожном узле, которое будет включать в себя: отцепление, ход назад, сцепление с вагонами с последующим выталкиванием их на горку.

Начните с присоединения блока TrainMoveTo к порту outDecoupled (который находится внизу) блока TrainDecouple, так как мы будем задавать логику для отсоединенного локомотива.

1. Добавьте еще один блок TrainMoveTo на диаграмму процесса (trainMoveTo1). Задайте параметры нового блока, согласно которым локомотив направится к stopLineHump и остановится там.

Маршрут: Вычисляется автоматически от текущего пути до пути назначения
Цель движения: Заданная точка пути
Точка ж/д пути: stopLineHump
При окончании движения: Затормозить и остановиться

Создайте еще два блока TrainMoveTo (trainMoveTo2, trainMoveTo3) путем Ctrl+перетаскивания (Mac OS: Cmd+перетаскивания) блока, который вы только что редактировали.

2. Измените свойства блока trainMoveTo2. В данный момент локомотив отцеплен и нам нужно, чтобы он затолкал вагоны на горку, т.е. ему нужно вернуться к stopLineEntry и произвести сцепку с концом поезда. Так как мы не можем его развернуть на рельсах, локомотив поедет назад мимо пути trackArrival, на котором стоят вагоны:

Направление движения: Назад
Маршрут не должен содержать (...): trackArrival
Точка ж/д пути: stopLineEntry

3. Обратите внимание на количество соединений, ведущих от блока trainMoveTo3 к блоку trainCouple. Нижний порт блока TrainMoveTo, в отличие от порта out, который находится справа, используется поездами, которые сталкиваются с другими поездами. В нашем случае, сталкивание является сцеплением локомотива, прибывающего к точке ж/д пути stopLineArrival, с вагонами, которые мы предварительно отцепили от этого локомотива.

Теперь внесите изменения в свойства блока trainMoveTo3, чтобы этот блок направлял поезд из его текущего местоположения к точке stopLineArrival:

Точка ж / д пути: stopLineArrival

Теперь, когда мы смоделировали передвижение локомотив к концу состава, нужно добавить еще один блок TrainMoveTo путем Ctrl+перетаскивания (Mac OS: Cmd+перетаскивания)блока trainMoveTo1. Он будет моделировать процесс толкания вагонов локомотивом к горке, представленной в нашей модели элементом Точка ж/д пути stopLineHump.

4. Измените свойства блока trainMoveTo4:

Точка ж/д пути: stopLineHump

5. Добавьте блок Delay из Библиотеки моделирования процессов, чтобы смоделировать задержку. Измените свойства блока, задав время этой задержки:

Время задержки: 15 секунд

Мы завершили Шаг 2. Можете запустить модель и посмотреть, как по ж/д путям передвигаются товарные составы.

Если вы увидите ошибку «The car being created must fully be on one track», значит на пути недостаточно места для помещения поезда перед элементом Точка ж/д пути stopLineEntry. В этом случае вам нужно будет увеличить длину пути trackEntry и отодвинуть дальше элемент Точка ж/д пути stopLineEntry от начальной точки ж/д пути.

Локомотив подъезжает к составу, состоящему из вагонов, чтобы сцепиться с ним.

Мы также видим, как локомотив толкает вагоны на горку, после чего останавливается, вагоны отцепляются и сортируются.

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

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

AnyLogic предоставляет удобный Мастер создания типа вагона. Просто укажите имя нового типа вагона и выберите фигуру анимации из списка готовых 3D объектов.

  Задайте типы вагонов

1. Создайте новый Тип вагона, перетащив элемент Тип вагона из палитры Железнодорожная библиотека на графическую диаграмму Main.

2. Откроется окно Мастера Создание агентов. Укажите Имя нового типа как Locomotive, оставьте опцию Создать новый тип агента «с нуля» выбранной. Нажмите Далее.

3. Выберите Locomotive 14.1m в качестве его фигуры анимации в 3D режиме.

3. Добавьте еще 5 типов вагонов таким же образом. Назовите их BoxCar, OpenCar, GondolaCar, TankCar и HopperCar. Выберите соответствующие 3D фигуры анимации для каждого типа вагона: Крытый вагон, Открытый вагон, Полувагон, Цистерна, Хоппер.

4. Таким же образом создайте тип поезда (перетащив элемент Тип поезда из палитры Железнодорожной библиотеки). Назовите его Train.

Разнообразьте вагоны поезда

Давайте зададим алгоритм инициализации поезда, который будет использовать вагон типа Locomotive (локомотив) в качестве первого вагона состава, а следующие за ним вагоны будут выбираться случайным образом из остальных типов вагонов, заданных нами на прошлом шаге.

1. Перетащите элемент Функция из палитры Агент на диаграмму Main, назовите эту функцию carSetup и измените ее свойства следующим образом:

Эта функция будет вызываться для создания вагонов нашего состава (в блоке TrainSource). Она будет возвращать вагон одного из указанных типов.

В функции есть один аргумент: index (типа int). Мы будем использовать его для передачи этой функции индекса только что созданного вагона. Индекс первого вагона 0, поэтому условие if функции index == 0 верно, соответственно, выполняется строка return new Locomotive(); (мы указали, что первым вагоном всегда будет локомотив), после чего выполнение функции будет завершено.

Для вагонов с индексами 1, 2,... условие if неверно, поэтому выполняется оператор switch. Этот оператор проверяет значение целочисленной переменной (ее значение равномерно распределено от 1 до 5, включительно) и создает новый вагон одного из наших пяти типов вагонов, в зависимости от этого значения (если оно равно 1, будет создан тип OpenCar и так далее).

Оператор switch

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

В нашем примере, оператор returnиспользуется вместо break, потому что мы находимся в теле функции.

Синтаксис Пример
switch(<целочисленное выражение>) { case <целочисленная константа 1>: <код, выполняемый, если выражение равно константе 1> break; case <целочисленная константа 2>: <код, выполняемый в случае 2> break; … default: <код, выполняемый в других случаях> break; } intmonth; String season; switch(month) { case 1: season = “winter”; break; case 2: season = “winter”; break; case 3: season = “spring”; break; ... case 11: season = “autumn”; break; case 12: season = “winter”; break; default: season = “invalid value”; break; }

Внесите изменения в свойства блока TrainSource

Давайте укажем блоку trainSource, чтобы он создавал поезда нашего типа Train:

1. В поле Новый поезд выберите Train

2. В Поле Новый вагон введите carSetup(carindex)

Переключитесь к полю для введения кода, щелкнув по иконке , которая сменится на , позволив написать Java код в поле:

Мы вызываем функцию carSetup, чтобы задать тип создаваемого вагона поезда. Когда блок TrainSource создает новый поезд, он последовательно вызывает функцию, указанную в поле Новый вагон, для каждого вагона поезда. Используя локальную переменную carindex, мы передаем индекс только что созданного вагона в функцию. В результате, у нас будет поезд с локомотивом в качестве первого вагона, за которым следуют десять вагонов созданных нами типов.

Наблюдайте за моделью в 3D режиме

1. Добавьте 3D окно из палитры Презентация и поместите его под диаграммой процесса и анимацией.

2. Запустите модель и нажмите на кнопку   Показать область. Выберите из выпадающего списка пункт [window3d], чтобы переключиться в режим 3D просмотра. Теперь вы видите поезд, который начинается с локомотива, за которым следуют десять вагонов других типов.

Если у вас возникнут проблемы с отображением текстур 3D объектов, выключите шейдеры в настройках AnyLogic.

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

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

Нарисуйте дополнительные ж/д пути

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

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

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

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

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

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

2. Создайте еще одну Функцию и назовите ее departurePointOnTrack.

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

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

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

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

Внеси



Поделиться:


Последнее изменение этой страницы: 2021-05-12; просмотров: 214; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.72.224 (0.164 с.)