Как в энилоджик сделать путь со стрелочками
Перейти к содержимому

Как в энилоджик сделать путь со стрелочками

  • автор:

Шаг 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 . Здесь будет производиться сортировка вагонов.

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

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

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

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

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

Ж/д путь

Элемент Ж/д путь является графическим элементом разметки пространства, непрерывный железнодорожный путь (т.e. такой путь, который не содержит стрелок) произвольной формы. Ж/д путь может содержать множество прямых и дуговых сегментов. При создании ж/д пути, AnyLogic автоматически размещает его в ж/д узле. В дальнейшем ж/д узел можно расширить, добавляя другие ж/д пути.

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

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

Находящиеся на пути вагоны

Блокировка и резервирование путей

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

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

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

Ж/д путь нельзя зарезервировать дважды. При повторном резервировании уже зарезервированного пути возникает ошибка.

Путь остается заблокированным до вызова функции unblock() . Резервирование пути снимается после того, как все указанные при резервировании поезда завершают движение по этому пути. Вы также можете отменить резервирование с помощью вызова функции cancelReservation() .

Чтобы нарисовать ж/д путь

  1. Дважды щелкните элемент Ж/д путь в секции Железные дороги палитры Разметка пространства.
  2. Значок элемента палитры поменяется на . Это означает, что активирован режим рисования и теперь вы можете рисовать ж/д путь в графическом редакторе точка за точкой.
  3. Щелкните мышью по графическому редактору, чтобы поставить первую точку пути. Щелкайте мышью, чтобы добавлять точки поворотов.
  4. Чтобы нарисовать дуговой сегмент, не отпускайте кнопку мыши после щелчка и двигайте курсором. Отпустите кнопку мыши, когда этот сегмент готов и можно добавить следующий.
  5. Чтобы завершить рисование, добавьте последнюю точку пути двойным щелчком мыши.
  6. Вы можете редактировать ж/д путь после того, как он завершен. Выделите путь в графическом редакторе, щелкнув по нему мышью, затем щелкните точку изгиба и, удерживая кнопку мыши, перетащите ее. Соединяющиеся с этой точкой сегменты пути буду изменяться, пока вы перетаскиваете точку. Отпустите кнопку мыши, когда путь примет требуемую форму.
  7. Точки редактирования могут быть добавлены и удалены двойным щелчком мыши в любом месте на элементе Ж/д путь. Если вы сделаете двойной щелчок по начальной или конечной точке пути, то этот сегмент, в начале или в конце элемента, будет удален.
  8. Вы можете так же редактировать ж/д путь, делая сегменты прямыми или дуговыми, на любой стадии рисования.

Чтобы добавить дополнительный сегмент к пути

  1. Вы можете продолжить рисовать ж/д путь даже после того, как завершили процесс рисования двойным щелчком мыши.
  2. Щелкните правой кнопкой мыши нарисованный в графическом редакторе путь и выберите опцию Добавить линию из контекстного меню. Вы можете добавить линию в любой крайней точке пути. Щелкните одну из них мышью.
  3. Теперь вы снова в режиме рисования. Вы можете добавить столько сегментов, сколько вам необходимо, как прямых, так и дуговых.
  4. Чтобы завершить рисование, добавьте последнюю точку пути двойным щелчком мыши.

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

Чтобы сделать дуговую линию прямой

  1. Щелкните мышью ж/д путь в графическом редакторе, чтобы выделить его.
  2. Зажмите клавишу Ctrl на клавиатуре, не отпуская ее, щелкните мышью точку изгиба дугового сегмента и перетащите ее.
  3. Отпустите клавишу Ctrl и кнопку мыши, когда сегмент стал прямым и принял требуемую форму.

Чтобы сделать прямую линию дуговой

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

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

Чтобы соединить два пути в один

  1. Перетащите конечную точку одного пути на конечную точку другого пути, к которой вы хотите присоединить этот путь. Железнодорожные пути объединятся в один путь.

Чтобы соединить два и более путей с помощью стрелки

  1. Вы можете соединять ж/д пути с помощью стрелок, если нарисуете присоединение сегмента одного пути к любой части пути другого, только не к его крайней точке. Например, на рисунке ниже элемент разметки ж/д путь railwayTrack был присоединен к пути railwayTrack1 в середине пути.
    Таким образом можно присоединить множество путей друг к другу.
  2. Стрелка появится на месте соединения автоматически. Она выделена голубым цветом. Теперь вы создали сеть с несколькими ж/д путями в ней. На рисунке вы можете видеть, что стрелка разделяет путь на части, railwayTrack1 и railwayTrack2, в то время как путь railwayTrack не сливается с другим, а остается отдельным путем. В одной стрелке могут сходиться несколько путей.
  3. Щелкнув мышью один раз, вы выберете сначала всю сеть целиком, поэтому сделайте еще один щелчок, чтобы выбрать стрелку и редактировать ее свойства. Если вы щелкните правой кнопкой мыши точечный узел и выберете Удалить из контекстного меню, пути останутся соединенными графически, но они больше не будут сетью.

Чтобы разъединить один путь на два

  1. Щелкните ж/д путь в графическом редакторе правой кнопкой мыши и выберите опцию Разделить на две фигуры из контекстного меню.
  2. Когда точки изгиба будут выделены, щелкните мышью по той из них, где нужно разделить путь на сегменты. Теперь каждый из сегментов, ранее соединенных этой точкой, стал отдельным путем, и вы можете редактировать каждый путь отдельно. Даже если сегменты выглядят, будто они еще соединены, она соединены только графически и не являются больше одним ж/д путем.

Свойства

Основные свойства

Имя — Имя фигуры.

Исключить — Если опция выбрана, то фигура будет исключена из модели.

