Скачиваний:
18
Добавлен:
07.11.2020
Размер:
1.02 Mб
Скачать

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

  1. Создание различных типов агентов.

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

Создание агента обычно начнется с определения его интерфейса для связи с внешним миром.

Создадим новую модель, по той же схеме, что была в 1 лабораторной работе. AnyLogic автоматически создаст тип агента  Main и простой эксперимент  Simulation. 

Теперь добавим сервисный центр. В панели Палитра выбираем раздел агент (рисунок 1).

Рисунок 1 - Палитра агент

Перетащим элемент агент из палитры на диаграмму Main. После этого автоматически откроется окно Создание Агента. Выбираем опцию Единственный агент на первом шаге (рисунок 2). Нам нужно создать только один сервисный центр, который будет отправлять транспорт к турбинам по запросам на плановое обслуживание или при авариях. 

Рисунок 2 - Создание агентов «Шаг 1»

Мы не будем использовать данные из базы данных, поэтому оставим выбранным опцию «Создать новый тип агента "с нуля"». Задаем Имя нового типа: MC и имя самого агента center в поле ниже. Нужно щелкнуть «Далее», чтобы продолжить.

Третьим шагом в создании агента будет выбор типа анимации 3D, затем выберем фигуру анимации Ангар из секции «Здания» и щелкнем «Далее» (рисунок 3).

Рисунок 3 - Создание агента "Шаг 3"

Пропускаем четвертый шаг. Мы хотим, чтобы все наши агенты "жили" в непрерывном пространстве, размерами 1000x600, в сети со случайным расположением агентов. Популяции агентов, которые мы позже так же добавим на диаграмму Main, будут жить в той же среде.

После создания нового типа агента  MC, мы можем найти его в дереве модели на том же уровне, что и тип агента Main, а сам агент  center находится в ветке Main>   Агенты (рисунок 4).

Рисунок 4 - Список проектов

Добавление ветреных турбин.

Перетаскиваем элемент «Агент»   из палитры «Агент» на диаграмму типа агента  Main.

В этот раз выбираем опцию «Популяция агентов». Щелкаем «Далее» на шаге 2 (по умолчанию выбрана нужная нам опция «Я хочу создать новый тип агента»). На следующем шаге мастера создания агентов вводим имя нового типа: Turbine и тогда автоматически появится имя популяции: turbines. Щелкаем «Далее».

На 4 шаге выбираем 3D фигуру анимации Ветряная турбина из секции списка объектов «Энергетика».

Нам не нужно сейчас создавать какие-либо параметры, так что пропускаем шаг 5. На шаге 6, задаем количество агентов, которые мы хотим видеть в этой популяции: 10 агентов (рисунок 5).

Рисунок 5 - Размер популяции

Добавление транспорта.

Перетаскиваем элемент Агент   из палитры Агент на диаграмму типа агента  Main. 

  1. Снова выбираем опцию «Популяция агентов». Щелкните «Далее» на шаге 2 (Я хочу создать новый тип агента). На следующей странице мастера (шаг 3) вводим в поле Имя нового типа: Transport, то же вводим в поле Имя популяции: transport. Щелкните «Далее».

  2. Это пустая популяция, которой не нужна анимация. Мы будем использовать этот тип агента, чтобы задать логику модели. Выбираем «Нет» для типа анимации, пропускаем шаг создания параметров, выбираем опцию «Я хочу добавить агентов позже, во время выполнения модели, а пока оставить популяцию пустой» и щелкаем «Готово».

Добавление в модель грузовиков и вертолетов.

  1. Перетаскиваем элемент Агент   из палитры Агент на диаграмму типа агента  Main. 

  2. Снова выбираем опцию «Популяция агентов». Щелкаем «Далее» на шаге 2 (Я хочу создать новый тип агента). На следующей странице мастера (шаг 3) вводим в поле Имя нового типа:Truck, пусть имя популяции автоматически заполнится как trucks. Щелкаем «Далее».

  3. Выбираем фигуру 3D анимации Грузовик из секции «Автодорожный транспорт» на следующем шаге. Нам не нужно добавлять сейчас параметры в мастере. Всего в популяции будет 5 агентов, а настройки среды уже будут заполнены. 

  4. После того, как мы создадим тип агента Truck, выделяем Truck в дереве элементов модели и переходим в панель «Свойства». Сначала откроем секцию свойств «Размеры и движение». Мы считаем, что грузовики в среднем движутся со скоростью 70 км в час.

  5. Откроем секцию свойств «Специфические» и укажем, что тип агента Truck наследуется от типа агента Transport. Для этого выбираем в параметре «Расширяет тип агента» Transport.

  6. Зададим для грузовика чуть увеличенный масштаб. Для этого в свойствах элемента масштаб на диаграмме Truck, снимем флажок «Унаследовано от родительского класса». Пусть длина линейки соответствует 5 километрам, и масштаб будет равен 1 км = 20 пикс.

  7. Теперь тип агента Truck полностью задан. Нам необходимо добавить еще одну популяцию для вертолетов. Возвращаемся к   Main и снова перетаскиваем элемент Агент  из палитры Агент и выбираем «Популяция агентов» на первом шаге.

  8. Вводим имя нового типа Helicopter, оставляем имя популяции helicopters. Находим фигуру 3D анимации Вертолет в секции «Военного назначения». Мы хотим использовать 2 вертолета для обслуживания турбин. Эта популяция живет в той же среде, что и все остальные.

  9. Helicopter также «Расширяет тип агента»: Transport. Мы предполагаем, что вертолеты движутся со скоростью, равной 200 км в час.

  10. Зададим для вертолета масштаб 1 км = 10 пикселей (так же, как и чуть ранее, запретив наследование масштаба от родительского класса).

