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

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

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

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

  1. Откройте диаграмму MC. Добавьте два элемента Коллекция из палитры Агент
  2. Назовите коллекции aviaRequests и autoRequests и обе имеют Класс коллекции LinkedList и Тип элементов ServiceRequest.

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

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

  1. Перетащите элемент Функция из палитры Агент на диаграмму MC.
  2. Назовите функцию findTransport.
  3. Эта функция будет выполнять поиск свободного транспорта. Обнаружив свободный транспорт, функция должна его вернуть, поэтому выберите опцию Возвращает значение и задайте Тип значения Transport.
  4. Функция должна проанализировать тип входящих запросов на сервисные работы. Для этого нам необходимо добавить один аргумент функции - с его помощью мы сможем передать функции запрос на сервисные работы. Разверните секцию Аргументы в свойствах функции и задайте в таблице аргумент request Типа ServiceRequest.
  5. Нам осталось задать алгоритм функции. Разверните секцию Тело функции в панели Свойства и введите код Java, как указано на изображении:

В теле функции мы задаем цикл for. Этот цикл не всегда выполняет итерирование агентов одной популяции. Здесь он анализирует тип запроса на сервисные работы и проверяет, выполняется ли условие request.type == AUTO. Если условие выполняется, значит, поступил запрос на автомобильный транспорт, и далее цикл производит итерирование популяции trucks. Если же проверка условия возвращает значение false, это значит, что поступил запрос на вертолет. В таком случае цикл выполняет итерацию другой популяции: main.helicopters.

Внутри цикла мы проверяем, свободен ли в данный момент итерируемый агент. Для этого мы используем функцию агента inState(). Если управление диаграммой состояний агента на данный момент находится в состоянии AtCenter, это значит, что мы нашли свободный транспорт. В таком случае выполнение функции завершается на строке return t; и функция возвращает найденное значение (свободный транспорт). Если свободного транспорта нет, эта строка не будет выполняться и после цикла for выполнится следующая строка кода: return null; Таким образом мы сообщаем модели, что грузовик не найден (функция вернула значение null - свободный транспорт не существует).

В AnyLogic иногда нужно будет вводить код в параметрах различных элементов модели. Важно понимать, где именно вы "находитесь", вписывая код (какому типу агента принадлежит этот элемент), и как получить доступ к другим элементам из этого поля.

Элементы модели, принадлежащие тому же типу агента, доступны просто по именам. 

Чтобы получить доступ к полю вложенного объекта, вы должны поставить точку "." после имени объекта и затем написать имя этого поля. Например, мы ссылались на функцию getX() сервисного центра center при создании диаграммы действий на   Main: center.getX(). Если объект является реплицированным, то его имя является именем коллекции объектов, и вам нужно указать, какой именно объект из этой коллекции вам нужен. 

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

Чтобы получить доступ к контейнеру текущего объекта (того агента, куда вложен текущий), укажите его имя. Обратите внимание на специальный элемент,  Ссылка на агента верхнего уровня, который присутствует на диаграмме каждого типа, чьи агенты живут в среде этого агента верхнего уровня (в нашей модели это тип агента Main). Ссылка называется по имени этого агента верхнего уровня и позволяет обращаться к нему по этому имени, чтобы получить доступ к элементам, находящимся на его диаграмме. Например, чтобы получить доступ к элементу trucks[..], который находится на диаграмме Main, из агента MC, мы пишем main.trucks, находясь на диаграмме MC

Контрольная модель: Maintenance - Phase 4

Далее давайте настроим тип агента  Turbine.


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

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