Отображается на верхнем агенте — Если опция выбрана, то фигура будет видна на презентации типа агента, в который будет вложен данный агент.

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

Видимость — Если опция выбрана, то фигура будет отображаться на презентации во время выполнения модели.

Двунаправленный — Здесь вы можете задать движение по пути в обоих направлениях.

Тип — Тип пути. По умолчанию выбран: Жел. дорога.

Цвет линии — Недоступен, когда Тип: Жел. дорога.

Ширина колеи — Расстояние между внутренними гранями головок рельсов.

X — x-координата начальной точки пути.

Y — y-координата начальной точки пути.

Z — [Доступно, только если установлен флажок Отображать в: В 2D и в 3D или Только в 3D] z-координата начальной точки пути.

В секции свойств Точки расположена таблица относительных координат точек пути.

Первая точка всегда имеет координаты (0,0,0), и они не редактируются.

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

И если координаты точек в двумерном пространстве XY вы можете изменить и в графическом редакторе, то расположение точек пути относительно оси Z можно изменить только в этой таблице.

Отображать в — Если выбрано В 2D и в 3D или Только в 3D, то будет создан трехмерный аналог двумерной фигуры. Тогда в режиме запуска модели двумерная фигура будет отображаться там же, где она и была нарисована в графическом редакторе, а трехмерная будет видна в специальном элементе, предназначенном для просмотра трехмерной анимации — 3D окне.

Отображать имя — Если опция выбрана, то имя фигуры будет отображаться в графическом редакторе.

Направление движения

У ж/д пути есть начальная и конечная точка и поэтому у него есть направление движения. Направление движения не отображается графически на элементе пути, если путь двунаправленный.

Точная позиция на ж/д пути может быть задана элементом Точка ж/д пути.

Чтобы изменить направление движения по пути

  1. Щелкните ж/д путь в графическом редакторе правой кнопкой мыши и выберите опцию Изменить направление из контекстного меню. Вы увидите, что теперь путь изменил свое направление.

Функции

Вагоны и поезда

Функция Описание
int nCars() Возвращает количество вагонов на пути (включая частично находящиеся на этом пути вагоны).
Agent getFirstCar() Возвращает вагон, ближайший к началу пути, или null , если путь пуст.
Agent getLastCar() Возвращает вагон, ближайший к концу пути, или null , если путь пуст.
Agent getCar(int index) Возвращает вагон, занимающий на пути позицию с заданным номером index . Подсчет вагонов ведется от начала пути, при этом считаются все вагоны: движущиеся, стоящие, сцепленные, а также вагоны, находящиеся на пути лишь частично.

Функция Описание
RailwaySwitch getStartSwitch() Возвращает стрелку (объект Стрелка ) в начале ж/д пути.
RailwaySwitch getEndSwitch() Возвращает стрелку в конце ж/д пути.
RailwaySwitch getSwitch(boolean atend) Возвращает стрелку, находящуюся в начале или конце пути.

Блокировка и резервирование

Функция Описание
void block() Блокирует ж/д путь. Поезда, которые находятся на пути в момент блокировки, могут покинуть путь, но не могут войти на него снова, пока он заблокирован.
void unblock() Снимает блокировку ж/д пути.
boolean isBlocked() Проверяет, заблокирован ли ж/д путь. Если функция возвращает значение true , путь заблокирован. Если false — путь не заблокирован.
void setBlocked(boolean blocked) Меняет «заблокированное» состояние ж/д пути.

Местоположение

Функция Описание
RailwayNetwork getRailYard() Возвращает ж/д узел (ж/д сеть), которому принадлежит этот путь, или null если путь не является частью ж/д узла.
Функция Описание
double length() Возвращает длину пути в пикселях
double length(LengthUnits units) Возвращает длину пути в указанных единицах измерения длины.

Функция Описание
Level getLevel() Возвращает уровень, на котором расположен этот путь.

Внешний вид

Функция Описание
Texture getTexture() Если у фигуры есть текстура, возвращает ее.
Color getColor() Возвращает цвет фигуры, или null . если фигуре не задан цвет или задана текстура (в этом случае используйте getTexture() ).
void setColor(Color color) Задает цвет фигуры.

Функция Описание
boolean isVisible() Проверяет, виден ли путь. Если true , путь виден, если false — нет.
void setVisible(boolean v) Задает видимость пути.

Функция Описание
void remove() Удаляет путь из презентации. Если путь не является частью презентации, функция не выполняет ничего. Обратите внимание, что удаление из презентации не обязательно подразумевает удаление из логики модели, поскольку логические сети и маршруты могли быть заданы еще до удаления элемента и не исчезают.

Беги, муравей. Беги

В данной статье рассматривается процесс создания имитационной модели поведения муравьиной колонии (можно почитать в википедии ) в среде имитационного моделирования «AnyLogic». Данная статья носит практический характер. В ней будет рассмотрен вопрос применения муравьиного алгоритма для решения задачи о коммивояжёре (Почитать можно тут).

Кратко о сути

Суть задачи коммивояжере заключается в том, что коммивояжер (продавец) должен посетить N городов побывав в каждом из них только один раз по наикратчайшему маршруту. Так как данная задача является NP-сложной и количество вариантов всех возможных маршрутов между N городами вычисляется как «N!», то время поиска кратчайшего маршрута будет увеличиваться по экспоненциальному закону с увеличением значения N. Соответственно время поиска кратчайшего маршрута(решения) с использованием алгоритма «полного перебора» (который дает точное решение) при количестве городов N>16 резко увеличивается (носит экспоненциальный характер). Поэтому мы будем искать не самый короткий по протяженности маршрут, а близкий к нему (рациональный) за конечное время с помощью «муравьиного алгоритма».