Добавляем запросы на обслуживание

  1. Перетаскиваем элемент Агент   из палитры Агент на диаграмму типа агента  Main. 

  2. Выбираем опцию «Просто создать тип агента». Нам нужен тип агента, чтобы задать логику модели специальными параметрами, которые мы создадим на его диаграмме.

  3. Вводим имя типа ServiceRequest в соответствующем поле и щелкните «Далее». Выбираем «Нет» для типа анимации и переходим на следующий шаг.

  4. На шаге 4 мы создадим в мастере параметр, а также список вариантов. В нашем случае, нам необходимо различать грузовики и вертолеты в общем транспортном парке. Назовем параметр type и выберем его «Тип: Список вариантов». Так как в этой модели мы еще не создавали списков вариантов, по умолчанию мастер предлагает «Создать новый список вариантов:» вводим имя TransportType. Добавим варианты в таблицу, по одному в каждой строке: AUTO, AVIA (рисунок 6).

Рисунок 6 - Создание агентов "Шаг 6"

  1. Щелкаем «Готово». Список вариантов не имеет отдельного значка, который можно выбрать щелчком в графическом редакторе. Мы можем найти секцию «Список вариантов» в дереве модели (рисунок 7):

Рисунок 7 - Список вариантов

  1. После того, как мы щелкнем «Готово», AnyLogic откроет диаграмму типа агента ServiceRequest. Здесь мы можем увидеть параметр type, который мы создали в мастере. Добавим еще один «Параметр»  из палитры Агент. Назовем его turbine и выберем его Тип из выпадающего списка: Turbine. Теперь тип агента ServiceRequest полностью задан.

Запуск модели.

  1. Построим свой проект, щелкнув кнопку «Построить модель» на панели управления. Если в модели есть какие-либо ошибки, то построение будет неудачным, и мы увидим панель «Ошибки», в которой будут перечислены все ошибки в модели. Мы можем открыть место ошибки двойным щелчком по ее описанию в списке, чтобы исправить ее. После того, как модель будет успешно построена, можем запустить ее. Запуская эксперимент, мы автоматически обновляем модель. 

  2. Выбираем эксперимент, который хотим запустить, открыв выпадающий список рядом с кнопкой запуска модели «Запуск» на панели управления. Наш эксперимент называется  Maintenance/Simulation. Потом мы сможем запускать этот эксперимент, просто щелкая кнопку «Запуск»  , поскольку она будет запускать последний запущенный эксперимент.

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

  4. Щелкнем кнопку «Запустить» в нижней части панели управления окна модели, чтобы запустить модель. Мы только начали разрабатывать модель. В данный момент мы можем видеть сервисный центр, турбины и разные типы транспорта, случайно расположенные в непрерывном пространстве (рисунок 8).

Рисунок 8 - Запуск модели

  1. Задание транспортной базы.

Помещение транспорта в сервисный центр.

  1. Открываем диаграмму  Main в графическом редакторе.

  2. Перетаскиваем элемент «Функция»  из палитры Агент на диаграмму Main.

  3. Называем функцию setTransportBase. Эта функция ничего не возвращает, поэтому оставляем выбранной опцию «Действие (не возвращает ничего)». 

  4. Разворачиваем секцию свойств «Тело функции» и вводим код Java как указано на рисунке 9:

Рисунок 9 - Свойства "Тело функции"

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

  1. Настройка логических процессов транспорта

Добавление переменных.

  1. Переходим в панель «Проекты» и открываем двойным щелчком тип агента Transport. 

  2. Добавьте элемент «Переменная» из палитры Агент.

  3. Назовем переменную request и выберем в качестве ее типа ServiceRequest (рисунок 10):

