- Нарисуйте ломаную, как показано на рисунке ниже. Чтобы нарисовать ломаную, сделайте двойной щелчок мышью по элементу Ломаная
в палитре (при этом его значок должен поменяться на этот:
). Теперь Вы можете рисовать ломаную точка за точкой, последовательно щелкая мышью в тех точках диаграммы, куда Вы хотите поместить вершины ломаной. Чтобы завершить рисование, добавьте последнюю точку ломаной двойным щелчком мыши.
Очень важно, какую точку ломаной Вы создаете первой. Заявки будут располагаться вдоль нарисованной Вами ломаной в направлении от конечной к начальной. Поэтому начните рисование ломаной слева и поместите рядом с банкоматом конечную точку ломаной, которая будет соответствовать в этом случае началу очереди.
Теперь мы должны задать созданные
анимационные объекты в качестве
анимационных фигур блоков диаграммы
нашего процесса.
Задайте ломаную в качестве
фигуры анимации очереди
- На странице свойств объекта Queue, введите polyline в поле Фигура анимации.
Задайте круг в качестве
фигуры анимации банкомата
- Введите в поле Фигура анимации имя нашего овала: oval.
- Выберите из выпадающего списка Тип анимации Одиночная. Большинство объектов Основной библиотеки поддерживает несколько анимационных стилей. Например, очередь может отображаться в виде линии, упорядоченного или неупорядоченного набора элементов. В нашем случае, если банкомат будет занят, то мы будем показывать в фигуре банкомата обслуживающегося в нем клиента, а поскольку единовременно наш банкомат не обслуживает больше одного клиента, то мы и выбираем тип анимации Одиночная.
Теперь Вы можете запустить модель
и изучить ее поведение. Для ускорения
работы модели, переключитесь в режим
виртуального времени, щелкнув мышью
по кнопке панели инструментов Реальное/виртуальное время.
В режиме виртуального времени модель
будет выполняться максимально быстро,
без привязки модельного времени к реальному.
Запустите модель. Вы увидите, что
у нашей модели теперь есть простейшая
анимация - банкомат и ведущую к
нему очередь клиентов. Цвет фигуры
банкомата будет меняться в зависимости
от того, обслуживается ли клиент в данный
момент времени.
Анимация клиентов
По умолчанию заявки (то есть, наши
посетители банковского отделения)
будут отображаться на анимации маленькими
прямоугольниками различных цветов.
Чтобы анимация выглядела более наглядно,
давайте зададим в качестве фигуры анимации
клиента фигурку человека.
Вы можете нарисовать фигурку сами,
но мы рекомендуем просто использовать
типовую картинку из набора стандартных
изображений, поставляемого вместе с AnyLogic,
начиная с версии 6.4.
Создайте анимацию клиента
- Откройте палитру Картинки. Эта палитра содержит набор картинок, которые наиболее часто используются пользователями AnyLogic при создании моделей.
- Перетащите элемент Человек из палитры на диаграмму графического редактора:
- По умолчанию эта картинка будет называться person. Оставьте ее название без изменений, поскольку в дальнейшем мы будем ссылаться на нее в блоке диаграммы нашего процесса именно по этому имени.
Поместите
картинку за границу видимой области
презентации
- Передвиньте холст диаграммы немного вниз, нажав правую кнопку мыши в графическом редакторе и перетащив мышь, не отпуская кнопки, вниз.
- Перетащите фигурку человечка выше верхней границы экрана презентации, как показано на рисунке ниже. Мы делаем это для того, чтобы картинка оказалась за областью видимости диаграммы.
- Передвиньте холст диаграммы обратно.
Теперь нам нужно сообщить
объекту source, чтобы он
использовал добавленную нами фигурку
в качестве фигуры анимации заявки (то
есть, клиента банка).
Измените свойства объекта
source
- Выделите объект source в графическом редакторе.
- В полк Фигура анимации заявки введите имя нашей фигурки человека: person (при этом Вы можете воспользоваться помощником написания кода).
Теперь Вы можете запустить
модель и наблюдать за моделируемым
процессом с помощью анимации.
Обслуживающиеся и ожидающие
обслуживания в очереди клиенты
будут отображаться на анимации нарисованными
нами картинками человечков.
Эта простейшая модель продемонстрировала
основные принципы работы с Основной
библиотекой. Теперь мы готовы к тому,
чтобы усовершенствовать нашу модель.
Шаг 3. Сбор статистики использования
ресурсов
AnyLogic предоставляет пользователю
удобные средства для сбора
статистики по работе блоков
диаграммы процесса. Объекты Основной
библиотеки самостоятельно производят
сбор основной статистики. Все,
что Вам нужно сделать - это
включить сбор статистики для объекта.
Поскольку мы уже сделали это
для объектов delay и queue, то теперь мы можем,
например, просмотреть интересующую нас
статистику (скажем, статистику занятости
банкомата и длины очереди) с помощью диаграмм.
Добавьте диаграмму для
отображения средней занятости
банкомата
- Откройте палитру Статистика. Эта палитра содержит элементы сбора данных и статистики, а также диаграммы для визуализации данных и результатов моделирования.
- Перетащите элемент Столбиковая диаграмма из палитры Статистика на диаграмму класса и измените ее размер, как показано на рисунке ниже:
- Перейдите на страницу Основные панели Свойства. Щелкните мышью по кнопке Добавить элемент данных. При этом появится секция свойств того элемента данных, который будет отображаться на этой диаграмме.
- Измените Заголовок на ATM utilization.
- Введите delay.statsUtilization.mean() в поле Значение. Здесь delay - это имя нашего объекта Delay. У каждого объекта Delay есть встроенный набор данных statsUtilization, занимающийся сбором статистики использования этого объекта. Функция mean() возвращает среднее из всех измеренных этим набором данных значений. Вы можете использовать и другие методы сбора статистики, такие, как min() или max(). Полный список методов можно найти на странице документации этого класса набора данных: StatisticsContinuous (на английском языке).
- Перейдите на страницу Внешний вид панели Свойства. Выберите первую опцию из набора кнопок Расположение, чтобы изменить расположение легенды относительно диаграммы (мы хотим, чтобы она отображалась справа).
- Измените, размер диаграммы в графическом редакторе так, чтобы она приняла следующий вид:
Добавьте диаграмму для
отображения средней длины очереди
- Аналогичным образом добавьте еще одну столбиковую диаграмму. Измените ее размер так, как показано на рисунке:
- Перейдите на страницу Внешний вид панели Свойства и выберите первую опцию в секции свойств Направление, чтобы столбцы столбиковой диаграммы росли влево.
- Добавьте элемент данных, который будет отображаться на диаграмме. Задайте Заголовок: Queue length и задайте Значение: queue.statsSize.mean(). Здесь statsSize - это имя объекта типа "статистика" StatisticsContinuous, производящего сбор статистики размера очереди объекта Queue.
Запустите модель и пронаблюдайте
за занятостью банкомата и средней
длиной очереди с помощью только
что созданных диаграмм.
Шаг 4. Добавление клерков
Теперь мы усложним нашу модель, добавив
в нее служащих – банковских кассиров.
Мы могли бы промоделировать кассиров,
как и банкомат, с помощью объектов Delay. Но куда более удобным представляется
моделирование кассиров с помощью ресурсов. Ресурс – это специальный объект
Основной библиотеки, который может потребоваться
заявке для выполнения какой-то задачи.
В каждый момент времени ресурс может
быть занят только одной заявкой. В нашем
примере посетителям банковского отделения
(заявкам) необходимо получить помощь
у банковских служащих (ресурсов).
Измените диаграмму процесса
- Добавьте объект Service. Этот объект захватывает для заявки заданное количество ресурсов, задерживает заявку, а затем освобождает захваченные ею ресурсы. В нашей модели этот объект будет моделировать обслуживание клиента кассиром (или каким-то другим служащим банковского отделения).
- Чтобы добавить объект Основной библиотеки на диаграмму класса активного объекта, вначале откройте одноименную палитру этой библиотеки (Основная библиотека), а затем перетащите нужный Вам объект из палитры в то место диаграммы, куда Вы хотите его поместить.
- Измените свойства объекта:
- Ко всем кассирам будет вести одна общая очередь. Задайте максимальное количество человек в этой очереди в поле Вместимость очереди: 20.
- Мы полагаем, что время обслуживания имеет треугольное распределение с минимальным значением равным 2.5, средним - 6, и максимальным - 11 минутам. Введите в поле Время задержки: triangular( 2.5, 6, 11 )
- Добавьте объект ResourcePool. Объект ResourcePool задает ресурсы определенного типа (в нашей модели это будут банковские клерки).
- Назовите объект tellers. Задайте число кассиров в поле Количество ресурсов: 4
- Удалите соединитель между объектами Source и Queue и добавьте на его место объект SelectOutput. Объект SelectOutput является блоком принятия решения. В зависимости от заданного Вами условия, заявка, поступившая в объект, будет поступать на один из двух выходных портов объекта.
Оставьте все свойства объекта без изменений. Пусть Выход true выбирается с заданной вероятностью, а Вероятность [0..1] равна 0.5. В этом случае к кассирам и банкомату будет приходить примерно равное количество клиентов.
Соедините блоки диаграммы
процесса
- Соедините блоки диаграммы процесса, как показано на рисунке:
-
Чтобы соединить порты блоков друг с другом, сделайте двойной щелчок мышью по одному порту, затем последовательно щелкните в тех местах диаграммы, где Вы хотите поместить точки изгиба соединителя, и наконец завершите процесс соединения, сделав двойной щелчок мышью по второму порту.
Вы увидите, что появится соединитель. Если выделить его мышью, то в том случае, если Вы правильно соедините порты, конечные точки соединителя должны будут подсветиться зелеными точками. Если Вы не увидите этого, то значит, точки не были помещены точно внутрь портов, и их нужно будет туда передвинуть.
- Вы можете заметить, что большинство установленных нами соединений - это соединения порта, расположенного на правой стороне объекта с портом, расположенного на левой стороне следующего за ним объекта. Это связано с тем, что в диаграмме процесса выходные порты объектов соединяются с входными, а обычно входные порты располагаются на левой границе библиотечного объекта, а выходные - на правой. Исключение в нашем случае пока будет только одно - мы соединяем нижний порт объекта Service с верхним портом объекта tellers - именно так должны подсоединяться объекты, задающие ресурсы, к объектам, моделирующим занятие и освобождение этих ресурсов.
Поскольку наша модель изменилась,
мы должны изменить и ее анимацию.
Измените анимацию
модели
- Нарисуйте ломаную, которая будет отображать очередь клиентов, ожидающих обслуживания кассирами. Рисуйте ее, как и раньше, слева направо. Назовите ломаную queueBeforeTellers.