Немного слов о AnyLogic – это мощный инструмент позволяющий создавать имитационные модели различной сложности. В нем заложены различные подходы имитационного моделирования. Мы с Вами будем разбирать только один из подходов а именно «Агентное» моделирование. Реализован он на языке программирования «Java», который дополняет существующий инструментарий. Главным недостатком «AnyLogic» является ограничения бесплатной версии по количеству создаваемых агентов их количество не может быть более 50000. «Агент» – является базовой единицей системы имитационного моделирования AnyLogic. Более подробную информацию можно прочитать на сайте www.anylogic.ru

Инструменты

1. Anylogic – качаем бесплатную версию вот отсюда www.anylogic.ru/downloads
Первоначальное знакомство AnyLogic:

  • зеленая область – пространство агента, в котором мы как раз и будем творить;
  • красная область – свойства объекта, который находится в фокусе;
  • палитра – инструменты, которые можете использовать при создании модели;
  • проекты – структура разрабатываемой модели.

Рис. 1- Рабочее окно AnyLogic

Создание проекта

Тут все просто. Жмем на пункт меню «Файл» далее «Создать» и далее «Модель» вводим имя модели и жмем кнопку «Готово» (рис. 2).

Рис. 2- Создание модели

Создаем города

Ну что, приступим. Первое что, мы сделаем так это создадим так называемые города(вершины графа), которые будет посещать муравей посещать. Для чего открываем в палитре вкладку «Агент» и перетаскиваем оттуда красный кружочек с человечком в «Main» агента как это показано на рисунке 3.

Рис. 3- Создание городов

После того как вы отпустите кнопку мыши у Вас появиться диалоговое окно («Шаг 1»), предлагающее Вам создать агента. Где необходимо будет выбрать пункт «Популяция агентов» и нажать на кнопу «Далее».

Рис. 4- Создание городов

Появиться следующее диалоговое окно (Шаг 2) где необходимо будет ввести имя нового типа агента и имя популяции агентов. Вводим тип «MyTown» и имя популяции «myTowns» и жмем на кнопку «Далее».

Рис. 4а — Вводим имя нового агента

Далее появится следующие окно (Шаг 4.). Здесь выбираем «Анимация агента 2D» и иконку с надписью «Завод» и нажимаем кнопку «Готово» (рис. 5).

Рис. 5- Добавляем анимацию для агента

Теперь создадим переменную, которая будет определять начальное количество городов в нашей модели. Для чего из «Палитры» перетаскиваем в агент «Main» иконку с надписью «Переменная» и вводим ее название «numberTown». Далее нажимаем на иконку нашей переменной и во вкладке Свойства вводим ее начальное значение равное, например 10 и выбираем ее тип «int» (рис. 6).

Рис. 6- Создание переменной

Теперь установим начальное значение нашей популяции городов «myTowns», для чего нажмем мышкой на ее иконку и во вкладке «Свойства» в поле «Начальное количество агентов» напишем имя созданной ранее нами переменной (рис. 7).

Рис. 7 – Изменение свойств популяции «myTowns»

Далее сделаем вывод наших городов в агенте «Main» в случайном месте. Место ограничим квадратом 400×400 точек. Для чего во вкладке «Проекты» выбираем мышкой агент «Main» и во вкладке «Свойства» в поле «При запуске» добавляем следующий код на «Java» (рис. 7а):