Рисунок 10 - Свойства параметра

Диаграмма состояний транспорта.

  1. Мы используем элементы палитры Диаграммы состояний, чтобы задать поведение этого типа агента. Перетащим элемент «Начало диаграммы состояний»  в графический редактор типа агента Transport. Этот элемент задает начало всей диаграммы. Добавим «Состояние»  , перетащив этот элемент из палитры «Диаграмма состояний», и поместите его в конец стрелки начала диаграммы состояний. Чтобы добавить переход, сделаем двойным щелчок по элементу «Переход» в палитре. Его иконка поменяется на , это значит, что элемент теперь в режиме рисования. Можем рисовать переходы, делая щелчки по состояниям (рисунок 11).

Рисунок 11 – Переходы

  1. На этом шаге мы создадим "пустую" диаграмму состояний, которая состоит из четырех состояний и трех переходов разных типов.

  2. Состояния называются AtCenter (в сервисном центре), MovingToMC (движение к сервисному центру), Servicing (обслуживание турбины), MovingToTurbine (движение к турбине). Это, собственно, все действия и передвижения грузовиков и вертолетов в нашей модели (рисунок 12).

Рисунок 12 – Состояния

  1. Настройка поведения сервисного центра.

Задание запросов на транспорт для сервисного центра.

  1. Открываем диаграмму MC. Добавляем два элемента «Коллекция» из палитры Агент. 

  2. Назовем коллекции aviaRequests и autoRequests и обе имеют «Класс коллекции» LinkedList и «Тип элементов» ServiceRequest (рисунок 13).

Рисунок 13 - Свойства элемента "Коллекция"

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

Логика управления транспортным парком.

  1. Перетащим элемент «Функция» из палитры Агент на диаграмму MC.

  2. Назовем функцию findTransport.

  3. Эта функция будет выполнять поиск свободного транспорта. Обнаружив свободный транспорт, функция должна его вернуть, поэтому выбираем опцию «Возвращает значение» и задаем Тип значения Transport.

  4. Функция должна проанализировать тип входящих запросов на сервисные работы. Для этого нам необходимо добавить один аргумент функции - с его помощью мы сможем передать функции запрос на сервисные работы. Разворачиваем секцию «Аргументы» в свойствах функции и задаем в таблице аргумент request «Типа» ServiceRequest.

  5. Нам осталось задать алгоритм функции. Разворачиваем секцию «Тело функции» в панели «Свойства» и вводим код Java, как указано на рисунке 14:

Рисунок 14 - Ввод кода Java

  1. Настройка поведения турбин.

Задание временных интервалов работы турбин.

  1. Двойным щелчком откроем тип агента Turbine из дерева элементов модели. Начнем с добавления двух элементов Параметр из палитры Агент в графический редактор.

  2. Параметр с именем MTTF (среднее время до аварии) имеет тип «Время» и его «Значение по умолчанию» равняется 50 дням. Дни можем выбрать в свойстве «Единица измерения». Второй параметр, serviceTimeout, также имеет тип «Время»; его «Значение по умолчанию» равняется 2 неделям (рисунок 15).

Рисунок 15 - Свойства параметра

Добавление функций, управляющих запросами.

  1. Добавим «Функцию»  из палитры Агент  и назовите ее sendTransport. Эта функция является просто «Действием (не возвращает ничего)» и имеет два аргумента, которые необходимо добавить в секции Аргументы: Transport t и ServiceRequest request. Эта функция отправляет транспорт к турбине, когда это необходимо, передавая собщение диаграмме состояний, заданной на диаграмме типа агента Transport.

Рисунок 16 - Свойства функции

  1. Добавим еще одну «Функцию» . Назовем ее sendRequest и зададим ее свойства, как указано на рисунке 17. В секции свойств «Аргументы» добавим аргумент TransportType type. Тело функции ссылается на функцию findTransport, которую мы ранее создали на диаграмме MC. Когда турбина отправляет запрос на обслуживание, сервисный центр должен отправлять соответствующий тип транспорта: AUTO или AVIA.

Рисунок 17 - Свойства функции

Состояние турбины.

  1. Теперь мы готовы приступить к созданию диаграммы состояний турбины. Откроем палитры «Диаграмма состояний» и перетащим на диаграмму  Turbine элемент «Начало диаграммы состояний»  .

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

  3. Для каждого состояния турбины задается свое «Действие при входе». Когда происходит авария, турбина находится в состоянии Failure (авария) и отправляет запрос на обслуживание AVIA транспортом (вертолетом). Когда подходит время планового обслуживания, турбина отправляет запрос на AUTO транспорт - грузовик.

  4. Переход от состояния Operating (работает) к состоянию Failure происходит «С заданной интенсивностью»  , которая равняется 1/MTTF в день - один раз за среднее время до аварии. Переход обратно из состояния Failure в состояние Operating происходит «При получении заданного сообщения»  "repaired" .

  5. Переход от состояния Operating (работает) к состоянию Failure происходит «С заданной интенсивностью»  , которая равняется 1/MTTF в день - один раз за среднее время до аварии. Переход обратно из состояния Failure в состояние Operating происходит «При получении заданного сообщения»  "repaired".

  6. Добавим циклическое «Событие по таймауту» и назовем его scheduledRepair. Это событие будет запускаться, когда турбине требуется плановое обслуживание (согласно переменной serviceTimeout), и оно будет запускать переход от состояния Operating в состояние ScheduledService (рисунок 18).

Рисунок 18 - Свойство события

Настройка анимации лопастей турбин.

  1. Нам необходимо изменить свойства лопастей турбины. Фигура анимации Ветряная турбина является группой, состоящей из двух 3D фигур: башни турбины и лопастей. Нам нужно открыть свойства лопастей.

  2. Выделим лопасти щелчком мыши в графическом редакторе, или открыв панель «Проекты» и раскрываем уровни дерева модели, пока не найдем группу wind_blades (рисунок 19):

Рисунок 19 – Проекты

  1. Перейдем в свойства этой группы. Развернем секцию «Местоположение и размер» и введем inState(Operating)?time():0 в поле свойства «Поворот Y». Теперь лопасти будут вращаться, когда турбина находится в рабочем состоянии, а при поломке лопасти будут останавливаться.

Индикация состояния турбины.

  1. Откроем палитру «Презентация» и сделаем двойной щелчок по элементу «Овал» , чтобы перейти в режим рисования для этого элемента. 

  2. Нарисуем круг вокруг фигуры турбины радиусом 10. 

  3. Щелкнем по фигуре круга правой кнопкой мыши и выберем «Порядок> На задний план» в контекстном меню. 

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

  5. Чтобы иметь возможность задать динамическое значение в поле свойства, щелкнем его значок (рисунок 20).

Рисунок 20 - Свойства "Овал"

  1. Завершение настройки логики транспорта.

Настройка диаграммы состояний.

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

  2. Выделим состояние AtCenter. Нам необходимо задать его «Действие при входе» (рисунок 21):

Рисунок 21 - Свойства состояния

  1. Остальные три состояния (MovingToMC, Servicing, MovingToTurbine) не имеют дополнительных настроек. Мы настроим логику движения транспорта с помощью переходов различных типов. 

  2. Переход из состояния AtCenter  в состояние MovingToTurbine происходит «При получении сообщения»  типа ServiceRequest. Так как переход осуществляется «Безусловно», необходимо только указать «Действие», которое следует выполнить транспорту: двигаться к турбине.

  3. Переход из состояния MovingToTurbine в состояние Servicing запускается «По прибытию агента» . Грузовик или вертолет, который достиг турбины, начинает выполнять свою задачу сразу после прибытия на место. По завершению обслуживания, о чем нас "оповещает" турбина, транспортное средство может отправляться обратно на базу.

  4. Следующий переход идет из состояния Servicing в состояние MovingToMC. Действие, задающее возвращение в сервисный центр, происходит «По таймауту» .

Теперь, если мы откроем тип агента Truck или Helicopter, то увидим там проекцию элементов типа агента  Transport, который они расширяют. Эти элементы отображаются на их диаграммах для удобства, но, чтобы изменять их свойства, вернемся обратно на диаграмму самого агента (рисунок 22):

Рисунок 22 - Диаграмма модели

  1. Запуск модели и исследование ее элементов.

Добавление элемента презентации.

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

  2. Перейдем в секцию свойств фигуры «Внешний вид» и выберите текстуру Grass в качестве «Цвета заливки» и опцию Нет цвета для «Цвета линии». Обратим внимание на свойства Z и Z-Высота в секции «Местоположение и размер». Например, если Z-Высота равняется 10, вы можете установить Z на -10, иначе другие фигуры анимации "утонут" в этом фоне, ведь они по умолчанию перемещаются на нулевом уровне.

  3. Так как прямоугольник - это последняя добавленная нами фигура, он отображается поверх всех остальных. Щелкните прямоугольник правой кнопкой мыши и выберите «Порядок> На задний план».

Запуск модели (рисунок 23).

Рисунок 23 - Запуск модели

Вывод: в ходе выполнения лабораторной работы мы построили модель обслуживания турбин.

Соседние файлы в предмете Имитационное моделирование экономических процессов