for (int i=0; i
  • myTowns.size() – количество созданных городов;
  • myTowns.get(i).setXY(uniform(0,400), uniform(0,400)) – устанавливаем координаты X и Y для i-го города;
  • uniform(0,400) – функция, которая возвращает случайное число в диапазоне от 0 до 400 по равновероятному закону распределения случайной величины. В среде AnyLogic заложен обширный инструментарий для работы с различными распределениями случайных величин. Есть встроенный конструктор распределений вероятностей он доступен в панели инструментов.
  • myTowns.size() – количество созданных городов;
  • myTowns.get(i).setXY(uniform(0,400), uniform(0,400)) – устанавливаем координаты X и Y для i-го города;
  • uniform(0,400) – функция, которая возвращает случайное число в диапазоне от 0 до 400 по равновероятному закону распределения случайной величины. В среде AnyLogic заложен обширный инструментарий для работы с различными распределениями случайных величин. Есть встроенный конструктор распределений вероятностей он доступен в панели инструментов под вот такой иконкой.

Рис. 7а – Расставляем города

Далее можем уже посмотреть, что у нас с Вами получилось и запустить нашу модель. Для этого используем клавишу «F5», жмем ее и запускается окно для запуска эксперимента как показано на рисунке 8.

Рис. 8 – Запуск эксперимента

Далее нажимаем на кнопку «Запустить» в нижнем левом углу окна и происходит запуск эксперимента. У Вас на экране должно получиться окно с содержимым как показано на рисунке 9.

Рис. 9 – Результат эксперимента

Итак, на данном шаге мы создали 10 городов и разместили их в случайном (стохастическом) месте на нашем экране. Теперь перейдем к созданию наших «муравьев»

Создадим муравья

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

Создание муравья происходит аналогично создания города. В «Палитре» выбираем «Агент» и перетаскиваем его в «Main». Выбираем «Популяция агентов», потом «Я хочу создать новый тип агента» далее вводим «Имя нового типа» и «Имя популяции» «MyAnt» «myAnts» и жмем «Далее». После выбираем «2D» анимация и, например иконку с надписью «Истребитель» жмем «Готово» должно получиться как показано на рисунке 10.

Рис. 10 – Создаем муравьев

Согласитесь, самолетик не похож на муравья, поэтому мы с Вами это исправим. Заходим в поисковик ищем картинку, на которой изображен муравей и меняем самолет на муравья. Для чего выполняем двойное нажатие на красный кружок возле «myAnts». После чего откроется вкладка «myAnt» где нужно удалить самолет и на его место поместить муравья (рис. 11).

Рис. 11 – Вкладка myAnt

Выделяем мышкой самолет и жмем «Del». Далее переходим во вкладку «Презентация» и перетаскиваем оттуда элемент «Изображение». После автоматически откроется диалог для выбора файла. Выбираем файл с нашим муравьем (рис. 12) и жмем «Ок».

Рис. 12 – Вкладка myAnt с муравьем и уже без самолета

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

Рис. 12а – Вкладка myAnt с муравьем

Оживляем муравья

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

Рис. 13 – Логика поведения муравья

Теперь давайте пропишем начальную логику работы диаграммы муравья. Выбираем мышкой стрелочку, которая выходит из блока под название «Выбор города» и добавляем во вкладке «Свойства» в поле «Действие» следующий код (рис. 14):

for (int i=0; i > 

Тут все очень просто идем в цикле по всем городам и подбрасываем монету (генерируем случайную величину с вероятность. 0,5) если ее значение истина (орел), то отправляем муравья к этому городу покидая цикл. Выражение «this.moveTo(main.myTowns.get(i))» — функция, которая отправляет одного агента к другому.

Рис. 14 – Задаем первоначальную логику движения муравья

Далее жмем на стрелочку, которая выходит из блока «Движение» и во вкладке «Свойства» в поле «Происходит» установим значение «При получении сообщения» и выбираем пункт «При получении заданного сообщения» в поле «Происходит» как показано на рисунке 15.

Рис. 15 – Задаем логику для перехода между «Движение» и «Все обошел»

Теперь настроим последнюю стрелочку, которая выходит из блока «Движение». Выбираем ее мышкой и во вкладке «Свойства» в поле переход устанавливаем «По прибытию агента». Конечный вид «Диаграммы состояний» должен быть как показано на рисунке 16.

Рис. 16 – Диаграмма состояний с настроенными переходами между блоками

  1. Первое состояние, в которое попадает муравей это «Выбор_города» в нем пока никаких действий не прописано.
  2. Далее он по переходу идет в следующее состояние. В этом переходе мы добавили код, который запускает цикл по всем горам и заставляет муравьев бегать по городам.
  3. Блок «Движение» тут муравей находится пока не прибудет в ранее выбранный город.
  4. Далее у него есть два пути. Первый он возвращается обратно в блок «Выбор_города» и все повторяется заново. По второму пути он должен будет пойти, когда уже побывал во всех городах. Пока второй путь у нас не настроен. Займемся им чуть позже.

Рис. 17 – Работа диаграммы состояний

Теперь можем нажать «F5» по посмотреть, что получилось (рис. 18).

Рис. 18 – Оживление муравьев

Зададим критерии

  1. Муравей должен побывать в каждом городе только один раз.
  2. Муравей, когда побывал во всех городах завершает свое движение в последнем городе.

Давайте научим муравья соблюдать эти правила. Для чего из «Палитры» вкладка «Агент» перенесем на вкладку «MyAnt» «Коллекцию» и «Переменную» и назовем их первую как «isVisited» а вторую как «distance». В первой будет учитывать города, в которых мы уже побывали, а во второй пройденное расстояние муравьем.

Рис. 19 – Добавляем переменные

Настроим коллекцию «isVisited». Для чего выбираем ее мышкой и во вкладке «Свойства» устанавливаем «Тип» элементов «int» как показано на рисунке 20.
Для переменной «distance» в ее свойствах в поле «Начальное значение» нужно поставить «0», а тип переменной «double».

Рис. 20 – Коллекция типа «int»

Теперь выбираем стрелочку, выходящую из блока «Выбор_города» и меняем код в поле «Действие» на ниже приведенный:

for (int i=0; i > 

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

Можете попробовать запустить «F5» нашу модель и посмотреть, что же получилось. Теперь муравьи будут проходить по всем городам только один раз и завершать свое движение в блоке все обошел.

Меняем первоначальное размещение муравьев

На этом шаге определим для каждого муравья случайным образом выберем город, с которого он начнет свое путешествие. Для чего на вкладке «Проекты» выбираем мышкой агент «Main» после чего во вкладке «Свойства» добавляем в поле «При запуске» следующий код (рис. 20а):

for (int i=0; i 

Рис. 20а – Расставляем муравьев по городам

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

Делаем муравьев непредсказуемыми

Внедрим в нашу модель формулу, приведенную ниже:

где Pi — вероятность перехода по пути i-му пути, li — длина i-го перехода, fi — количество феромона на i-ом переходе, q — величина, определяющая «жадность» алгоритма, p — величина, определяющая «стадность» алгоритма, при этом q+p=1.

Данную формула я позаимствовал с сайта.

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

Теперь нужно добавить несколько переменных без которых нам не обойтись. Для чего возвращаемся обратно во вкладку «Main» рисунок 21.

Рис. 21 – Вкладка «Main»

Итак, добавляем переменную «numberAnt», в которой будем хранить размер муравьиной колонии. Устанавливаем ее тип «int» и начальное значение равное 100.

Рис. 21 – Переменная «numberAnt»

Далее выбираем популяцию «myAnts» и устанавливаем поле «Начальное количество агентов» равным «numberAnt».

Переменную «p», которая будет определять стадность алгоритма. Ее тип «double» и начальное значение равное 0.5.

Переменную «q», которая будет определять жадность алгоритма. Ее тип «double» и начальное значение равное 0.5.

Рис. 22 – Переменные «q и p»

Итак, теперь зададим случайное значение феромона для каждого ребра(дороги) между городами. Для чего создаем переменную (двумерный массив) «matrixF». Установим у нее во вкладке «Свойствах» в поле «Тип» выбираем значение «Другой» и прописываем «double[][]» в поле начальное значение «new double[numberTown][numberTown]» (рис. 23).

Рис. 23 – Создание двумерного массива «matrixF». Матрица феромонов

Далее нам необходимо инициализировать данную матрицу. Другими словами, заполнить ее случайными значениями. Значение феромона возьмём случайным образом в интервале от 0,1 до
1. Для чего на вкладке «Проекты» выбираем мышкой агент «Main» и после во вкладке «Свойства» добавляем в поле «При запуске» следующий код (рис. 23а):

for (int i=0; i > 

Рис. 23а – Код инициализации матрицы феромонов

Теперь возвращаемся во вкладку «MyAnt» и приступаем к вычислению вероятности перехода в соответствии с вышеприведенной формулой. Выделяем переход между «Выбор_города» и «Движение» и меняем код в поле Действие на следующий (рис. 24):

// Объявляем переменную где будем хранить значение знаменателя double denominator=0; // Рассчитываем значение знаменателя для городов где муравей еще не был for (int i=0; i > // Объявляем переменную для расчета значение i перехода double Pi=0; // Рассчитываем текущее значение вероятности double probility=uniform(0,1); for (int i=0; i // Проверяем попало ли расчетное значение Pi в диапазон текущего значения вероятности probility if (probility > 

Рис. 24 – Задаем поведение муравья на основе аналитического выражения приведенного выше

  • li — this.distanceTo(main.myTowns.get(i)), значение протяженности между текущем положением муравья и «i» городом;
  • fi — main.matrixF[currentPos][i], значение уровня феромона между текущем городом и городом «i»;
  • denominator – denominator+(Math.pow(this.distanceTo(main.myTowns.get(i)), main.q)*Math.pow(main.matrixF[currentPos][i], main.p));, значение знаменателя Pi;
  • Pi — Pi+(Math.pow(this.distanceTo(main.myTowns.get(i)), main.q)*Math.pow(main.myTowns.get(i).f, main.p))/denominator, вероятность перехода муравья из текущего города в город «i».

Рис. 25 – Определяем условия остановки муравья

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

Обновляем значение феромона

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

Итак, для начала к первому действию, будем обновлять значение феромона ребра, между городом в котором находится муравей и в которой ему предстоит отправиться. Величину, на которую будем увеличивать текущее значение феромона ребра между городами будем вычислять очень и очень просто. Берем нашу максимальную начальную величину значения феромона = 1 у.е. и делим ее на расстояние между городом, в котором находится муравей и городом куда он собирается отправится. Соответственно, чем меньше расстояние, между городами тем больше составит значение, на которое будет увеличен уровень феромона ребра. Для чего выбираем во вкладке «Проекты» агент «MyAnt» выбираем мышкой переход между блоками «Выбор_города» и «Движение» и в поле действие добавляем следующий код «main.matrixF[currentPos][i]=main.matrixF[currentPos][i]+1/this.distanceTo(main.myTowns.get(i);». В итоге должно получаться как показано на рисунке 26

Рис. 26 – Обновляем значение уровня феромонов ребер, по которым прошел муравей

Теперь перейдем к действия №2 и создадим событие, которое будет имитировать испарение феромона на ребрах между городами. Для чего во вкладке проекты выбираем агента «Main» и создаем там еще пару переменных. Первая это «intensity» — будет определять скорость(интенсивность) испарения феромона (Начальное значение «0.5» тип «double»). Вторая «Part» — будет характеризовать долю, на которую будет уменьшаться значение феромона на ребре (Начальное значение «0.9» тип «double»).

Рис. 27 – Создаем переменные «intensity» и «Part»

Далее берем из «Палитры» вкладки «Агент» элемент «Событие» и переносим его в агент «Main» и называем его «evaporation» — этот элемент будет имитировать испарение феромона на ребрах. Жмем на него мышкой и в «Свойствах» в поле «Тип события» выбираем значение «С заданной интенсивностью» в поле «Интенсивность» прописываем имя переменной, которая хранит значение интенсивности «intensity». Время срабатывания оставляем секунды. Далее в действие добавляем код, приведенный ниже:

for (int i=0; i > 

При срабатывании события «evaporation» будут обновляться значения уровня феромона в матрице matrixF. В итоге у Вас должно получаться так как показано на рисунке 28.

Рис. 28 – Создаем событие «evaporation»

Определим победителя

На этом шаге допишем код, который будет определять победителя нашего муравьиного марафона. Победителем будет тот из муравьев, который пробежал по протяженности самый короткий маршрут. В дополнение ко всему после окончания марафона начертим этот маршрут на экране. Для достижения этой цели создадим в агенте «Main» три переменные «bestAnt», «bestDistance» и «numberFinish». В переменной «bestAnt» мы будем хранить индекс самого «быстрого» муравья, тип переменной будет «int» а начальное значение установим «-1». В переменной «bestDistance» будем хранить текущее значение наилучшего по протяженности маршрута между городами, тип переменной будет «double» а начальное значение установим равным бесконечности «infinity». В переменной «numberFinish» будем хранить количество муравьев, которые финишировали в нашем марафоне, тип переменной будет «int» а начальное значение равно «0» (рис. 29).

Рис. 29 – Создаем событие переменных

Далее создадим функцию, которая после финиширования всех муравьев будет рисовать линии наилучшего маршрута между городами. Для чего из «Палитры» перетаскиваем в агент «Main» элемент с названием функция. Имя функции устанавливаем drawPath и во вкладке «Свойства» в поле тело функции добавляем следующий код:

// Цикл по порядку следования по городам муравья победителя for (int i=0; i // Добавляем замыкающую линию между начальным городом и конечным городом в маршруте ShapeLine myLine = new ShapeLine(); myLine.setX(myTowns.get(myAnts.get(bestAnt).isVisited.get(myAnts.get(bestAnt).isVisited.size()-1)).getX()); myLine.setY(myTowns.get(myAnts.get(bestAnt).isVisited.get(myAnts.get(bestAnt).isVisited.size()-1)).getY()); myLine.setEndX(myTowns.get(myAnts.get(bestAnt).isVisited.get(0)).getX()); myLine.setEndY(myTowns.get(myAnts.get(bestAnt).isVisited.get(0)).getY()); myLine.setColor(blue); myLine.setLineStyle(LINE_STYLE_SOLID ); myLine.setLineWidth(1); presentation.add(myLine); 

В итоге у Вас должно получиться так как показано на рисунке 29а.

Рис. 29а – Создаем функцию «drawPath»

Теперь возвращаемся обратно к нашим муравьям и дописываем код, который будет определять муравья победителя, протяженность наилучшего маршрута и рисовать этот маршрут между городами. Для чего во вкладе «Проекты» выбираем агента «MyAnt» далее выбираем блок «Все_обошел» и добавляем в поле «Действие при входе» нижеприведенный код:

// Добавляем единичку после финиша main.numberFinish++; // Определяем показатели победил муравей или нет if (main.bestDistance>distance) < // Если он прошел расстояние меньше глобального значения наилучшего расстояния протяженности марута // то мы делаем это расстояние наилучшим main.bestDistance=distance; // Запоминаем номер муравья победителя main.bestAnt = this.getIndex(); >// Если все муравьи финишировали вызываем функцию з агента Main для отрисовки маршрута if (main.numberFinish==main.myAnts.size()) main.drawPath(); 

Должно получиться как показано на рисунке 30.

Рис. 30 – Добавление логики в блок «Все_обошел»

После чего можете нажать «F5» и запустить модель. Муравьи будут бегать искать маршруты, а когда финишируют города соединит синяя линия, которая и есть наилучший маршрут.

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

Для того чтобы модель стала более научной нужно обязательно добавить график. Поэтому мы с Вами добавим не просто график и гистограмму, которая будет показывать нам распределение протяженности маршрутов, которые преодолели муравьи. Для чего во вкладке «Проекты» выбираем агента «Main» и переходим в его пространство. Далее В «Палитре» переходим во вкладку «Статистика» и оттуда в агент «Main» переносим элемент «Данные гистограммы» и непосредственно саму «Гистограмму». Потом выбираем мышкой гистограммы и во вкладке «Свойства» в поле «Данные» прописываем имя наших «Данных гистограммы» т.е. «data».

Должно получиться как показано на рисунке 31

Рис. 31 – Строим график

После чего нам придется опять вернуться к нашему муравью и заставить его наполнять «Гистограмму» значениями протяженности маршрута. Для чего во вкладке проекты выбираем агента «MyAnt» и переходим в его пространство. Далее выбираем блок «Все_обошел» и добавляем в него одну строчку «main.data.add(distance);». Должно получиться как показано на рисунке 32.

Рис. 32 – Строим график

Далее нажимает «F5» и приступаете к исследованию поведения муравьиного алгоритма. Должно получиться что, то вроде как показано на рисунке 33.

Рис. 33 – Моделируем

Заключение

И в конце рекомендую добавить в модель еще больше непредсказуемости. Для чего во вкладке «Проекты» выбираете мышкой элемент «Simulation: Main» и во вкладке свойства устанавливаете параметр «Случайность» в положение «Случайное начальное число (уникальные прогоны)» — это позволит каждый запуск модели сделать уникальным (рис. 34).

Рис. 34 – Делаем случайными прогоны

  • Java
  • AnyLogic
  • муравьиный алгоритм
  • задача о коммивояжере
  • маршрут
  • имитационное моделирование
  • модель
  • Занимательные задачки
  • Программирование
  • Java
  • Алгоритмы
  • Математика

А.Е.Осоргин_-_AnyLogic_6_Лабораторный_практикум

15. Как установить синхронизацию действий агентов? (3) 16. С помощью функции сбора статистики постройте график зависимости количества «счастливых» и «несчастных» людей от времени. (3 ) 17. Какие преимущества и недостатки дает объявление реплицированных объектов агентами? (3)

ЗАДАНИЯ 13-14 ENTERPRISE LIBRARY: МОДЕЛИРОВАНИЕ ТРАНСПОРТНЫХ СИСТЕМ ЦЕЛИ ЗАНЯТИЯ • освоение методов дискретно-событийного моделирования; • знакомство с библиотекой Enterprise Library; • построение модели транспортной системы. ФОРМА ОРГАНИЗАЦИИ ЗАНЯТИЯ Фронтальная. СТУДЕНТ ДОЛЖЕН ЗНАТЬ понятия: дискретно-событийная система, параметры объекта; интерфейс программы AnyLogic. СТУДЕНТ ДОЛЖЕН УМЕТЬ создавать модели в программе AnyLogic, ОБЕСПЕЧЕННОСТЬ компьютер с установленной программой AnyLogic версии 6, настоящий курс лабораторно-практических работ. ПРАКТИЧЕСКОЕ ЗАДАНИЕ О БИБЛИОТЕКЕ ANYLOGIC ENTERPRISE LIBRARY Библиотека Enterprise Library подерживает дискретно-событийный подход моделирования. С помощью объектов библиотеки можно моделировать системы реального мира, динамика которых представляется последовательностью операций (прибытие, задержка, разделение и т.п.) над некими сущностями, представляющими клиентов, документы, звонки, пакеты данных, транспортные средства и т.п. Процессы задаются в форме потоковых диаграмм (блок-схем) в графическом представлении. Объекты библиотеки Enterprise Library являются «кирпичиками» для построения блоксхемы, моделирующей процессы, происходящие с заявками. 13.1. ПОСТАНОВКА ЗАДАЧИ Рассмотрим простую систему, предоставляющую собой транспортную развязку, например, перекресток. Через перекресток движутся потоки автомобилей. Для упорядочивания движения служит автоматический светофор или регулировщик. Наиболее типичной целью

исследования в подобных задачах является оценка эффективности системы, т.е. нахождение числовых значений характеристик, описывающих качество управления системой. Такими характеристиками могут быть, например, время, требуемое для проезда перекрестка, длина очереди перед светофором и др. Требуется построить имитационную модель транспортной развязки по индивидуальному заданию и отобразить гистограмму времени её проезда. 13.2. МОДЕЛЬ Создайте новую модель Дорога на основе шаблона Дискретно-событийное моделирование . Поставьте галочки напротив выборов: Добавить гистограмму распределения времени пребывания в системе, Добавить график, а в Анимации укажите 3D . Пункт – Использовать ресурсы выбирать не нужно. AnyLogic создаст модель, как показано на рис. 13.1. В верхнем левом углу расположена потоковая диаграмма, состоящая из 4-х элементов: source, queue, delay и sink . Рассмотрим их подробнее. Рис. 13.1 Source – создает заявки, в настраиваемые моменты времени. Объект Source не разрешает заявкам храниться в буфере выходного порта, если они не могут покинуть объект. Поэтому в случае, когда за объектом source расположен объект, который по той или иной причине не может принять новую заявку, нужно между ними поставить специальный объект буферизации, например, queue .

Queue – хранит заявки в определенном порядке. Моделирует очередь заявок, ожидающих приема объектами, следующими за ним в потоковой диаграмме. Delay – задерживает заявки на заданный период времени. Время задержки вычисляется динамически, может быть случайным или зависеть от каких-то других условий. Это время может вычисляться как длина фигуры анимации этого объекта, поделенной на «скорость» заявки. Sink – уничтожает поступившие заявки. Обычно используется в качестве конечной точки потока заявок. Запустите модель и посмотрите, как она работает. 13.3. ПЕРЕКРЕСТОК Автомобили подъезжают к перекрестку в произвольные моменты времени, поэтому объект source также должен создавать заявки в случайные моменты времени. Выделите объект source , и в строке свойств Заявки прибывают согласно выберите Времени между прибытиями . В появившемся поле ввода времени между прибытиями запишите exponential(0.1) . Функция exponential генерирует реализацию случайной величины с экспоненциальным законом распределения. Остальные параметры этого объекта пока оставим без изменения. В свойствах объекта queue следует удалить связь с анимацией: в поле Фигура анимации панели свойств, удалите ссылку на polyline. Заявки, находящиеся в очереди, анимироваться не будут. Этот объект будет выполнять буферную функцию для предотвращения ошибки в момент, когда source создал заявку, а delay еще не готов ее принять. В свойствах объекта delay следует сделать следующие изменения:

Задержка задается – укажите: Как длина пути/скорость ,
Время задержки – исправьте на triangular(5., 10., 15.),

• Вместимость – исправьте на 10, • Фигура анимации – исправьте на polyline, • Тип анимации – исправьте на Путь . Изменим фигуру анимации, вместо человечка пусть будет автомобиль. Откройте палитру 3D Объекты и перенесите мышью объект Автомобиль на диаграмму класса Main . Этот элемент получит имя по умолчанию car . В свойствах объекта source измените поле Фигура анимации заявки на car и поставьте галочку в поле Разрешить вращение . При запуске, модель должна выглядеть, как показано на рис. 13.2. Подъехав к перекрестку, автомобили должны перестроиться в 3 потока для проезда прямо, и поворотов направо и налево. Смоделируем это действие. Для разделения потока заявок служат объекты selectOutput и selectOutput5 . Перенесите из палитры Enterprise Library на диаграмму класса Main объект

selectOutput5 и поместите его между delay и sink , предварительно удалив связь между ними. SelectOutput5 направляет входящие заявки в один из пяти выходных портов в зависимости от выполнения заданных условий. В свойствах этого объекта укажите Вероятность 0, Вероятность 1 и Вероятность 2 – равными 1/3. , а Вероятность 4 и 5 сделайте равной 0. Рис. 13.2 Двигаясь в 3 потока, автомобили должны останавливаться перед стоп-линией на красный сигнал светофора. Для моделирования движения с остановкой подходит объект Conveyor , который моделирует конвейер, который перемещает заявки по пути заданной длины с заданной скоростью (одинаковой для всех заявок), сохраняя их порядок и оставляя заданные промежутки между ними. Когда заявка достигает конца конвейера, но не может его покинуть, то она там и останется. Если конвейер – накапливающий, то он продолжит двигать заявки, которые имеют достаточно свободного места перед собой. Перенесите из палитры Enterprise Library на диаграмму класса Main три объекта conveyor и поместите их между selectOutput5 и sink . Так как в объекте selectOutput5 заявки не могут оставаться, а конвейер может оказаться не готовым их принять, нужно между ними добавить буферный объект queue . Соедините объекты, как показано на рис. 13.3. Для анимации движения заявок (автомобилей) по конвейеру (зоне остановки перед

светофором) нужно нарисовать три ломаных линии и связать их с соответствующим объектом conveyor. Рис. 13.3 Чтобы не запутаться при построении модели, необходимо в названиях объектов, относящихся к одному потоку придерживаться следующих правил: объекты потока № 1 до разделения по направлениям нумеровать соответствующей цифрой, например: polyline1 , delay1 и т.д.; объекты этого же потока после разделения по направлениям следует называть так: polyline11 – для потока, движущегося через перекресток прямо, polyline1R1 и polyline1L1 – для потоков, движущихся через перекресток соответственно направо и налево. Рис. 13.4 Нарисуйте ломаные и переименуйте все объекты в соответствии с рис. 13.4. В свойствах объектов conveyor следует сделать следующие изменения: • Длина задается – укажите: Согласно пути , • Расстояние между заявками – укажите: 55,

• Фигура анимации – укажите на соответствующую ломаную. Не забудьте переименовать связь объекта delay1 с объектом polyline1 . Для моделирования остановки автомобилей на красный свет необходимо в диаграмму установить элемент, останавливающий движение заявок – hold . Этот объект блокирует/разблокирует поток заявок на определенном участке блок-схемы. Если объект находится в заблокированном состоянии, то заявки не будут поступать на его входной порт, и будут ждать, пока объект не будет разблокирован. Поставьте 3 объекта hold после conveyor, рис. 13.5. Рис. 13.5 Рис. 13.6 Добавьте на диаграмму две кнопки в свойствах которых напишите команды для блокирования всех трех объектов hold:

hold1L.setBlocked( true ); hold1.setBlocked( true ); hold1R.setBlocked( true ) и команды для разблокирования объектов hold: hold1L.setBlocked( false ); hold1.setBlocked( false ); hold1R.setBlocked( false ) Для отображения сигнала светофора нарисуйте овал рядом с местом остановки автомобилей и динамически изменяемым цветом заливки: красный и зеленый в зависимости от того – разрешено движение данному потоку или нет. Теперь осталось только добавить элементы для моделирования движения автомобилей после светофора: delay1L1, delay12, delay1R1 и delay13 , а также ломаные для анимации движения и визуализации границ перекрестка, рис. 13.6. Запустите модель и выполните необходимые доработки в соответствии с заданием. 13.4. КОНТРОЛЬНЫЕ ЗАДАНИЯ Для выполнения задания необходимо использовать справочную систему AnyLogic по библиотеке Enterprise Library . 1. Доработайте модель таким образом, чтобы отображалось 2 потока автомобилей, движущихся навстречу. Автомобили должны пропускать друг друга согласно правила «помеха справа». (5) 2. Доработайте модель в перекресток с круговым движением и «главным» кольцом. (5) 3. Добавьте в модель пешеходный переход и анимацию пешеходов. Автомобили должны автоматически останавливаться, как только пешеход ступит на проезжую часть. (5) 4. Доработайте модель в перекресток с круговым движением и «главным» въездом на кольцо. (5) 5. Доработайте модель таким образом, чтобы отображалось 2 потока автомобилей, движущихся во встречном направлении. Поворот налево производится через поворот направо и движение по кольцу, как показано на рис. 13.8. Автомобили должны пропускать друг друга согласно правила

«помеха справа». (4) 4
6. Доработайте модель в Т-образный перекресток, как
показано на рис. 13.7. Алгоритм движения: 1
a. поток №1 движется всегда;
b. в первом состоянии движутся потоки №3 и №4, 2
остальные стоят;
c. во втором состоянии движутся потоки №2 и 5
№5, остальные стоят; 3

d. в третьем состоянии движется только поток №3 и пешеходы могут переходить улицу вдоль главной магистрали. Рис. 13.7 e. переключение режимов светофора полуавтоматическое – с кнопкой и анимацией для пешеходов. (4)

7. Доработайте модель таким образом, чтобы отображалось 4 потока автомобилей, движущихся с разных сторон. Перекресток должен регулироваться вручную. (5) 8. Доработайте модель в перекресток с круговым движением и автоматическим регулированием. (4) 9. Доработайте модель таким образом, чтобы отображалось 2 потока автомобилей, движущихся перекрестно и поток пешеходов, движущийся из «левого нижнего угла» в «правый верхний». Перекресток должен регулироваться автоматически. Пешеходы, подходя к перекрестку должны идти на тот зеленый сигнал, который горит в данный момент. (4) 10. Доработайте модель таким образом, чтобы отображалось 4 потока автомобилей, движущихся с разных сторон. Перекресток должен регулироваться автоматически. (4) 11. Доработайте модель в железнодорожный переезд со шлагбаумом, поездом и семафором. (4) 12. Доработайте модель таким образом, чтобы отображалось 2 потока автомобилей, движущихся во встречном направлении. Поворот налево производится через поворот направо и движение по

кольцу, как показано на рис. 13.8. Светофор
автоматический. (4) Рис. 13.8

13. Доработайте модель в Т-образный перекресток, как показано на рис. 13.7. Алгоритм движения: a. поток №1 движется всегда; b. потоки №3 и №4 движутся только тогда, когда стоят потоки №2 и №5; c. переключение режимов светофора – автоматическое. (3) 14. Доработайте модель таким образом, чтобы на гистограмме отражались данные отдельно по каждому направлению движения. (3) 15. Доработайте модель в Т-образный перекресток, как показано на рис. 13.7. Алгоритм движения: a. потоки №1 и №4 движутся всегда; b. поток №3 движется только тогда, когда стоят потоки №2 и №5; c. переключение режимов светофора – ручное, кнопками. (3) 16. Добавьте в модель пешеходный переход и анимацию пешеходов. Регулирование автоматическое. (3) 17. Доработайте модель таким образом, чтобы движение прямо, направо и налево регулировалось раздельно и сопровождалось анимацией светофора с боковыми секциями (стрелками). (3)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *