close

Вход

Забыли?

вход по аккаунту

?

Latipova

код для вставкиСкачать
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное образовательное учреждение
высшего профессионального образования
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ
Р. Р. Латыпова
КОМПЬЮТЕРНЫЙ ПРАКТИКУМ
ПО ANYLOGIC
Учебное пособие
Санкт-Петербург
2013
УДК 004(075)
ББК 32.973я73
Л27
Рецензенты:
доктор экономических наук, профессор
кафедры экономической кибернетики экономического факультета
Санкт-Петербургского государственного университета
П. В. Конюховский;
доктор технических наук, доцент, заведующий кафедрой
информационных технологий и математики, член корреспондент РАВН
Санкт-Петербургского университета управления и экономики
К. А. Костин
Утверждено
редакционно-издательским советом университета
в качестве учебного пособия
Латыпова, Р. Р.
Л27 Компьютерный практикум по AnyLogic: учеб. пособие/ Р. Р. Латыпова. – СПб.: ГУАП, 2013. – 182 с.: ил.
ISBN 978-5-8088-0859-1
В учебном пособии рассматриваются теоретические и прикладные вопросы имитационного моделирования в среде AnyLogic – инструмент имитационного моделирования, разработанный российской компанией «Экс Джей Текнолоджис» (англ. XJ Technologies),
объединивший методы системной динамики, дискретно-событийного и агентного моделирования в одном языке и в одной среде разработки модели. Сайт компании разработчика программного продукта http://www.anylogic.ru. Приводится подробное описание шести
лабораторных работ с пошаговой инструкцией.
Учебное пособие предназначено для подготовки бакалавров и
магистров по направлению 220400 «Управление в технических системах» для дисциплины «Автоматизированные информационноуправляющие системы», а также для широкого круга других специальностей, в которых являются актуальными задачи имитационного моделирования.
УДК 004(075)
ББК 32.973я73
ISBN 978-5-8088-0859-1
© Санкт-Петербургский государственный
университет аэрокосмического
приборостроения (ГУАП), 2013
© Р. Р. Латыпова, 2013
ВВЕДЕНИЕ
Данное учебное пособие реализовано в рамках дисциплины «Автоматизированные информационно-управляющие системы», которое состоит из 6 лабораторных работ, ориентированных на 36 часов. Реализация лабораторных работ происходит в среде имитационного моделирования AnyLogic. Учебное пособие представляет
интерес для преподавателей и студентов по специальности 220400.
Приведем сравнительный анализ существующих систем имитационного моделирования, самыми популярными являются AnyLogic
6, Arena, Simulink.
Как следует из таблицы, каждое из рассматриваемых программных средств обладает достаточной функциональностью. Перечисленные возможности указывают на высокую эффективность AnyLogic,
Arena, Simulink как средств построения и исследования сложных
систем с использованием имитационного моделирования.
Таблица
Обзор характеристик систем имитационного моделирования
Характеристика
Производитель
Области применения
Поддержка/
обучение:
• Руководство пользователя, учебные пособия
• Обучающие курсы
• Тренинг на сайте
AnyLogic 6
Система
Arena
ООО «Экс
Rockwell
Джей ТекноAutomation
лоджис» (XJ
Inc (Systems
Technologies)
Modeling)
Прогноз и
Бизнес-простратегическое цессы. Пропланирование.
изводство.
Производство. Логистика.
Бизнес-процес- Склад. Центры
сы. Управле- обработки выние проектами.
зовов
Управление
персоналом.
Социальная
динамика
+
+
+
+
+
+
Simulink
MathWorks Inc
Обработка
сигналов и
изображений. Системы
управления,
финансовые
расчеты. Производство.
Медицинские
исследования
+
+
+
3
Окончание таблицы
Характеристика
AnyLogic 6
• Доступность консультации
+
• Форум пользователей
+
Построение модели:
• Графическое построение модели
+
• Программирование
доступа к запрограммированным модулям
+
• Язык программирования
java
• Открытая архитектура
+
Иерархическая структура производственного
процесса
+
Анимация:
• Анимация модели и
+
визуализация данных
+
• 3D анимация
+
• Просмотр в режиме
+
реального времени
+
Анализ данных:
• Анализ чувствительности
+
• Оптимизация
+
• Метод Монте-Карло
+
• Сценарный анализ
+
Системные требования
Microsoft
Операционная система
Windows XP/
Аппаратные требования
Vista, Apple
Mac OS, SuSE
Open Linux,
Ubuntu Linux.
250 MB свободного дискового
пространства 1
GB RAM.
Цена (за одну лицензию): 355900 руб.
Профессиональная
21500 руб.
(Professional) версия
(установка в
Образовательная
пределах одно(Students) версия
го факультета)
4
Система
Arena
Simulink
+
+
+
+
+
+
+
+
SIMAN
+
MATLAB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Microsoft
Microsoft
Windows 2000/
Windows
Server 2003/
XP/Vista,
XP/ Vista. 128
Macintosh,
MB свободно- Unix/Linux,
го дискового 300 MB свободпростран- ства ного дискового
1GB RAM.
пространства
1GB RAM.
759303 руб.
–
от $1507
от $99
Где
применяется ИМ?
Где применяется ИМ?
Области применения имитационных моделей (ИМ):
– Управление проектами;
– Энергетические сети;
Агрегаты, глобальные причинные зависимости, динамика обратных связей, …
Агрегаты глобальные причинные зависимости динамика обратных связей
Высокий уровень Высокий уровень
– Больница;
абстракции
 Рынок и конкуренция
 Социальные системы
[меньше деталей
– Склад;
макро уровень
– Производство;

Управление
Управление проектами
проектами
 Экосистемы
стратегический – Цепи
поставок; Динамика персонала
уровень]
 Экономика здравоохранения
– Компьютерные системы;
Средний уровень  Энергетические сети
 Управление активами
– Транспорт;
абстракции
– Военные
действия
и
т. д.

Цепочки поставок
[средняя детальность
мезо‐уровень
мезо
уровень
Методы
в ИМ представлены на
рис. 1.
 Перевозки
 Бизнес‐процессы
тактический уровень]
 Больница
Разновидности ИМ представлены на рис. 2.
 Системы обслуживания
 Производство
Пользовательский
интерфейс представлен
на рис. 3.
 Склад
 Транспорт:
Т
Низкий уровень инструментов:
Военные действия
Меню
и
панели
микро‐модели
абстракции
 Движение
пешеходов
1. Быстрый
командам.
[больше деталей доступ к основным
микро уровень
микро уровень
 Системы управления
2. Набор
видимых панелей
инструментов
изменяется
в зависиКомпьютерные системы
оперативный мости от уровень]
текущегоОтдельные объекты, точные размеры, расстояния, скорости, времена, …
рабочего вида.
3. Стандартная (Создать, Открыть модель, Сохранить модель,
Сохранить все модели).
9
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
4. Редактирование (Отменить, Повторить, Вырезать, Скопировать, Вставить, Удалить).
5. Построение (Построить модель. Построить все Отладка Запуск).
Методы в имитационном моделировании
д
ц
д р
Высокий уровень Высокий уровень
абстракции
[меньше деталей
макро уровень
стратегический уровень]
Средний уровень абстракции
[средняя детальность
мезо‐уровень
мезо
уровень
тактический уровень]
Низкий уровень абстракции
[больше деталей
микро уровень
микро уровень
оперативный уровень]
Агрегаты, глобальные причинные зависимости, динамика обратных связей, …
Агрегаты глобальные причинные зависимости динамика обратных связей
Системная
Динамика
System
Dynamics
Дискретно
Дискретнособытийное
(процессное)
моделирование
Discrete Event
Modeling
Агентное
моделирование
Agent Based
Modeling
Отдельные объекты, точные размеры, расстояния, скорости, времена, …
Рис. 1
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
10
5
Инструменты
ИМ – что
есть вообще
Инструменты ИМ
что есть вообще
• Традиционные инструменты поддерживают Традиционные инструменты поддерживают
какой‐то один определённый метод AnyLogic.
Агентное Динамические Среда
Среда разработки разработки
Моделирование
системы
моделей
Дискретно‐
событийное моделирование
Системная Динамика
Эта презентация является
частью стандартной
VenSim
Arena
программы
обучения
PowerSim
ExtendSim
[Универси‐
тетские
разработки:]]
разрабо
Swarm
RePast
g
NetLogo
ASCAPE
S
SimProcess
ocess
AutoMod
PROMODEL
p
Enterprise
Dynamics
FlexSim
…
iThink
MATLAB
VisSim
ab e
LabView
Easy5
…
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
Рис. 2
15
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
Пользовательский
Пользовательский интерфейс
AnyLogic
инструмент ИМ
y g – многоподходный
д интерфейс
д
ру
Меню и панели инструментов. «Быстрые» клавиши к
основным командам
Динамические системы
Панель Проекты.
Навигация
по моделям
Двойной Д
й й
щелчок
Системная Динамика
Агентное д
р
Моделирование
Графический
редактор
Дискретно‐
событийное моделирование
• Легко менять и Легко менять и
выбирать подходящий уровень абстракции
Панель
Палитра.
• Можно Можно
Э
Элементы
переключаться разбиты по
Щелчок
между группам,
подходамиотображаемым
на разных
• Можно вкладках
смешивать сме
ивать
разные подходы в одной Свойства
выбранного
модели
элемента
• Всё это на гибкой ф р
ОО платформе
Панель Ошибки. Отображает ошибки и помогает их локализовать
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
Рис. 3
6
16
24
25
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
Дерево элементов модели. Панель Проекты
Д р
д
р
Модели с несохраненными изменениями помечаются звездочками
Двойной щелчок
откроет редактор и/или свойства элемента
Все элементы модели структурированы иерархически
Копируйте элементы дерева с помощью команд
К
Копировать/Вырезать
/В
и
Вставить
Щелчок правой кнопкой мыши
откроет контекстное меню
26
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
Рис. 4
Добавление объектов палитры на диаграмму
Д
р
д р
у
1.
Общий способ
1A:
Перетащите
элемент из палитры
палитры…
2.
Прямоугольные элементы
(Состояние, Прямоугольник, Овал,
Скругленный прямоугольник)
3.
Многоточечные элементы
(Ломаная, Кривая, Переход, Соединитель)
2A: Сделайте двойной Сделайте двойной
щелчок по элементу
3A: Сделайте Сделайте
двойной щелчок по элементу
2B: Тащите, чтобы создать новый прямоугольный объект
3B: Добавьте щелчками мыши точки ломаной
1B … в то место 1B:
диаграммы, куда Вы хотите добавить объект
2C: Отпустите кнопку, чтобы завершить операцию
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
Рис. 5
Графический
редактор
Графический редактор
3C: Двойным щелчком
завершите рисование
27
7
27
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
Графический
редактор
Графический редактор
Переключение между окнами редактора
Масштаб
Максим‐ть/восст‐ть
окна графического редактора
Shift+щелчок по объекту, чтобы добавить его к выделенным объектам
Ctrl+тащите, чтобы скопировать выбранные объекты в это же окно
Тащите мышь с нажатой Тащите
мышь с нажатой
правой кнопкой, чтобы
передвинуть диаграмму в окне редактора
Та
Тащите
е
прямоугольник, чтобы выбрать несколько объектов
28
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
Рис. 6
Свойства
элемента. Панель Свойства
Свойства элемента. Панель Свойства
Щелкните,
чтобы открыть свойства элемента
Откройте панель
Свойства
Щелчком мыши
переключайтесь между страницами свойств
Тащите границу, чтобы изменить размер окна
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
Рис. 7
8
Запуск
модели
Запуск модели
29
29
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
Окно
презентации
Окно презентации
Запуск
модели
Запуск модели
Анимированная диаграмма процесса
1. Щелкните по кнопке
Запустить
Элемент управления
2. Выберите эксперимент
2D Анимация
График
График статистики
3. Вы увидите окно презентации, отображающее презентацию, созданную для запущенного Окно эксперимента
«инспекта» элемента
4. Щелкните по кнопке, чтобы запустить модель и перейти на презентацию класса Main
Тащите мышь с нажатой правой кнопкой, чтобы
переместить диаграмму в окне
3D Анимация
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
Рис. 8
31
30
Основные команды панели инструментов
д
ру
•
р
ру
у
р
Вы можете настраивать
панели инструментов
и статусной
строки
•
Видна только
одна команда,
в зависимости
от текущего
состояния
•
Управление выполнением модели
Запустить/продолжить
З
/
выполнение:
Приостановить выполнение:
Выполнить шаг:
Завершить выполнение модели:
Скорость выполнения
У
Установить
первоначальную скорость выполнения:
Замедлить выполнение вдвое:
Только в
Выбрать
р
скорость
р
выполнения:
режиме
реального
Ускорить выполнение вдвое:
времени
Переключение режимов реального/вирт. времени:
Рис. 9
© 2002-2011 ООО «Экс Джей Текнолоджис», www.xjtek.ru
32
9
1. РАЗРАБОТКА МОДЕЛИ БАНКОВСКОГО ОТДЕЛЕНИЯ
В этом разделе учебного пособия мы создадим модель простой
системы обслуживания, а именно модель банковского отделения.
В банковском отделении находятся банкомат и стойки банковских
кассиров, что позволяет быстро и эффективно обслуживать посетителей банка. Операции с наличностью клиенты банка производят с
помощью банкомата, а более сложные операции, такие как оплата
счетов – с помощью кассиров. Шаг 1. Создание простой модели.
На первом этапе мы хотим создать простейшую модель, в которой будем рассматривать только обслуживание людей банкоматом.
Начиная с версии 6.4, AnyLogic предоставляет пользователям
возможность использования шаблонов моделей при создании новых моделей. Если раньше Вам приходилось всегда начинать создание модели «с чистого листа», зачастую выполняя одни и те же
типовые действия для каждой новой создаваемой модели, то теперь
Вы можете перепоручить выполнение первых, базовых, шагов Мастеру создания модели. Все, что Вам нужно – это указать, какой метод моделирования Вы будете использовать и выбрать те опции, которые Вам нужны в модели – и Мастер автоматически создаст простейшую модель, а Вы сможете продолжать ее разработку, лишь
изменив незначительные детали.
Создайте новую модель:
1. Щелкните мышью по кнопке панели инструментов Создать
. Появится диалоговое окно Новая модель.
2. Задайте имя новой модели. В поле Имя модели введите Bank
Office (рис. 1.1).
3. Выберите каталог, в котором будут сохранены файлы модели.
Если Вы хотите сменить предложенный по умолчанию каталог на
какой-то другой, Вы можете ввести путь к нему в поле Местоположение или выбрать этот каталог с помощью диалога навигации по
файловой системе, открывающегося по нажатию на кнопку Выбрать.
4. Щелкните мышью по кнопке Далее. Откроется вторая страница Мастера создания модели.
5. Здесь Вам будет предложено выбрать шаблон модели, на базе
которого Вы будете разрабатывать Вашу модель. Поскольку мы хотим создать новую дискретно-событийную модель, установите флажок Использовать шаблон модели и выберите Дискретно-событийное моделирование в расположенном списке (рис. 1.2).
10
Рис. 1.1
Рис. 1.2
11
6. Щелкните мышью по кнопке Далее. На следующей странице Мастера Вам будет предложено выбрать, хотите ли Вы сразу же
добавить в создаваемую модель ресурсы, график, отображающий
длину очереди к сервису, анимацию обслуживающихся и ожидающих обслуживания или гистограмму, отображающую распределение времени пребывания людей в моделируемой системе. Поскольку мы хотим лишь создать с помощью Мастера простейшую
диаграмму процесса, а остальные шаги выполнять совместно по
шагам учебного пособия, чтобы Вы знали, как добавлять ресурсы,
создавать анимацию модели и собирать статистику и могли в дальнейшем делать это самостоятельно, то оставьте флажок Использовать ресурсы сброшенным и закончите создание модели, щелкнув
мышью по кнопке Готово.
Пользовательский интерфейс AnyLogic.
В левой части рабочей области будет находиться панель Проекты. Панель Проекты обеспечивает легкую навигацию по элементам
моделей, открытых в текущий момент времени. Поскольку модель
организована иерархически, то она отображается в виде дерева:
сама модель образует верхний уровень дерева; эксперименты, классы активных объектов и Java классы образуют следующий уровень; элементы, входящие в состав активных объектов, вложены в
соответствующую подветвь дерева класса активного объекта и т. д.
В правой рабочей области будет отображаться панель Палитра,
а внизу – панель Свойства. Панель Палитра содержит разделенные
по категориям элементы, которые могут быть добавлены на диаграмму класса активного объекта или эксперимента. Панель Свойства используется для просмотра и изменения свойств выбранного
в данный момент элемента (или элементов) модели.
В центре рабочей области AnyLogic Вы увидите графический редактор диаграммы класса активного объекта Main (рис. 1.3).
При работе с моделью, не забывайте сохранять производимые
Вами изменения с помощью кнопки панели инструментов Сохранить .
В основе каждой процессно-ориентированной (дискретно-событийной) модели лежит диаграмма процесса – последовательность соединенных между собой блоков (в AnyLogic – это блоки Основной библиотеки), задающих последовательность операций, которые будут
производиться над проходящими по диаграмме процесса заявками.
Если Вы обратите внимание на диаграмму класса Main, то Вы
увидите, что диаграмма нашего простейшего процесса была автоматически создана Мастером создания модели, поскольку такая
12
Рис. 1.3
модель является ничем иным, как простейшей системой массового
обслуживания, наиболее часто используемой в качестве отправной
точки создания процессно-ориентированных моделей и выбранной, поэтому в качестве базового шаблона при разработке процессно-ориентированных моделей. Диаграмма процесса в AnyLogic создается путем добавления
объектов библиотеки из палитры на диаграмму класса активного
объекта, соединения их портов и изменения значений свойств блоков в соответствии с требованиями Вашей модели. Рис. 1.4
13
Все, что нам нужно, чтобы сделать созданный шаблон модели
адекватным текущей постановке задачи, – это изменить некоторые
свойства объектов.
Изменение свойств блоков диаграммы процесса.
Свойства объекта (как и любого другого элемента AnyLogic)
можно изменить в панели Свойства.
Обратите внимание, что панель Свойства является контекстнозависимой – она отображает свойства выделенного в текущий момент элемента. Поэтому для изменения свойств элемента нужно
будет предварительно щелчком мыши выделить его в графическом
редакторе или в панели Проект.
Чтобы у Вас всегда была уверенность в том, что в текущий момент в рабочем пространстве выбран именно нужный Вам элемент,
и именно его свойства Вы редактируете в панели Свойства, обращайте внимание на первую строку, показываемую в панели Свойства – в ней отображается имя выбранного в текущий момент времени элемента и его тип. Согласно принятым стандартам, блоки в диаграмме процесса
обычно располагаются цепочкой слева направо, представляя собой
последовательную очередность операций, которые будут производиться над заявкой (рис. 1.4). Первым объектом в диаграмме процесса является объект типа
Source. Объект Source генерирует заявки определенного типа. Заявки представляют собой объекты, которые производятся, обрабатываются, обслуживаются, или еще каким-нибудь образом подвергаются действию моделируемого процесса: это могут быть клиенты в
системе обслуживания, детали в модели производства, документы в
модели документооборота и т. д. В нашем примере заявками будут
посетители банка, а объект Source будет моделировать их приход в
банковское отделение. За детальным описанием объектов Основной
библиотеки, пожалуйста, обращайтесь к Справочному руководству
по Основной библиотеке (отдельная книга Справки AnyLogic).
В нашем случае объект создает заявки через заданный временной интервал. Давайте немного изменим интенсивность прихода
клиентов в наше банковское отделение.
Измените свойства объекта Source:
1. Введите в поле Интенсивность прибытия 0.67 (рис. 1.5).
Следующий объект – Queue. Он моделирует очередь заявок,
ожидающих приема объектами, следующими за данным в диаграмме процесса. В нашем случае он будет моделировать очередь
клиентов, ждущих освобождения банкомата. 14
Рис. 1.5
Измените свойства объекта Queue:
1. Задайте максимальную длину очереди. Введите в поле Вместимость 15. В очереди будут находиться не более 15 человек (рис. 1.6).
Рис. 1.6
15
2. Установите флажок Включить сбор статистики, чтобы включить сбор статистики для этого объекта. В этом случае по ходу моделирования будет собираться статистика по количеству человек в
очереди. Если же Вы не установите этот флажок, то данная функциональность будет недоступна, поскольку по умолчанию она отключена для повышения скорости выполнения модели.
Следующим в нашей диаграмме процесса следует объект Delay.
Он задерживает заявки на заданный период времени, представляя
в нашей модели банкомат, у которого посетитель банковского отделения тратит свое время на проведение необходимой ему операции.
Измените свойства объекта Delay:
1. Обслуживание одного клиента занимает примерно 1 минуту.
Задайте время обслуживания, распределенное по треугольному закону со средним значением, равным 1, минимальным – равным 0.8, и
максимальным – равным 1.3 минутам, введите в поле Время задержки triangular (0.8, 1, 1.3). Функция triangular() является стандартной функцией генератора случайных чисел AnyLogic. AnyLogic предоставляет функции и других случайных распределений, таких как
нормальное, равномерное, треугольное, и т. д. Детальное описание
всех функций вероятностных распределений дано здесь (рис. 1.7).
2. Установите флажок Включить сбор статистики.
Рис. 1.7
16
Последним в диаграмме нашего процесса следует объект Sink.
Этот объект уничтожает поступившие заявки. Обычно он используется в качестве конечной точки потока заявок (и диаграммы процесса соответственно).
Настройка запуска модели.
Вы можете сконфигурировать выполнение модели в соответствии с Вашими требованиями. Модель выполняется в соответствии
с набором установок, задаваемым специальным элементом модели –
экспериментом. Вы можете создать несколько экспериментов с различными установками и изменять рабочую конфигурацию модели,
просто запуская тот или иной эксперимент модели. В панели Проект
эксперименты отображаются в нижней части дерева модели. Один
эксперимент, названный Simulation, создается по умолчанию. Это
простой эксперимент, позволяющий запускать модель с заданными
значениями параметров, поддерживающий режимы виртуального
и реального времени, анимацию и отладку модели.
Запуск модели.
Постройте Вашу модель с помощью кнопки панели инструментов. Построить модель (при этом в рабочей области AnyLogic
должен быть выбран какой-то элемент именно этой модели). Если
в модели есть какие-нибудь ошибки, то построение не будет завершено, и в панель Ошибки будет выведена информация об ошибках,
обнаруженных в модели. Двойным щелчком мыши по ошибке в
этом списке Вы можете перейти к предполагаемому месту ошибки,
чтобы исправить ее.
После того, как Вы исправите все ошибки и успешно построите
Вашу модель, Вы можете ее запустить.
Запустите модель.
1. Щелкните мышью по кнопке панели инструментов Запустить и выберите из открывшегося списка эксперимент, который
Вы хотите запустить. Эксперимент этой модели будет называться Bank/Simulation (рис. 1.8).
Рис. 1.8
17
Рис. 1.9
В дальнейшем по нажатию на кнопку Запустить
(или по нажатию F5) будет запускаться тот эксперимент, который запускался Вами в последний раз. Чтобы выбрать какой-то другой эксперимент, Вам будет нужно щелкнуть мышью по стрелке, находящейся
в правой части кнопки Запустить
и выбрать нужный Вам эксперимент из открывшегося списка (или щелкнуть правой кнопкой
мыши по этому эксперименту в панели Проекты и выбрать Запустить из контекстного меню).
Запустив модель, Вы увидите окно презентации этой модели.
В нем будет отображена презентация запущенного эксперимента.
AnyLogic автоматически помещает на презентацию каждого простого эксперимента заголовок и кнопку, позволяющую запустить
модель и перейти на презентацию, нарисованную Вами для главного класса активного объекта этого эксперимента (Main) (рис. 1.9).
Щелкните по этой кнопке. Тем самым Вы запустите модель и
перейдете к презентации корневого класса активного объекта запущенного эксперимента (рис. 1.10). Для каждой модели, созданной
с помощью объектов Основной библиотеки, автоматически создается блок-схема с наглядной визуализацией процесса, с помощью
Рис. 1.10
18
Рис. 1.11
которой Вы можете изучить текущее состояние модели, например,
длину очереди, количество обслуженных человек и так далее.
Вы можете изменить скорость выполнения модели с помощью
кнопок панели инструментов Замедлить и Ускорить (рис. 1.11).
Вы можете следить за состоянием любого блока диаграммы процесса во время выполнения модели с помощью окна инспекта этого
объекта. Чтобы открыть окно инспекта, щелкните мышью по значку блока. В окне инспекта будет отображена базовая информация
по выделенному блоку: например, для блока Queue будет отображена вместимость очереди, количество заявок, прошедшее через
каждый порт объекта, и т. д. (рис. 1.12).
Рис. 1.12
19
Когда Вы захотите остановить выполнение модели, щелкните
мышью по кнопке панели управления окна презентации Прекратить выполнение .
Шаг 2. Создание анимации модели.
Хотя мы и могли анализировать работу запущенной нами только что модели с помощью визуализированной диаграммы процесса,
но куда удобнее было бы иметь более наглядную визуализацию моделируемого нами с помощью анимации. В этом примере мы хотим
создать визуализированный план банковского отделения. Поскольку в нашем случае нас не интересует конкретное расположение объектов в пространстве, то мы можем просто добавить
чисто схематическую анимацию интересующих нас объектов – в
нашем случае мы хотим видеть на анимации банкомат и ведущую к
нему очередь клиентов.
Анимация модели рисуется в той же диаграмме (в графическом
редакторе), в которой задается и диаграмма моделируемого процесса.
Нарисуйте круг, который будет обозначать на анимации банкомат.
Вначале откройте закладку Презентация панели Палитра. Чтобы открыть какую-либо закладку панели Палитра (именуемую
в дальнейшем палитрой), нужно щелкнуть мышью по заголовку
этой палитры. Палитра Презентация содержит элементы, используемые для
рисования презентаций моделей: примитивные фигуры, с помощью которых Вы можете рисовать сложные презентации, а также элементы управления, с помощью которых Вы можете сделать
Ваши презентации интерактивными.
Перетащите элемент Овал
из палитры Презентация на диаграмму класса активного объекта. Поместите его, как показано на рис. 1.13.
Рис. 1.13
20
Давайте сделаем так, что цвет этого кружка будет меняться в
зависимости от того, обслуживает ли банкомат в данный момент
времени клиента или нет. Для этого выделите нарисованную нами
фигуру на диаграмме и перейдите на страницу Динамические панели свойств. Здесь Вы увидите список полей, в которых задаются
значения динамических свойств фигуры. Если Вам нужно, чтобы
по ходу моделирования то или иное свойство фигуры меняло свое
значение в зависимости от каких-то условий, то Вы можете ввести в поле соответствующего динамического свойства выражение,
которое будет постоянно вычисляться заново при выполнении модели, и возвращаемый результат этого вычисления будет присваиваться текущему значению этого свойства. Мы с Вами хотим, чтобы во время моделирования менялся цвет нашей фигуры, поэтому
перейдите в поле Цвет заливки и введите там следующую строку: delay.size() > 0 ? red: white (рис. 1.14).
Здесь delay – это имя нашего объекта Delay. Функция size() возвращает число человек, обслуживаемых в данный момент времени.
Если банкомат занят, то цвет кружка будет красным, в противном
случае – зеленым. Нарисуйте ломаную, которая будет обозначать на анимации очередь к банкомату
Нарисуйте ломаную, как показано на рис. 1.15. Чтобы нарисовать ломаную, сделайте двойной щелчок мышью по элементу Ломаная в палитре (при этом его значок должен поменяться на
этот: ). Теперь Вы можете рисовать ломаную точка за точкой, последовательно щелкая мышью в тех точках диаграммы, куда Вы
хотите поместить вершины ломаной. Чтобы завершить рисование,
добавьте последнюю точку ломаной двойным щелчком мыши.
Рис. 1.14
21
Рис. 1.15
Очень важно, какую точку ломаной Вы создаете первой. Заявки
будут располагаться вдоль нарисованной Вами ломаной в направлении от конечной к начальной. Поэтому начните рисование ломаной слева и поместите рядом с банкоматом конечную точку ломаной, которая будет соответствовать в этом случае началу очереди.
Теперь мы должны задать созданные анимационные объекты в
качестве анимационных фигур блоков диаграммы нашего процесса.
Задайте ломаную в качестве фигуры анимации очереди
На странице свойств объекта queue, введите polyline в поле Фигура анимации (рис. 1.16).
Рис. 1.16
22
Задайте круг в качестве фигуры анимации банкомата. Введите в
поле Фигура анимации имя нашего овала: oval.
Выберите из выпадающего списка Тип анимации Одиночная.
Большинство объектов Основной библиотеки поддерживает несколько анимационных стилей. Например, очередь может отображаться в виде линии, упорядоченного или неупорядоченного набора элементов. Подробное описание анимационных стилей дано в
Справочном руководстве по Основной библиотеке, в статье Анимация объектов Основной библиотеки. В нашем случае, если банкомат будет занят, то мы будем показывать в фигуре банкомата обслуживающегося в нем клиента, а поскольку единовременно наш
банкомат не обслуживает больше одного клиента, то мы и выбираем тип анимации Одиночная (рис. 1.17).
Теперь Вы можете запустить модель и изучить ее поведение. Для
ускорения работы модели переключитесь в режим виртуального
времени, щелкнув мышью по кнопке панели инструментов Реальное/виртуальное время. В режиме виртуального времени модель
будет выполняться максимально быстро, без привязки модельного
времени к реальному.
Запустите модель. Вы увидите, что у нашей модели теперь есть
простейшая анимация – банкомат и ведущая к нему очередь клиентов. Цвет фигуры банкомата будет меняться в зависимости от того,
обслуживается ли клиент в данный момент времени.
Рис. 1.17
23
Анимация клиентов. По умолчанию заявки (наши посетители
банковского отделения) будут отображаться на анимации маленькими прямоугольниками различных цветов. Чтобы анимация выглядела более наглядно, давайте зададим в качестве фигуры анимации клиента фигурку человека. Вы можете нарисовать фигурку сами, но мы рекомендуем просто использовать типовую картинку из набора стандартных изображений, поставляемого вместе с AnyLogic, начиная с версии 6.4.
Создайте анимацию клиента. Откройте палитру Картинки. Эта
палитра содержит набор картинок, которые наиболее часто используются пользователями AnyLogic при создании моделей.
Перетащите элемент Человек из палитры на диаграмму графического редактора (рис. 1.18).
По умолчанию эта картинка будет называться person. Оставьте
ее название без изменений, поскольку в дальнейшем мы будем ссылаться на нее в блоке диаграммы нашего процесса именно по этому
имени.
Поместите картинку за границу видимой области презентации
Передвиньте холст диаграммы немного вниз, нажав правую
кнопку мыши в графическом редакторе и перетащив мышь, не отпуская кнопки, вниз.
Перетащите фигурку человечка выше верхней границы экрана
презентации, как показано на рис. 1.19. Мы делаем это для того,
чтобы картинка оказалась за областью видимости диаграммы.
Рис. 1.18
Рис. 1.19
24
Передвиньте холст диаграммы обратно.
Теперь нам нужно сообщить объекту source, чтобы он использовал добавленную нами фигурку в качестве фигуры анимации заявки (клиента банка).
Измените свойства объекта source.
Выделите объект source в графическом редакторе.
В полк Фигура анимации заявки введите имя нашей фигурки
человека: person (при этом Вы можете воспользоваться помощником написания кода) (рис. 1.20).
Теперь Вы можете запустить модель и наблюдать за моделируемым процессом с помощью анимации. Обслуживающиеся и ожидающие обслуживания в очереди клиенты будут отображаться на анимации нарисованными нами картинками человечков (рис. 1.21).
Эта простейшая модель продемонстрировала основные принципы работы с Основной библиотекой. Теперь мы готовы к тому, чтобы усовершенствовать нашу модель.
Шаг 3. Сбор статистики использования ресурсов.
AnyLogic предоставляет пользователю удобные средства для
сбора статистики по работе блоков диаграммы процесса. Объекты
Основной библиотеки самостоятельно производят сбор основной
статистики. Все, что Вам нужно сделать – это включить сбор статистики для объекта.
Рис. 1.20
25
Рис. 1.21
Поскольку мы уже сделали это для объектов delay и queue, то теперь мы можем, например, просмотреть интересующую нас статистику (скажем, статистику занятости банкомата и длины очереди)
с помощью диаграмм.
Добавьте диаграмму для отображения средней занятости банкомата.
Откройте палитру Статистика. Эта палитра содержит элементы
сбора данных и статистики, а также диаграммы для визуализации
данных и результатов моделирования. Перетащите элемент Столбиковая диаграмма из палитры Статистика на диаграмму класса и измените ее размер, как показано на
рис. 1.22.
Перейдите на страницу Основные панели Свойства. Щелкните
мышью по кнопке Добавить элемент данных. При этом появится
секция свойств того элемента данных, который будет отображаться
на этой диаграмме.
Измените Заголовок на ATM utilization. Введите delay.stats
Utilization.mean() в поле Значение. Здесь delay – это имя нашего
объекта Delay (рис. 1.23). У каждого объекта Delay есть встроенный
26
Рис. 1.22
Рис. 1.23
набор данных statsUtilization, занимающийся сбором статистики
использования этого объекта. Функция mean() возвращает среднее
из всех измеренных этим набором данных значений. Вы можете
использовать и другие методы сбора статистики, такие, как min()
или max(). Полный список методов можно найти на странице документации этого класса набора данных: StatisticsContinuous (на
английском языке).
27
Перейдите на страницу Внешний вид панели Свойства. Выберите первую опцию из набора кнопок Расположение, чтобы изменить
расположение легенды относительно диаграммы (мы хотим, чтобы
она отображалась справа) (рис. 1.24).
Измените размер диаграммы в графическом редакторе так, чтобы она приняла следующий вид (рис. 1.25).
Добавьте диаграмму для отображения средней длины очереди.
Аналогичным образом добавьте еще одну столбиковую диаграмму. Измените ее размер так, как показано на рис 1.26.
Рис. 1.24
Рис. 1.25
28
Рис. 1.26
Перейдите на страницу Внешний вид панели Свойства и выберите первую опцию в секции свойств Направление, чтобы столбцы
столбиковой диаграммы росли влево (рис. 1.27).
Добавьте элемент данных, который будет отображаться на диаграмме. Задайте Заголовок: Queue length и задайте Значение: queue.
statsSize.mean(). Здесь statsSize – это имя объекта типа «статисти-
Рис. 1.27
29
ка» StatisticsContinuous, производящего сбор статистики размера
очереди объекта Queue (рис. 1.28).
Запустите модель и пронаблюдайте за занятостью банкомата
и средней длиной очереди с помощью только что созданных диаграмм (рис. 1.29).
Шаг 4. Добавление клерков.
Теперь мы усложним нашу модель, добавив в нее служащих –
банковских кассиров. Мы могли бы промоделировать кассиров,
как и банкомат, с помощью объектов Delay. Но куда более удобным представляется моделирование кассиров с помощью ресурсов.
Рис. 1.28
Рис. 1.29
30
Ресурс – это специальный объект Основной библиотеки, который
может потребоваться заявке для выполнения какой-то задачи.
В каждый момент времени ресурс может быть занят только одной
заявкой. В нашем примере посетителям банковского отделения (заявкам) необходимо получить помощь у банковских служащих (ресурсов).
Измените диаграмму процесса. Добавьте объект Service. Этот
объект захватывает для заявки заданное количество ресурсов, задерживает заявку, а затем освобождает захваченные ею ресурсы.
В нашей модели этот объект будет моделировать обслуживание
клиента кассиром (или каким-то другим служащим банковского
отделения) (рис. 1.30).
Чтобы добавить объект Основной библиотеки на диаграмму
класса активного объекта, вначале откройте одноименную палитру
этой библиотеки (Основная библиотека), а затем перетащите нужный Вам объект из палитры в то место диаграммы, куда Вы хотите
его поместить. Измените свойства объекта: ко всем кассирам будет
вести одна общая очередь. Задайте максимальное количество человек в этой очереди в поле Вместимость очереди: 20. Мы полагаем,
что время обслуживания имеет треугольное распределение с минимальным значением равным 2.5, средним – 6, и максимальным –
11 минутам. Введите в поле Время задержки: triangular (2.5, 6, 11)
(рис. 1.31).
Добавьте объект ResourcePool. Объект ResourcePool задает ресурсы определенного типа (в нашей модели это будут банковские
клерки) (рис. 1.32).
Назовите объект tellers. Задайте число кассиров в поле Количество ресурсов: 4 (рис. 1.33).
Рис. 1.30
31
Рис. 1.31
Рис. 1.32
Рис. 1.33
32
Удалите соединитель между объектами Source и Queue и добавьте на его место объект SelectOutput. Объект SelectOutput является
блоком принятия решения. В зависимости от заданного Вами условия, заявка, поступившая в объект, будет поступать на один из двух
выходных портов объекта. Оставьте все свойства объекта без изменений. Пусть Выход true выбирается с заданной вероятностью, а
Вероятность [0...1] равна 0.5. В этом случае к кассирам и банкомату
будет приходить примерно равное количество клиентов (рис. 1.34).
Соедините блоки диаграммы процесса.
Соедините блоки диаграммы процесса, как показано на рис. 1.35.
Чтобы соединить порты блоков друг с другом, сделайте двойной
щелчок мышью по одному порту, затем последовательно щелкните
в тех местах диаграммы, где Вы хотите поместить точки изгиба соединителя, и наконец, завершите процесс соединения, сделав двойной щелчок мышью по второму порту. Вы увидите, что появится
соединитель. Если выделить его мышью, то в том случае, если Вы
Рис. 1.34
Рис. 1.35
33
правильно соедините порты, конечные точки соединителя должны
будут подсветиться зелеными точками. Если Вы не увидите этого,
то значит, точки не были помещены точно внутрь портов, и их нужно будет туда передвинуть.
Вы можете заметить, что большинство установленных нами соединений – это соединения порта, расположенного на правой стороне объекта с портом, расположенным на левой стороне следующего
за ним объекта. Это связано с тем, что в диаграмме процесса выходные порты объектов соединяются со входными, а обычно входные
порты располагаются на левой границе библиотечного объекта,
а выходные – на правой. Исключение в нашем случае пока будет
только одно – мы соединяем нижний порт объекта service с верхним портом объекта tellers – именно так должны подсоединяться
объекты, задающие ресурсы, к объектам, моделирующим занятие
и освобождение этих ресурсов (рис. 1.36).
Поскольку наша модель изменилась, мы должны изменить и ее
анимацию.
Измените анимацию модели. Нарисуйте ломаную, которая будет отображать очередь клиентов, ожидающих обслуживания кассирами. Рисуйте ее, как и раньше, слева направо. Назовите ломаную queueBeforeTellers (рис. 1.37).
Справа от этой ломаной нарисуйте еще одну, из четырех точек,
чтобы указать на анимации места, в которых будут находиться банковские служащие. Назовите эту ломаную tellerPlaces (рис. 1.38).
Теперь мы нарисуем на презентации кассиров. Мы будем отображать их одной из двух картинок – одна будет показывать занятого
кассира, а другая – свободного.
Рис. 1.36
34
Рис. 1.37
Рис. 1.38
Добавьте картинки с изображением клерков. Перетащите элемент Изображение
из палитры Презентация в место диаграммы,
показанное на рис. 1.39 синим прямоугольником.
Перейдите в панель Свойства. Введите в поле Имя новое имя этого изображения: busyTeller (рис. 1.40).
35
Рис. 1.39
Рис. 1.40
Выберите файл изображения, которое будет отображать данная
фигура. Щелкните мышью по кнопке Добавить и выберите файл
busy.png. Вы можете найти этот файл в каталоге <каталог AnyLogic>\
resources\tutorials\Bank Office.
Когда Вы выберете файл, Вы увидите его в области предпросмотра в панели Свойства.
Чтобы сохранить исходный размер изображения, установите
флажок Исходный размер (в этом случае Вы не сможете изменить
36
размер изображения, и оно будет отображаться в оригинальном
масштабе, без искажений.
Аналогично создайте еще одно изображение, показывающее отдыхающего клерка. Назовите фигуру idleTeller и выберите в качестве отображаемого файла idle.png (из того же каталога, что и чуть
ранее).
Теперь нам нужно изменить анимационные свойства блоков нашей диаграммы процесса, задав нарисованные нами фигуры в качестве соответствующих фигур анимации объектов.
Измените анимационные свойства блоков диаграммы процесса.
Задайте нарисованную нами ломаную queueBeforeTellers в качестве фигуры анимации очереди объекта service. Для этого измените
свойства этого объекта следующим образом:
Введите queueBeforeTellers (имя ломаной, задающей форму
очереди, ведущей к кассирам) в поле Фигура анимации (queue)
(рис. 1.41).
Чтобы наши клерки отображались на анимации с помощью добавленных нами картинок, задайте следующие свойства объекта tellers:
Рис. 1.41
37
В поле Фигура анимации введите имя ломаной, задающей местоположение кассиров на презентации: tellerPlaces.
Выберите Набор из выпадающего списка Тип анимации.
В поле Фигура анимации свободного ресурса введите имя изображения свободного клерка: idleTeller.
В поле Фигура анимации занятого ресурса введите busyTeller
(рис. 1.42).
В текущей модели количество клерков, присутствующих в банковском отделении, не изменяется и всегда равно заданному значению. Давайте сделаем так, чтобы у нас была возможность динамически изменять их количество во время моделирования. Такую
задачу можно решить с помощью элементов управления AnyLogic.
Добавьте на презентацию специальный элемент управления –
бегунок, часто используемый для изменения значения численной
переменной или параметра. В нашем случае мы будем изменять с
его помощью количества клерков в нашей модели, проверяя, какое
Рис. 1.42
38
количество будет оптимально удовлетворять текущей интенсивности прихода клиентов в банковское отделение.
Добавьте бегунок, с помощью которого Вы сможете изменять количество клерков.
Элементы управления добавляются на диаграмму так же, как и
фигуры презентации. Откройте палитру Элементы управления и перетащите элемент Бегунок из палитры на диаграмму класса Main.
Поместите бегунок под объектом ResourcePool, чтобы было понятно, что с помощью этого бегунка будет меняться количество ресурсов, задаваемых именно этим объектом (рис. 1.43).
Мы хотим дать возможность пользователю варьировать количество клерков от 0 до 4. Поэтому введите 4 в поле Максимальное
значение.
Введите tellers.capacity в поле Переменная (рис. 1.44).
Рис. 1.43
Рис. 1.44
39
Запустите модель. Вы увидите, что клерки отображаются одной
из двух наших картинок, в зависимости от того, заняты ли они в текущий момент времени. Таким образом, с помощью созданной анимации Вы сможете проследить, сколько кассиров в данный момент
времени занято обслуживанием клиентов. Вы можете изменять количество клерков с помощью бегунка.
Теперь, изменяя количество кассиров во время работы модели, Вы
можете сделать вывод, сколько служащих необходимо для нормальной работы банковского отделения при заданной интенсивности прихода клиентов.
Шаг 5. Сбор статистики по времени обслуживания.
Мы хотим знать, сколько времени клиент проводит в банковском отделении и сколько времени он теряет, ожидая своей очереди. Мы соберем эту статистику с помощью специальных объектов
сбора данных и отобразим собранную статистику распределения
времени обслуживания клиентов с помощью гистограмм.
Теперь мы создадим Java класс Customer. Экземпляры этого
класса будут использоваться в нашей модели в качестве заявок и
будут представлять клиентов банковского отделения. Мы создадим
в этом классе специальные поля для запоминания необходимой
нам информации о проведенном клиентом времени.
Создайте Java класс Customer.
В панели Проекты, щелкните правой кнопкой мыши по элементу модели и выберите Создать|Java класс из контекстного
меню.
Появится диалоговое окно Новый Java класс. В поле Имя введите имя нового класса: Customer.
Сделайте так, что этот класс будет наследоваться от базового
класса заявки Entity. Для этого выберите из выпадающего списка
Базовый класс имя этого класса: Entity.
Щелкните мышью по кнопке Далее, чтобы перейти к следующей странице Мастера создания Java класса. На второй странице
Мастера Вы можете задать параметры создаваемого Java класса. Создайте два параметра:
– enteredSystem типа double для сохранения момента времени,
когда клиент пришел в банковское отделение,
– startWaiting типа double для сохранения момента времени,
когда клиент встал в очередь к банкомату (рис. 1.45)).
Щелкните мышью по кнопке Готово. Вы увидите редактор кода
созданного класса. Можете закрыть его, щелкнув мышью по крестику в закладке с его названием (рис. 1.46).
40
Рис. 1.45
Рис. 1.46
41
Добавьте элементы сбора статистики по времени ожидания клиентов и времени пребывания клиентов в системе. Эти элементы
будут запоминать соответствующие значения времен для каждого
клиента и предоставят пользователю стандартную статистическую
информацию: среднее, минимальное, максимальное из измеренных значений, среднеквадратичное отклонение, доверительный
интервал для среднего и т. д.
Добавьте элементы сбора данных
Чтобы добавить объект сбора данных гистограммы на диаграмму, перетащите элемент Данные гистограммы с палитры Статистика на диаграмму активного класса.
Задайте свойства элемента.
Измените Имя на waitTimeDistr.
Измените Заголовок на Waiting time distribution.
Сделайте Кол-во интервалов равным 50.
Задайте Начальный размер интервала: 0.01.
Создайте еще один элемент сбора данных гистограммы. Ctrl+
перетащите только что созданный объект данных гистограммы,
чтобы создать его копию.
Измените Имя этого элемента на timeInSystemDistr, а Заголовок на Time in system distribution (рис. 1.47).
Теперь нам нужно изменить свойства блоков нашей диаграммы
процесса.
Измените свойства блоков диаграммы процесса.
Измените свойства объекта source:
Введите new Customer() в поле Новая заявка. Теперь этот объект
будет создавать заявки нашего типа Customer. Рис. 1.47
42
Введите Customer в поле Класс заявки. Это позволит напрямую
обращаться к полям класса заявки Customer в коде динамических
параметров этого объекта.
Введите entity.enteredSystem = time(); в поле Действие при
выходе. Этот код будет сохранять время создания заявки-клиента в переменной enteredSystem нашего класса заявки Customer
(рис. 1.48).
Функция time() возвращает текущее значение модельного времени.
Измените свойства объекта queue:
Введите Customer в поле Класс заявки.
Введите entity.startWaiting = time(); в поле Действие при входе.
Этот код запоминает время начала ожидания клиентом его очереди
на обслуживание в переменной startWaiting нашего класса заявки
Customer.
Введите waitTimeDistr.add(time() – entity.startWaiting); в поле
Действие при выходе. Этот код добавляет время, в течение которого
клиент ожидал обслуживания, в объект сбора данных waitTimeDistr
(рис. 1.49).
Измените свойства объекта sink:
Введите Customer в поле Класс заявки.
Введите timeInSystemDistr.add(time() -entity.enteredSystem);
в поле Действие при входе. Этот код добавляет полное время пре-
Рис. 1.48
43
Рис. 1.49
бывания клиента в банковском отделении в объект сбора данных
гистограммы timeInSystemDistr (рис. 1.50).
Запустите модель и просмотрите статистику с помощью окон инспекта. Открыть окно инспекта можно щелкнув мышью по значку
объекта сбора данных. Здесь Вы увидите стандартные для статистического анализа данные, приведенные для значений, собранных в данном объекте сбора статистики (рис. 1.51).
Теперь давайте добавим на диаграмму нашего класса гистограммы, которые будут отображать собранную нами временную статистику.
Добавьте две гистограммы для отображения распределений времени ожидания клиента и пребывания клиента в системе.
Чтобы добавить гистограмму на диаграмму класса активного
объекта, перетащите элемент Гистограмма из палитры Статистика
в то место графического редактора, куда Вы хотите ее поместить
(рис. 1.52).
Рис. 1.50
44
Рис. 1.51
Рис. 1.52
Укажите, какой элемент сбора данных хранит данные, которые
Вы хотите отображать на гистограмме: щелкните мышью по кнопке Добавить данные и введите в поле Данные имя соответствующего элемента: waitTimeDistr (рис. 1.53).
45
Рис. 1.53
Рис. 1.54
46
Добавьте еще одну гистограмму и расположите ее под ранее добавленной.
В поле Данные введите имя элемента, хранящего данные, которые будут отображаться на гистограмме: timeInSystemDistr.
Измените Заголовок отображаемых данных на Распр. времени
пребывания в системе.
Запустите модель. Включите режим виртуального времени и понаблюдайте за тем, какой вид примет распределение времени ожидания и пребывания клиента в системе (рис. 1.54).
Вопросы для самопроверки
1. Как Вы можете открыть примеры моделей AnyLogic?
2. Перечислите типы моделей, которые могут быть созданы с
помощью Мастера создания моделей. Использовали ли Вы Мастер
при создании этой модели?
3. В чем заключается разница между левыми и правыми портами объектов Enterprise Library?
4. Укажите допустимые соединения портов объектов Enterprise
Library:
a) входной порт со входным;
b) входной с выходным;
c) выходной с выходным.
5. Обладают ли объекты Enterprise Library встроенной анимацией?
6. Как Вы можете указать объекту, какую именно фигуру он
должен использовать для анимации находящихся в нем заявок?
7. Почему, если ломаная используется в качестве фигуры анимации объекта, то важно, в каком порядке Вы рисуете ее точки?
8. Какой объект и тип анимации Вы выберете для того, чтобы
промоделировать кафе? Зрительный зал кинотеатра? Банкомат?
9. В режиме реального времени 1:1 сколько времени потребуется для моделирования 100 единиц модельного времени: a) 100; b) 1;
c) 100 или больше.
47
2. РАЗРАБОТКА МОДЕЛИ ОТДЕЛЕНИЯ
ОФТАЛЬМОЛОГИИ
В этом разделе учебного пособия мы создадим модель больничного отделения, в котором проводится процедура офтальмоскопии. 1. Пациент, прибывающий в отделение, вначале направляется в
приемный покой. Там он дожидается прихода врача, который должен провести его осмотр.
2. Процедура проводится в одной из трех процедурных комнат.
Когда за пациентом прибывает доктор, они отправляются в свободную процедурную комнату. Если все процедурные комнаты оказываются занятыми, то пациент ждет в приемном покое, пока какаянибудь из комнат освободится.
3. Врач осматривает пациента с помощью офтальмоскопа, который он специально приносит из комнаты хранения инструментов
перед тем, как проследовать к пациенту.
4. После проведения процедуры врач относит офтальмоскоп обратно и отправляется в ординаторскую, а пациент покидает отделение офтальмологии.
Эту модель мы создадим с помощью объектов Основной библиотеки для моделирования транспортных сетей (названия этих объектов начинаются с Network). Обычно они используются тогда, когда
для моделируемых процессов имеет значение физическое расположение объектов в пространстве. В таких моделях заявки движутся
по заданным путям и используют ресурсы, находящиеся в сети.
Целью нашей модели будет анализ работы отделения и оптимальности имеющих в нем место процессов обслуживания пациентов – с учетом точного времени как проведения процедур осмотра
пациентов, так и передвижений пациентов и персонала больницы
по отделению. Чтобы времена передвижения людей по отделению
соответствовали реальным, мы добавим в модель план отделения
(физического расположения комнат), нарисуем пути движения
людей между комнатами, зададим им скорости передвижения и
соответственно время, затрачиваемое пациентом или врачом на достижение той или иной комнаты будет зависеть от реальной длины
пути, который нужно будет пройти.
Шаг 1. Создание новой модели.
Вначале мы создадим новую модель.
Создайте новую модель.
Щелкните мышью по кнопке панели инструментов Создать .
Появится окно Мастера создания модели.
48
Задайте имя новой модели. В поле Имя модели введите Ophthalmology Department.
Выберите каталог, в котором будут сохранены файлы модели.
Если Вы хотите сменить предложенный по умолчанию каталог на
какой-то другой, Вы можете ввести путь к нему в поле Местоположение или выбрать этот каталог с помощью диалога навигации по
файловой системе, открывающегося по нажатию на кнопку Выбрать.
Щелкните мышью по кнопке Далее. Откроется вторая страница
Мастера создания модели.
Здесь Вам будет предложено выбрать шаблон модели, на базе
которого Вы будете разрабатывать Вашу модель. Поскольку мы хотим научить Вас процессу создания модели «с нуля», чтобы в дальнейшем Вы могли самостоятельно создавать аналогичные модели,
не выбирайте шаблон модели, а просто закончите создание модели,
щелкнув мышью по кнопке Готово.
Вы создали новую модель. Если Вы еще не знакомы с пользовательским интерфейсом AnyLogic, то давайте уделим пару минут его
основным компонентам:
Пользовательский интерфейс AnyLogic.
В левой части рабочей области будет находиться панель Проекты. Панель Проекты обеспечивает легкую навигацию по элементам
моделей, открытых в текущий момент времени. Поскольку модель
организована иерархически, то она отображается в виде дерева:
сама модель образует верхний уровень дерева; эксперименты, классы активных объектов и Java классы образуют следующий уровень; элементы, входящие в состав активных объектов, вложены в
соответствующую подветвь дерева класса активного объекта и т. д.
В правой рабочей области будет отображаться панель Палитра,
а внизу – панель Свойства. Панель Палитра содержит разделенные
по категориям элементы, которые могут быть добавлены на диаграмму класса активного объекта или эксперимента. Панель Свойства используется для просмотра и изменения свойств выбранного
в данный момент элемента (или элементов) модели.
В центре рабочей области AnyLogic Вы увидите графический редактор диаграммы класса активного объекта Main. При работе с моделью не забывайте сохранять производимые
Вами изменения с помощью кнопки панели инструментов Сохранить .
Шаг 2. Создание анимации модели.
Теперь мы готовы к тому, чтобы начать разработку нашей модели.
49
Первым делом давайте нарисуем анимацию нашей модели, поскольку именно она будет определять структуру нашей модели – ее
транспортную сеть. Вначале давайте добавим изображение плана отделения, чтобы потом рисовать узлы транспортной сети нашей модели (соответствующие комнатам отделения) и сегменты транспортной сети
(пути движения людей по отделению) уже поверх этого плана. Мы не будем рисовать план в графическом редакторе AnyLogic,
а просто вставим готовое изображение.
Добавьте на презентацию план отделения.
Вначале откройте закладку Презентация панели Палитра. Чтобы открыть какую-либо закладку панели Палитра (именуемую
в дальнейшем палитрой), нужно щелкнуть мышью по заголовку
этой палитры. Палитра Презентация содержит элементы, используемые для
рисования презентаций моделей: фигуры, с помощью которых Вы
можете рисовать сложные презентации, а также элементы управления, с помощью которых Вы можете сделать Ваши презентации
интерактивными.
Перетащите элемент Изображение
из палитры Презентация
на диаграмму класса активного объекта. Поместите его так, как показано на рис. 2.1.
Задайте свойства изображения в панели Свойства. Щелкните
мышью по кнопке Добавить и выберите файл изображения плана отделения. Файл находится в каталоге <каталог AnyLogic>\
resources\tutorials\Ophthalmology Department\layout.png
Чтобы сохранить исходный размер изображения, установите
флажок Исходный размер (рис. 2.2).
Рис. 2.1
50
Рис. 2.2
Заблокируйте изображение, установив флажок Блокировать.
Вы не сможете выбрать заблокированную фигуру в графическом
редакторе до тех пор, пока Вы не снимете с нее блокировку. Мы делаем так потому, что мы будем рисовать другие фигуры поверх этого изображения, и поэтому мы хотим исключить возможность случайного редактирования изображения при рисовании этих фигур.
Изображение должно будет выглядеть следующим образом
(рис. 2.3).
Рис. 2.3
51
Теперь мы нарисуем анимацию модели. На основе анимации
строится транспортная сеть модели: прямоугольники соответствуют
узлам сети, а ломаные линии – связям между ними, играющим роль
путей движения заявок и ресурсов в моделируемом пространстве. Поэтому, чтобы создать требуемую транспортную сеть, мы
должны нарисовать на анимации помещения нашего отделения с
помощью прямоугольников и соединить их ломаными линиями.
Нарисуйте узлы сети.
Нарисуйте каждую комнату отделения с помощью прямоугольника. Отделение офтальмологии включает в себя приемный покой,
три процедурные, комнату хранения офтальмоскопов и комнату
для персонала.
На приведенном рис. 2.4 нарисованы и подписаны прямоугольники, которые Вам нужно будет нарисовать. Назовите прямоугольники именно так, как показано на рисунке. Это важно, потому что
в дальнейшем мы будем ссылаться на ключевые области нашего
отделения именно по именам соответствующих прямоугольников.
Чтобы нарисовать прямоугольник, сделайте двойной щелчок
мышью по элементу Прямоугольник в палитре (при этом его
значок должен поменяться на этот:
). Затем щелкните мышью
в том месте диаграммы, где Вы хотите нарисовать прямоугольник,
и передвиньте ее, не отпуская кнопки, пока контур создаваемого
прямоугольника не примет желаемый размер, после чего отпустите
кнопку мыши.
Рис. 2.4
52
Рисуйте прямоугольники так, чтобы они помещались в соответствующие области на плане отделения, как показано на рис. 2.5.
Чтобы облегчить рисование фигур нужного Вам размера, выключите привязку фигур к сетке диаграммы, щелкнув по кнопке панели инструментов Включить/Отключить сетку.
Прямоугольники в нашей модели используются для задания
следующих областей:
– приемный покой – waitingHall;
– комната для персонала – procRoom1, procRoom2, procRoom3;
– комната хранения офтальмоскопов – storageRoom;
– процедурные комнаты – staffRoom.
Чтобы сделать пути движения людей на анимации более реалистичными, добавьте дополнительные узлы сети, нарисовав еще
несколько прямоугольников и поместив их так, как показано на
рис. 2.5.
Теперь мы нарисуем сегменты сети с помощью ломаных линий.
Эти линии будут задавать пути движения пациентов и персонала
больницы. Нарисуйте пути (сегменты сети).
С помощью инструмента рисования Ломаная , нарисуйте ломаные линии, как показано на рис. 2.6. Соедините соседние узлы сети
– тем самым Вы зададите требуемую транспортную сеть модели.
Чтобы нарисовать ломаную, сделайте двойной щелчок мышью
по элементу Ломаная в палитре (при этом его значок должен
Рис. 2.5
Рис. 2.6
53
поменяться на этот: ). Теперь Вы можете рисовать ломаную точка за точкой, последовательно щелкая мышью в тех точках диаграммы, куда Вы хотите поместить вершины ломаной. Чтобы завершить рисование, добавьте последнюю точку ломаной двойным
щелчком мыши.
Все начальные и конечные точки линий должны обязательно
находиться внутри соединяемых прямоугольников (и в одном прямоугольнике не может находиться более одной точки одной и той
же ломаной).
Теперь нам нужно будет добавить наши фигуры в группу. На
базе элементов этой группы, которую мы потом укажем в соответствующем параметре конфигурационного объекта сети, будет сконструирована логическая структура сети.
Добавьте фигуры в группу.
Добавьте все нарисованные фигуры в группу фигур. Вначале
выберите эти фигуры. Лучше всего сделать это, нажав левую кнопку мыши сбоку от крайней из этих фигур, и не отпуская кнопку
перетащить мышь так, чтобы рамка выделения покрыла всю область, содержащую фигуры, которые Вы хотите выделить (как на
рис. 2.7).
Отпустите кнопку мыши. Выделенные таким образом фигуры
будут подсвечены, синим цветом. Если какая-то из фигур оказалась не выделенной, Вы можете добавить ее в группу выделенных
фигур, нажав Ctrl, и не отпуская ее, щелкнуть мышью по той фигуре, которую Вы хотите добавить. Фигура будет добавлена в выделение.
Когда Вы выделите все фигуры, сделайте щелчок правой кнопкой мыши по выделенным фигурам и выберите Создать группу из
контекстного меню.
Рис. 2.7
54
Задайте местоположение процедурных комнат
Нарисуйте ломаную линию, соединяющую прямоугольники,
представляющие собой процедурные комнаты. Она понадобится
нам чуть позже. Поместите точки ломаной точно внутрь прямоугольников procRoom1, procRoom2 и procRoom3.
Назовите ее roomsLocation и выберите для нее другой цвет.
Сделайте ломаную невидимой во время выполнения модели.
Перейдите на страницу Динамические панели свойств ломаной и
введите false в поле Видимость.
Шаг 3. Анимация ресурсов.
Теперь мы нарисуем анимацию для нашего пациента, врача и
офтальмоскопа, чтобы мы могли отличать их на анимации нашей
модели.
Создайте изображения врача и пациента
Вы можете либо сами нарисовать фигурку врача, либо использовать одну из стандартных картинок, поставляемых вместе с
AnyLogic. Мы выбираем второй подход, как наиболее легкий. Откройте палитру Картинки. Эта палитра содержит набор картинок,
которые наиболее часто используются пользователями AnyLogic
при создании моделей.
Перетащите элемент Врач из палитры на диаграмму графического редактора (рис. 2.8).
По умолчанию эта картинка будет называться doctor. Оставьте
ее название без изменений, поскольку в дальнейшем мы будем ссылаться на нее в блоке диаграммы нашего процесса именно по этому
имени.
Перетащите элемент Пациент из палитры на диаграмму графического редактора (рис. 2.9).
По умолчанию эта картинка будет называться patient. Не меняйте и это название по выше описанной причине.
Нарисуйте офтальмоскоп.
Нарисуйте офтальмоскоп, как показано на рис. 2.10.
Чтобы Вам было удобнее рисовать маленькую картинку, увеличьте масштаб диаграммы графического редактора, скажем до
Рис. 2.8
Рис. 2.9
Рис. 2.10
55
масштаба 400% с помощью специального элемента на панели инструментов (рис. 2.11).
Проще будет нарисовать фигурку с помощью элемента Ломаная . Мы рекомендуем создавать ломаную не перетаскиванием на
диаграмму из палитры Презентация, а использовать поддерживаемый для этого типа фигуры режим рисования. Напомним еще раз,
как это делается: чтобы нарисовать фигуру сложной формы, сделайте двойной щелчок мышью по элементу Ломаная в палитре
(при этом его значок должен поменяться на этот: ). Теперь Вы можете рисовать ломаную точка за точкой, последовательно щелкая
мышью в тех точках диаграммы, куда Вы хотите поместить вершины ломаной. Чтобы завершить рисование, добавьте последнюю точку ломаной двойным щелчком мыши.
Необязательно соединять на диаграмме начальную точку ломаной с конечной. Перейдите на страницу Основные панели свойств
ломаной и установите флажок Замкнутая. Начальная и конечная
точки ломаной будут автоматически соединены замыкающим отрезком.
Теперь, чтобы закрасить фигуру цветом, выберите любой понравившийся Вам цвет с помощью элемента управления Цвет заливки. Этим цветом будет закрашена область, находящаяся внутри
контура ломаной.
Назовите фигуру scope.
Когда Вы закончите, вернитесь к первоначальному масштабу
диаграммы графического редактора, щелкнув мышью по кнопке
панели инструментов 100% .
Чтобы картинки ресурсов не попали в область презентации, которая будет видна после запуска Вашей модели, передвиньте их за
границы области презентации, которая будет отображаться в окне
презентации запущенной модели.
Поместите картинки ресурсов за границу видимой области
презентации.
Рис. 2.11
56
Передвиньте холст диаграммы немного вниз, нажав правую
кнопку мыши в графическом редакторе и перетащив мышь, не отпуская кнопки, вниз.
Выделите мышью картинки всех ресурсов и перетащите их чуть
выше границы видимой области диаграммы.
Передвиньте холст диаграммы обратно, чтобы картинки ресурсов оказались за областью видимости диаграммы.
Мы закончили создание презентации нашей модели. Теперь мы
можем изменить настройки сети и задать процесс с помощью диаграммы процесса, составляемой из блоков моделирования транспортных сетей Основной библиотеки.
Шаг 4. Задание сети и ресурсов.
Теперь мы изменим свойства объекта, описывающего сеть, и добавим объекты, задающие имеющиеся в нашей модели ресурсы. Задайте свойства сети.
Добавьте на диаграмму объект Network. Этот объект задает
транспортную сеть модели и ее свойства. Детальное описание объекта, а также всех его параметров и функций Вы можете найти в
Справочном руководстве по Основной библиотеке: Объекты Основной библиотеки.
Чтобы добавить на диаграмму объект Основной библиотеки,
нужно открыть в панели Палитра палитру этой библиотеки, щелкнув мышью по панели с ее заголовком, а затем перетащить нужный Вам объект из палитры на диаграмму класса.
В параметре Группа фигур сети введите имя группы фигур
анимации: group. Этот параметр позволяет указать этому объекту Network, какие именно фигуры анимации задают логическую
структуру задаваемой этим объектом сети (рис. 2.12). Проверьте, называется ли группа Ваших фигур (в которую Вы добавили
нарисованные ранее прямоугольники и соединяющие их ломаные,
представляющие узлы и сегменты сети) group, и если нет – то введите здесь ее действительное имя. Чтобы проверить имя группы
Рис. 2.12
57
Рис. 2.13
фигур, просто щелкните по любой фигуре этой группы и имя группы будет отображено в панели Свойства (рис. 2.13).
Теперь мы добавим объекты, задающие сетевые ресурсы. Сетевые ресурсы могут быть трех видов: движущиеся, переносные и
статические. В нашем случае врачи будут заданы движущимися
ресурсами, офтальмоскопы – портативными ресурсами, а процедурные комнаты – статическими. Задайте ресурсы типа «врач».
Добавьте на диаграмму класса Main объект Основной библиотеки NetworkResourcePool. Объект NetworkResourcePool описывает
ресурсы определенного типа. Этот объект будет задавать свойства
ресурсов, представляющих в нашей модели врачей. Задайте следующие свойства объекта:
Назовите объект doctors (рис. 2.14).
Укажите, сколько врачей будет присутствовать в Вашей модели. Введите в поле Количество ресурсов: 5.
Задайте базовое местонахождение ресурсов. Движущиеся ресурсы возвращаются в заданное здесь место, когда они становятся
свободными. В нашей модели все врачи должны возвращаться в общую ординаторскую, поэтому оставьте выбранным в поле Базовое
местоположение задается как опцию Один узел и введите в поле Базовый узел имя прямоугольника, который представляет на анимации ординаторскую: staffRooom.
Укажите, какой фигуркой Вы хотите отображать врача на анимации. Введите имя добавленной нами ранее картинки врача doctor
58
Рис. 2.14
в полях Фигура анимации свободного ресурса и Фигура анимации
занятого ресурса.
Задайте ресурсы типа «процедурная комната»
Добавьте еще один объект NetworkResourcePool. Этот объект будет задавать свойства ресурсов, представляющих в нашей модели
процедурные комнаты. Задайте следующие свойства объекта:
Назовите объект procRooms.
Измените Тип ресурса на Статический (рис. 2.15).
Задайте местоположение комнат. Статические ресурсы всегда
находятся в месте, указанном как базовое. Вы можете задать несколько таких мест, для этого нужно нарисовать ломаную линию
с точками, лежащими в соответствующих прямоугольниках и указать ее в свойствах объекта. Поскольку в нашей модели три таких
комнаты, то мы должны воспользоваться именно этим способом.
Для этого выберите Путь через узлы из выпадающего списка Базовое местоположение и введите в поле Путь через узлы имя созданной ранее именно для этой цели ломаной: roomsLocation.
59
Рис. 2.15
Укажите, что количество ресурсов, задаваемое этим объектом,
равно количеству точек указанной ломаной. Для этого выберите из
группы кнопок Количество задано опцию Фигурой базового местоположения.
Задайте ресурсы типа «офтальмоскоп».
Аналогично добавьте еще один объект NetworkResourcePool. Этот
объект будет задавать свойства ресурсов, представляющих в нашей
модели офтальмоскопы. Задайте следующие свойства объекта:
Назовите объект scopes.
Измените Тип ресурса на Переносной.
Задайте количество офтальмоскопов – введите в поле Количество ресурсов: 5 (рис. 2.16).
Задайте базовое местоположение ресурсов. Статические ресурсы
будут помещены в указанный узел сети при запуске модели. Оставьте без изменения параметр Базовое местоположение задается, как
и введите в поле Базовый узел имя прямоугольника, задающего в
нашей модели комнату хранения оборудования: storageRooom.
Укажите, какой фигурой Вы хотите отображать офтальмоскоп
на анимации. Введите имя нарисованной нами ранее фигуры scope
в полях Фигура анимации свободного ресурса и Фигура анимации
занятого ресурса.
60
Рис. 2.16
Соедините все объекты NetworkResourcePool с объектом
Network. Чтобы добавить заданные ресурсы в нашу сеть, Вам нужно соединить порты объектов NetworkResourcePool с портом объекта Network. Соедините их, как показано на показанном рис. 2.17.
Чтобы соединить порты объектов, сделайте двойной щелчок мышью по одному порту, затем при желании щелкните в тех местах
диаграммы, где Вы хотите добавить точку изгиба соединителя, и
завершите создание, сделав двойной щелчок мышью по второму
порту. При этом между портами появится соединитель заданной
Вами формы (рис. 2.18).
Если Вы выделите соединитель щелчком мыши, и его конечные
точки в портах будут подсвечиваться светло-зеленым цветом, то это
будет означать, что Вы успешно соединили порты. Иначе же Вам
придется проверить, точно ли в порт была добавлена одна из двух
конечных точек соединителя, и если нужно, то передвинуть ее туда.
Шаг 5. Диаграмма процесса. Теперь мы закончим создание простейшей модели, в которой
пациенты, прибывающие на отделение, вначале направляются в
приемный покой, а затем следуют в процедурную комнату, где про61
Рис. 2.17
Рис. 2.18
Рис. 2.19
водится процедура офтальмоскопии. После ее проведения они покидают отделение.
 Создайте диаграмму процесса.
Создайте следующую диаграмму процесса, добавив на диаграмму класса Main новые блоки Основной библиотеки и соединив их
так, как показано на рис. 2.19.
Эта диаграмма будет описывать моделируемый нами процесс.
Давайте бегло ознакомимся с тем, из каких блоков состоит. Попутно мы будем изменять параметры блоков в соответствии с моделируемой нами задачей.
Первым следует объект Source. Объект Source создает заявки.
Обычно он используется в качестве начальной точки потока заявок. В нашем случае заявки будут представлять собой пациентов, и
этот блок будет моделировать поступление пациентов на отделение.
Измените свойства объекта source.
В поле Интенсивность прибытия задайте интенсивность поступления пациентов на отделение: 0.05.
62
Рис. 2.20
В поле Фигура анимации заявки введите имя ранее добавленной
нами фигурки пациента: patient (рис. 2.20).
За этим объектом следует блок NetworkEnter. Этот объект добавляет заявки в заданное место сети, в нашем случае мы хотим, чтобы
он помещал пациентов в приемный покой.
Измените свойства объекта networkEnter.
Введите waitingHall в поле Узел входа (рис. 2.21). Здесь waitingHall – это имя ранее нарисованного нами прямоугольника, кото-
Рис. 2.21
63
рый располагается на плане отделения прямо поверх приемного
покоя. Заявки-пациенты будут прибывать в указанный узел сети,
задающий в нашей модели приемный покой.
В поле Сеть Вы можете увидеть введенное Мастером создания
модели имя объекта Network (network). Именно в сеть, заданную
этим объектом, и будут помещаться заявки этим блоком.
Следующий блок в диаграмме процесса – NetworkMoveTo. Объект NetworkMoveTo перемещает заявку в новое место сети. С помощью этого объекта мы хотим промоделировать, как пациенты переходят из приемного покоя в процедурную комнату.
Измените свойства объекта networkMoveTo.
Введите в поле Узел procRoom1 (имя прямоугольника, который
задает одну из процедурных комнат). Пациенты будут перемещаться в указанный Вами узел сети. На данный момент все пациенты
будут осматриваться в первой процедурной комнате (рис. 2.22).
Объект Delay задерживает заявку на заданное время. В нашей
модели этот объект моделирует задержку, связанную с проведением процедуры. Присутствие «обычного», несетевого, блока Delay в диаграмме
сетевого процесса наглядно подтверждает тот факт, что Вы можете
использовать в диаграмме любые объекты Основной библиотеки,
такие как Queue, Delay, Service и т. д.
Измените свойства объекта delay.
Задайте следующие свойства объекта:
В поле Вместимость введите 5. Этот параметр определяет, как
много пациентов сможет быть осмотрено одновременно (рис. 2.23).
Рис. 2.22
64
Рис. 2.23
Еще один блок NetworkMoveTo будет моделировать то, как пациенты направляются к выходу после проведения процедуры.
Измените свойства объекта networkMoveTo.
Мы хотим, чтобы этот объект перемещал пациентов в указанный нами узел сети.
Введите в поле Узел exit (имя прямоугольника, который задает
выход из отделения) (рис. 2.24).
Объект NetworkExit удаляет заявку из сети. Заявка при этом
перестает отображаться на анимации сети. В нашем случае он моделирует уход пациентов из отделения. Оставьте свойства объекта NetworkExit без изменений.
Рис. 2.24
65
Объект Sink уничтожает поступившие заявки. Обычно он используется в качестве конечной точки диаграммы процесса.
Оставьте свойства объекта Sink без изменений.
Шаг 6. Запуск модели.
Вы можете сконфигурировать выполнение модели в соответствии с Вашими требованиями. Модель выполняется в соответствии с набором установок, задаваемым специальным элементом
модели – экспериментом. Вы можете создать несколько экспериментов с различными установками и изменять рабочую конфигурацию модели, просто запуская тот или иной эксперимент модели.
В панели Проекты эксперименты отображаются в нижней части
дерева модели. Один эксперимент, названный Simulation, создается по умолчанию. Это простой эксперимент, позволяющий запускать модель с заданными значениями параметров, поддерживающий режимы виртуального и реального времени, анимацию и
отладку модели (рис. 2.25).
Постройте Вашу модель с помощью кнопки панели инструментов Построить модель (при этом в рабочей области AnyLogic
должен быть выбран какой-то элемент именно этой модели). Если
в модели есть какие-нибудь ошибки, то построение не будет завершено, и в панель Ошибки будет выведена информация об ошибках,
обнаруженных в модели. Двойным щелчком мыши по ошибке в
этом списке Вы можете перейти к предполагаемому месту ошибки,
чтобы исправить ее.
Панель Ошибки
После того, как Вы исправите все ошибки и успешно построите
Вашу модель, Вы можете ее запустить (рис. 2.26). Запустите модель.
Щелкните мышью по кнопке панели инструментов Запустить и выберите из открывшегося списка эксперимент, который
Вы хотите запустить. Эксперимент этой модели будет называться Ophthalmology Department/Simulation.
Рис. 2.25
66
Рис. 2.26
В дальнейшем по нажатию на кнопку Запустить
(или по нажатию F5) будет запускаться тот эксперимент, который запускался Вами в последний раз. Чтобы выбрать какой-то другой эксперимент, Вам будет нужно щелкнуть мышью по стрелке, находящейся
в правой части кнопки Запустить
и выбрать нужный Вам эксперимент из открывшегося списка (или щелкнуть правой кнопкой
мыши по этому эксперименту в панели Проекты и выбрать Запустить из контекстного меню).
Запустив модель, Вы увидите окно презентации этой модели.
В нем будет отображена презентация запущенного эксперимента.
AnyLogic автоматически помещает на презентацию каждого простого эксперимента заголовок и кнопку, позволяющую запустить
модель и перейти на презентацию, нарисованную Вами для главного класса активного объекта этого эксперимента (Main).
Щелкните по этой кнопке. Тем самым Вы запустите модель и
перейдете к презентации корневого класса активного объекта запущенного эксперимента.
Вы увидите, что поведение модели совпадает с ожидаемым: пациенты прибывают в приемный покой, затем проходят в процедурную, которую они покидают после прохождения процедуры.
При желании Вы можете изменить скорость выполнения модели с помощью кнопок панели управления окна презентации Замедлить и Ускорить
.
Шаг 7. Занятие процедурной комнаты.
На данный момент все пациенты осматриваются только в первой
процедурной комнате. Более того, несколько пациентов осматриваются в одной комнате одновременно. Сейчас мы улучшим нашу
модель, задав процедурные комнаты статическими ресурсами. Пациенты будут теперь осматриваться в любой из трех процедурных
67
Рис. 2.27
комнат. На время проведения процедуры комната будет занята,
так что никто другой не сможет быть осмотрен в ней в то же время.
Измените диаграмму процесса.
Добавьте в диаграмму процесса объект NetworkSeize. Объект
NetworkSeize занимает (захватывает) для заявки заданное количество сетевых ресурсов. Мы добавляем этот объект для того, чтобы
смоделировать то, как пациент занимает процедурную комнату (заданную в нашей модели статическим ресурсом) (рис. 2.27).
Задайте следующие свойства объекта:
В поле Список ресурсов {pool1,...} введите список ресурсов, которые мы хотим занять с помощью этого блока. Список составляется следующим образом: Вы перечисляете имена объектов типа
NetworkResourcePool, которые задают те ресурсы, которые будут
захватываться данным блоком. Имена объектов пишутся через запятую, а весь список заключается в фигурные скобки. Поскольку
нам нужно, чтобы этот блок занимал одну процедурную комнату,
напишите здесь {procRooms}. Если Вам нужно захватить несколько
ресурсов одного типа, то Вам нужно будет написать имя задающего
эти ресурсы объекта столько раз, сколько ресурсов Вы хотите захватить (рис. 2.28).
Измените свойства объекта moveToProcRoom. Мы хотим, чтобы
этот блок перемещал пациентов не в первую процедурную комнату,
а в ту комнату, которая была ранее выделена для этого пациента.
Задайте следующие свойства объекта:
68
Укажите место, в которое этот блок будет перемещать пациентов. Поскольку нам нужно, чтобы пациенты переходили в занятую
комнату (которая задана в нашей модели в виде статического ресурса), то выберите в параметре Отсылать ресурсы опцию К захваченному ресурсу.
Укажите имя захваченного ресурса, к которому будут перемещаться пациенты. Введите procRooms в поле Ресурс. Здесь
procRooms – это имя нашего объекта NetworkResourcePool, задающего статические ресурсы – процедурные комнаты (рис. 2.29).
Добавьте в диаграмму процесса объект NetworkRelease. Этот
объект освобождает ранее захваченные сетевые ресурсы. С помо-
Рис. 2.28
Рис. 2.29
69
щью этого блока мы будем освобождать процедурные комнаты после проведения офтальмоскопии для того, чтобы там смогли быть
осмотрены и другие пациенты. Иначе после того, как будет промоделирован осмотр трех пациентов, последующие пациенты не смогут быть осмотрены в силу того, что все наши ресурсы – процедурные комнаты, будут заняты и недоступны (рис. 2.30).
Задайте следующие свойства объекта:
Нам нужно указать, какие ресурсы должен освобождать этот
блок. На данный момент мы можем просто выбрать опцию Все захваченные ресурсы (рис. 2.31).
Запустите модель. Теперь пациенты осматриваются в любой из
трех процедурных комнат. На время проведения процедуры комната считается занятой, так что никто другой не может быть осмотрен
в ней в то же время.
Шаг 8. Моделирование вызова врача.
Теперь мы закончим создание нашей модели, промоделировав
вызов офтальмолога для проведения процедуры офтальмоскопии.
По пути к пациенту, ожидающему в приемном покое, офтальмолог
забирает офтальмоскоп из комнаты хранения оборудования. Затем
он сопровождает пациента в свободную (и занятую ранее для этого
пациента) процедурную комнату. Там он проводит осмотр пациента, после чего относит офтальмоскоп в комнату хранения и возвращается в ординаторскую, а пациент покидает отделение.
Рис. 2.30
70
Рис. 2.31
Измените диаграмму процесса.
Измените свойства объекта networkSeize. С помощью этого объекта мы хотим моделировать вызов доктора (с точки зрения сетевых
ресурсов этот блок должен теперь захватывать помимо статического ресурса процедурной комнаты еще и движущийся ресурс типа
«врач» и переносной типа «офтальмоскоп»). Введите {procRooms,
doctors, scopes} в поле Список ресурсов {pool1,...}. Теперь этот
блок будет захватывать не один, а три ресурса трех разных типов
(рис. 2.32).
Рис. 2.32
71
Измените диаграмму процесса. Вставьте новые объекты, как показано на рис. 2.33.
Измените свойства первого добавленного нами объекта типа
NetworkSendTo (названного на рисунке с диаграммой процесса
sendToStorage). Объект NetworkSendTo направляет (перемещает)
сетевые ресурсы из их текущего местоположения в другое место
сети, указанное пользователем. В нашем случае мы хотим отослать
захваченные ресурсы (а именно – врача, поскольку другие занятые
для этого пациента ресурсы сами перемещаться не могут) в комнату хранения оборудования для того, чтобы взять там свой офтальмоскоп (тот, который был ранее занят этим пациентом с помощью
объекта networkSeize). Задайте следующие свойства объекта:
Назовите объект sendToStorage (рис. 2.34).
Рис. 2.33
Рис. 2.34
72
В поле Список ресурсов {pool1,...} укажите, какие именно ресурсы Вы хотите перемещать с помощью этого блока. Введите здесь
{doctors}.
Выберите опцию К захваченному ресурсу, чтобы ресурсы перемещались к захваченному ранее ресурсу (в нашем случае – офтальмоскопу).
Укажите имя ресурса, к которому будут перемещаться ресурсы.
Введите в поле Ресурс имя объекта, задающего ресурс типа «офтальмоскоп»: scopes.
Измените свойства следующего объекта типа NetworkSendTo,
названного на рис. 2.35 с диаграммой процесса sendToPatient). Этот
блок моделирует перемещение врача с офтальмоскопом к пациенту,
ждущему в приемном покое. Задайте следующие свойства объекта:
Назовите объект sendToPatient.
Задайте список ресурсов, которые этот объект будет перемещать. Введите {doctors, scopes} в поле Список ресурсов {pool1,...}.
В параметре Отсылать ресурсы выберите опцию К заявке. Тем
самым мы задаем в качестве адреса движения ресурсов местоположение занявшей их заявки.
Измените, свойства объекта NetworkAttach. Этот блок присоединяет указанные сетевые ресурса (из числа ранее захваченных заявкой) к этой заявке. В результате присоединения они будет перемещаться вместе с заявкой (сопровождать ее в виде «эскорта») до
тех пор, пока они не будут отсоединены от этой заявки или освобождены. Вы можете присоединять к заявке только те ресурсы, которые в текущий момент захвачены этой заявкой и находятся в том
же самом узле сети, где и она. С помощью этого блока мы присоединим ресурсы врача и офтальмоскопа к заявке-пациенту, так что
Рис. 2.35
73
при перемещении пациента в процедурную комнату перемещаться
будут все вместе. Задайте следующие свойства объекта:
В параметре Присоединять выберите опцию Все захваченные ресурсы в месте нахождения заявки (рис. 2.36). Блок NetworkAttach
позволяет присоединять к заявки не только все, но и определенные
выборочные ресурсы – в этом случае Вам было бы нужно выбрать
опцию Заданные ресурсы и указать их в расположенном ниже поле
Список ресурсов {pool1,...}.
Измените, свойства объекта NetworkDetach. Этот блок отсоединяет от заявки, ранее захваченные и присоединенные нестатические сетевые ресурсы. Отсоединенные ресурсы будут по-прежнему
захвачены заявкой, но уже не будут следовать вместе с ней при ее
перемещении в другие узлы сети. Нам нужен этот блок для того,
чтобы после проведения процедуры офтальмоскопии пациент мог
покинуть отделение, а врач мог отнести офтальмоскоп на место и
перейти к осмотру следующего пациента или вернуться в ординаторскую. Задайте следующие свойства объекта:
Выберите опцию Все присоединенные ресурсы (рис. 2.37).
Рис. 2.36
Рис. 2.37
74
Рис. 2.38
Измените, свойства последнего добавленного нами в диаграмму
процесса объекта типа NetworkSendTo. С помощью этого блока мы
хотим промоделировать то, как врач возвращает офтальмоскоп в
комнату хранения инструментов после проведения процедуры осмотра пациента. Задайте следующие свойства объекта:
Назовите объект returnScope (рис. 2.38).
Задайте список ресурсов, которые этот объект будет перемещать. Введите {doctors, scopes} в поле Список ресурсов {pool1,...}.
В параметре Отсылать ресурсы выберите опцию В заданный узел.
Укажите имя узла, куда будут перемещаться ресурсы. Введите
storageRoom в поле Узел.
Мы закончили создание простейшей модели отделения офтальмологии. Запустите модель. Теперь Вы можете увидеть, что для
проведения офтальмоскопии вызывается врач вместе с офтальмоскопом.
Вопросы для самопроверки
1. Возможно ли использование нескольких ресурсов разных типов одним сервисом?
2. Как можно менять количество доступных ресурсов определенного типа?
3. Какое состояние является начальным в диаграмме состояний
устройства?
75
3. МОДЕЛЬ РАСПРОСТРАНЕНИЯ ПРОДУКТА
ПО БАССУ
AnyLogic поддерживает различные подходы моделирования.
В этом документе описывается системно-динамический подход моделирования, успешно применяемый во многих сферах, в том числе для описания социальных, урбанистических, экологических,
бизнес систем. AnyLogic позволяет создавать комплексные динамические модели, используя стандартную графическую нотацию
системной динамики.
Это учебное пособие кратко ознакомит Вас с процессом создания
имитационной модели в AnyLogic. Его целью является ознакомление с интерфейсом и основными возможностями AnyLogic. Мы
создадим простой и наглядный пример – модель распространения
нового продукта по Бассу. Вначале мы создадим классическую модель распространения инноваций Басса. Затем мы расширим нашу
модель, добавив некоторые детали и продемонстрировав усовершенствованные возможности AnyLogic.
Модель Басса описывает процесс распространения продукта. Изначально продукт никому не известен, и для того, чтобы люди начали
его приобретать, он рекламируется. В итоге определенная часть людей
приобретает продукт под воздействием рекламы. Также люди приобретают продукт в результате общения с теми, кто этот продукт уже
приобрел. Процесс приобретения нового продукта под влиянием убеждения его владельцев чем-то похож на распространение эпидемии.
Шаг 0. Анализ модели.
Вначале мы должны проанализировать нашу модель, чтобы решить, как ее можно описать в терминах системной динамики. Мы
должны определить ключевые переменные модели и то, как они
влияют друг на друга, а затем создать потоковую диаграмму модели. При создании потоковой диаграммы мы должны учесть, какие
переменные должны быть представлены накопителями, какие потоками, а какие – вспомогательными переменными.
Накопители (также называемые уровнями или фондами) представляют собой такие объекты реального мира, в которых сосредотачиваются некоторые ресурсы; их значения изменяются непрерывно. Потоки – это активные компоненты системы, они изменяют
значения накопителей. В свою очередь, накопители системы определяют значения потоков. Вспомогательные переменные помогают
преобразовывать одни числовые значения в другие; они могут произвольно изменять свои значения или быть константами.
76
При создании потоковой диаграммы выявите переменные, которые накапливают значения с течением времени. В нашей модели
численности потребителей и потенциальных потребителей продукта являются накопителями, а процесс приобретения продукта – потоком. Системно-динамическое представление нашей модели показано
на рис. 3.1. Накопители обозначаются прямоугольниками, поток –
вентилем, а вспомогательные переменные – кружками. Стрелки
обозначают причинно-следственные зависимости в модели.
Шаг 1. Создание новой модели.
Вначале мы создадим новую модель.
Создайте новую модель.
Щелкните мышью по кнопке панели инструментов Создать .
Появится диалоговое окно Новая модель.
Задайте имя новой модели. В поле Имя модели введите Bass
Diffusion.
Выберите каталог, в котором будут сохранены файлы модели.
Если Вы хотите сменить предложенный по умолчанию каталог на
какой-то другой, Вы можете ввести путь к нему в поле Местоположение или выбрать этот каталог с помощью диалога навигации по
файловой системе, открывающегося по нажатию на кнопку Выбрать.
Рис. 3.1
77
Щелкните мышью по кнопке Далее. Откроется вторая страница
Мастера создания модели.
Здесь Вам будет предложено выбрать шаблон модели, на базе
которого Вы будете разрабатывать Вашу модель. Поскольку мы
хотим создать новую модель «с нуля», подробно объяснив Вам все
шаги создания модели системной динамики в AnyLogic, оставьте флажок Использовать шаблон модели сброшенным и завершите
процесс создания модели, щелкнув мышью по кнопке Готово.
Вы создали новую модель. Если Вы еще не знакомы с пользовательским интерфейсом AnyLogic, то давайте уделим пару минут основным его компонентам:
Пользовательский интерфейс AnyLogic.
В левой части рабочей области находится панель Проекты. Панель Проекты обеспечивает легкую навигацию по элементам моделей, открытым в текущий момент времени. Поскольку модель организована иерархически, то она отображается в виде дерева: сама
модель образует верхний уровень дерева; эксперименты, классы
активных объектов и Java классы образуют следующий уровень;
элементы, входящие в состав активных объектов, вложены в соответствующую подветвь дерева класса активного объекта и т. д.
В правой части рабочей области отображается панель Палитра,
а внизу – панель Свойства. Панель Палитра содержит разделенные
по категориям элементы, которые могут быть добавлены на графическую диаграмму класса активного объекта или эксперимента.
Панель Свойства используется для просмотра и изменения свойств
выбранного в данный момент элемента (или элементов) модели.
В центре рабочей области AnyLogic Вы увидите графический редактор диаграммы класса активного объекта Main. При работе с моделью не забывайте сохранять производимые
Вами изменения с помощью кнопки панели инструментов Сохранить .
Шаг 2. Создание накопителей.
Давайте начнем создание диаграммы накопителей и потоков.
И начнем мы с создания накопителей. В нашей модели их два –
они моделируют численности потребителей и потенциальных потребителей продукта. Накопитель в AnyLogic задается с помощью
одноименной переменной.
Создайте накопитель для моделирования численности потенциальных потребителей.
Вначале откройте закладку Системная динамика панели Палитра. Чтобы открыть какую-либо закладку панели Палитра (имену78
емую в дальнейшем палитрой), нужно щелкнуть мышью по заголовку этой палитры (рис. 3.2). Перетащите элемент Накопитель
из палитры Системная динамика на диаграмму класса активного объекта. На диаграмме появится маленький голубой прямоугольник, обозначающий переменную-накопитель (что соответствует классической нотации системной динамики).
Когда Вы добавите элемент на диаграмму, он будет выделен, и
его свойства будут отображены в панели Свойства. Здесь Вы можете изменить свойства элемента в соответствии с Вашими требованиями. Обратите внимание, что панель Свойства является контекстно-зависимой – она отображает свойства выделенного в текущий
момент элемента. Поэтому позднее для изменения свойств элемента нужно будет предварительно щелчком мыши выделить его в графическом редакторе или в панели Проекты (рис. 3.3).
Чтобы у Вас всегда была уверенность в том, что в текущий момент в рабочем пространстве выбран именно нужный Вам элемент,
и именно его свойства Вы редактируете в панели Свойства, обращайте внимание на первую строку, показываемую в панели Свойства – в ней отображается имя выбранного в текущий момент времени элемента и его тип – в приведенном на рис. 3.4 примере это
stock и Накопитель соответственно. Рис. 3.2
Рис. 3.3
Рис. 3.4
79
Панель Свойства. На рис. 3.4 в панели отображаются свойства
выделенного накопителя.
В поле Имя введите новое имя накопителя: PotentialAdopters.
Немного увеличьте размер значка накопителя. Для этого выделите его щелчком мыши в графическом редакторе и перетащите в
сторону появившийся в нижнем правом углу значка маркер.
Создайте накопитель для моделирования численности потребителей.
Аналогично создайте еще один накопитель.
Чтобы создать накопитель такого же размера, проще всего склонировать существующий накопитель, перетащив его мышью с нажатой клавишей Ctrl (при этом свойства нового элемента будут
теми же, что и у клонированного, но в данном случае это не важно, поскольку мы изменили только одно свойство накопителя – его
имя). Поместите новый накопитель справа от накопителя PotentialAdopters, как показано на приведенном рис. 3.5.
Назовите его Adopters.
На данный момент задание накопителей еще полностью не закончено. Позднее мы зададим начальные значения накопителей,
а также интегральные формулы, согласно которым будут вычисляться их значения. Но вначале нам нужно создать поток приобретения продукта.
Шаг 3. Добавление потока продаж продукта.
Мы уже создали в нашей модели два накопителя, моделирующие численности потенциальных потребителей и потребителей
продукта. Теперь пришло время задать потоки. В нашей простейшей модели есть только один поток – поток продаж продукта, увеличивающий число потребителей продукта и уменьшающий численность потенциальных потребителей. В AnyLogic поток задается переменной поток. Значение потока
вычисляется в соответствии с заданной формулой.
Добавьте поток, ведущий из накопителя PotentialAdopters в
накопитель Adopters.
Рис. 3.5
80
Сделайте двойной щелчок мышью по накопителю, из которого поток вытекает (PotentialAdopters), а затем щелкните по тому
накопителю, в который он втекает (Adopters).
AnyLogic создаст новый поток и сделает его исходящим потоком
для накопителя PotentialAdopters и входящим – для Adopters. Поток отображается в виде стрелки со значком вентиля посередине.
Стрелка показывает направление потока – в данном случае поток
будет уменьшать значение накопителя PotentialAdopters и увеличивать значение Adopters (рис. 3.6).
Выделите стрелку созданного потока в графическом редакторе и
измените имя потока на AdoptionRate (рис. 3.7).
В результате диаграмма потоков и накопителей должна будет
выглядеть следующим образом:
Можете теперь взглянуть на свойства накопителей. Формулы
накопителей должны выглядеть следующим образом (рис. 3.8).
Рис. 3.6
Рис. 3.7
Рис. 3.8
81
Эти формулы были автоматически заданы при добавлении потока. Значения входящих потоков, т. е. потоков, которые увеличивают значение накопителя, прибавляются, а значения исходящих
потоков, уменьшающих значение накопителя, вычитаются из текущего значения накопителя.
Формулу, согласно которой будет вычисляться значение потока, мы зададим чуть позднее.
Шаг 4. Задание констант.
Теперь мы зададим константы нашей модели с помощью параметров.
Создайте константу, задающую общую численность населения.
Перетащите элемент Параметр
из палитры Системная динамика на диаграмму класса активного объекта.
На странице Основные панели Свойства задайте свойства этого
параметра.
Измените имя параметра. Введите TotalPopulation в поле Имя.
В поле Значение по умолчанию введите 100000. Пусть общая
численность населения в нашей модели будет именно такой.
Вы можете задать краткое описание параметра на странице
свойств Описание. Введите текст, который поможет объяснить
смысл константы тем, кто в дальнейшем будет работать с этой моделью.
Частота, с которой потенциальные потребители общаются с потребителями, в нашей модели будет постоянной величиной. Поэтому мы зададим частоту контактов константой.
Создайте константу ContactRate, задающую общую численность населения.
Аналогично создайте еще одну константу. Задайте Имя ContactRate.
Предположим, что каждый человек в среднем встречается со
100 людьми в год. Введите в поле Значение по умолчанию 100.
В этой модели интенсивность рекламы и вероятность того, что
продукт будет приобретен под ее влиянием, полагаются постоянными. Поэтому мы зададим эффективность рекламы константой.
Эффективность рекламы определяет, какая доля людей купит продукт вследствие ее влияния.
Создайте константу AdEffectiveness, задающую эффективность рекламы.
Создайте еще одну константу и назовите ее AdEffectiveness.
Задайте значение по умолчанию 0.011.
82
Задайте константой силу убеждения владельцев продукта, определяющую ту долю контактов, которая приводит к продажам продукта.
Создайте константу AdoptionFraction. Создайте еще одну константу и назовите ее AdoptionFraction
(рис. 3.9).
Задайте значение по умолчанию 0.015.
Шаг 5. Задание начальных значений накопителей.
Теперь мы можем задать начальные значения накопителей.
Мы хотим задать общую численность людей в нашей модели (заданную параметром TotalPopulation) в качестве начального значения накопителя PotentialAdopters.
Когда Вы указываете какой-либо элемент в выражении начального значения накопителя, Вы должны вначале соединить этот
элемент с накопителем с помощью связи. Связь позволяет явно задавать существующие зависимости между элементами диаграммы
потоков и накопителей.
 Чтобы задать связь сделайте двойной щелчок по элементу Связь
палитры Системная динамика. Значок элемента при
этом должен измениться на следующий: .
Сразу после этого, щелкните в графическом редакторе по элементу, который упоминается в выражении начального значения (TotalPopulation).
Затем щелкните по накопителю PotentialAdopters, к которому
должна следовать создаваемая связь зависимости.
Рис. 3.9
83
Обратите внимание, что нужно всегда рисовать связи именно
в таком направлении – от независимой переменной к зависимой
(рис. 3.10). Теперь, когда мы создали связь, можно задать начальное значение накопителя, сославшись в нем на параметр TotalPopulation.
Задайте начальное количество потенциальных потребителей
продукта.
В графическом редакторе или в панели Проекты выделите накопитель PotentialAdopters щелчком мыши.
На странице Основные панели Свойства введите TotalPopulation
в поле Начальное значение. Чтобы не печатать полностью имена
функций и переменных в формулах, можете воспользоваться Мастером подстановки кода. Чтобы открыть Мастер, щелкните мышью в том месте поля (в нашем случае – поля Начальное значение,
куда Вы хотите поместить имя, а затем нажмите Ctrl+пробел (Mac
OS: Alt+пробел).
Появится окно Мастера подстановки кода, перечисляющего переменные модели и функции, доступные в текущем конексте. Прокрутите список к имени, которое Вы хотите вставить, или введите
первые буквы имени, пока оно не будет выделено в списке. Двойным
щелчком мыши по имени добавьте его в поле формулы (рис. 3.11).
В результате в поле Начальное значение должно быть добавлено
имя параметра TotalPopulation, значение которого и будет определять начальное значение этого накопителя (начальную численность потенциальных покупателей продукта) (рис. 3.12).
Рис. 3.10
84
Рис. 3.11
Рис. 3.12
Начальное значение накопителя Adopters, моделирующего потребителей продукта, задавать не нужно, поскольку изначально
число потребителей равно нулю, а накопитель по умолчанию и так
инициализируется нулем.
85
Теперь мы закончили задание накопителей. Нам осталось добавить на диаграмму потоков и накопителей вспомогательные переменные – и модель будет готова.
Шаг 6. Создание вспомогательных переменных.
Нам нужно создать две вспомогательные переменные, которые
будут соответствовать двум составляющим потока приобретения
продукта:
Приобретениям, совершенным под влиянием рекламы.
Приобретениям, совершенным под влиянием общения потребителей продукта с потенциальными потребителями.
Создайте вспомогательную переменную AdoptionFromAd.
Перетащите элемент Вспомогательная переменная из палитры Системная динамика на диаграмму класса активного объекта.
На странице Основные панели Свойства введите новое Имя переменной: AdoptionFromAd (рис. 3.13).
Теперь мы хотим задать формулу для этой вспомогательной переменной. Влияние рекламы моделируется следующим образом:
некий постоянный процент потенциальных клиентов AdEffectiveness всё время становятся клиентами. Их доля в AdoptionRate
равна, соответственно, PotentialAdopters*AdEffectiveness.
Опять, как и в случае составления выражения начального значения накопителя, когда какая-либо переменная задействована в
формуле вспомогательной переменной или потока, между этими
переменными должна существовать связь. Добавьте связи от двух переменных к зависимой от них
AdoptionFromAd (рис. 3.14).
Добавьте связи, ведущие от AdEffectiveness и PotentialAdopters
к AdoptionFromAd.
Рис. 3.13
86
Рис. 3.14
Вы можете изменить внешний вид связи (а именно – радиус ее
выпуклости), перетащив мышью маркер, находящийся посередине
связи (чтобы он стал виден, связь вначале надо выделить щелчком
мыши). Пусть связь выглядит, как на приведенном рис. 3.15.
Вы могли заметить, что эта связь выглядит немного иначе, чем
та, что ведет от TotalPopulation к PotentialAdopters. Связи с переменными, упоминающимися в начальных значениях накопителей,
рисуются пунктирными линиями, в то время, как все остальные –
сплошными. Добавьте еще одну связь, ведущую от AdEffectiveness к AdoptionFromAd (рис. 3.16).
Задайте формулу, согласно которой будет вычисляться значение переменной. В свойствах переменной AdoptionFromAd, в поле
AdoptionFromAd = введите: AdEffectiveness*PotentialAdopters (Вы
можете воспользоваться Мастером подстановки кода) (рис. 3.17).
Для тех, кто не знаком с классической моделью Диффузии по
Бассу, давайте попробуем самостоятельно составить формулу интенсивности продаж продукта под влиянием устного общения потребителей продукта с теми, кто данный продукт еще не приобрел.
Мы делаем предположение, что в нашей модели человек может
общаться с любым другим человеком.
Количество контактов человека в единицу времени (а под единицей времени в нашей модели подразумевается год) задается па-
Рис. 3.15
Рис. 3.16
87
Рис. 3.17
раметром ContactRate. Запишем ContactRate в качестве первого сомножителя нашей формулы.
Количество людей, которые владеют продуктом, и могут убеждать остальных приобрести его, в нашей модели в каждый момент
времени будет определяться значением накопителя Adopters, и поскольку каждый потребитель будет общаться в единицу времени с
ContactRate людей, то количество контактов в единицу времени у
всех потребителей продукта будет равно Adopters*ContactRate. Теперь нужно учесть тот факт, что в результате общения не все
те, кто еще не купил этот продукт, сразу побегут его покупать, если
кого-то доводы своего знакомого, успешно пользующегося изучаемым нами продуктом, могут убедить, то кто-то может остаться к
ним равнодушным, и своего решения не покупать продукт не изменить. Поэтому мы добавим в нашу формулу еще один сомножитель
AdoptionFraction, задающий силу убеждения владельцев продукта, определяющую ту долю контактов, которая приводит к продажам продукта. Таким образом, наша формула приобретает вид Ado
pters*ContactRate*AdoptionFraction.
И наконец, нам нужно учесть, что на данный момент наша формула не учитывает того, что владельцы продукта будут общаться
как с потенциальными потребителями, так и с теми, кто уже владеет продуктом. И общение с последними ни к каким новым продажам продукта не приведет. Поэтому нам нужно учесть в нашей
формуле и вероятность того, что тот, с кем общался потребитель,
ещё не владеет интересующим нас продуктом. Эта вероятность задается так: PotentialAdopters/TotalPopulation.
88
В итоге наша формула будет выглядеть следующим образом:
Adopters*ContactRate*AdoptionFraction*PotentialAdopters/
TotalPopulation. Именно столько потенциальных потребителей будут приобретать продукт в единицу модельного времени под воздействием общения с владельцами этого продукта.
Создайте вспомогательную переменную AdoptionFromWOM.
Аналогично создайте еще одну вспомогательную переменную.
Назовите ее AdoptionFromWOM.
Задайте для этой переменной следующую формулу: ContactRate
* AdoptionFraction * PotentialAdopters * Adopters / TotalPopulation.
Вам может показаться утомительным рисовать связи для задействованных в формулах переменных и параметров. Чтобы облегчить этот процесс, AnyLogic предлагает пользователям механизм
быстрого исправления ошибок, связанных с отсутствующими или
избыточными связями. Когда Вы зададите указанную формулу, то
щелкнув в этом поле Вы увидите индикатор ошибки (рис. 3.18).
Щелкните мышью по индикатору. Вы увидите контекстное
меню, состоящее из пунктов Добавить отсутствующую связь
для:.... Поочередно щелкнув по всем этим пунктам Вы добавите на
диаграмму все недостающие связи.
В итоге у Вас должна будет получиться диаграмма следующего
вида (рис. 3.19).
Теперь мы можем задать формулу для потока приобретения продукта. Значение потока определяется суммой двух его независимых составляющих – продаж в результате рекламного влияния и
продаж под влиянием общения с потребителями продукта.
Рис. 3.18
89
Рис. 3.19
Задайте формулу потока.
Выделите поток AdoptionRate щелчком мыши.
Перейдите на страницу Основные панели Свойства.
Введите правую часть формулы, по которой будет вычисляться значение потока, в поле AdoptionRate=: AdoptionFromAd +
AdoptionFromWOM
Добавьте соответствующие связи от этих переменных к потоку
AdoptionRate (рис. 3.20).
Теперь мы закончили создание нашей модели. Диаграмма накопителей и потоков должна выглядеть как на приведенном рис. 3.21.
Рис. 3.20
90
Рис. 3.21
Связи имеют полярность, положительную или отрицательную.
Положительная связь означает, что два элемента системной динамики изменяют свои значения в одном направлении, т. е. если
значение элемента, из которого направлена связь, уменьшается,
значение другого элемента уменьшается тоже. Аналогично, если
увеличивается значение одного элемента, то и значение зависимого
от него элемента увеличивается тоже.
Отрицательная связь означает, что два элемента системной динамики изменяют свои значения в противоположных направлениях, т. е. если значение элемента, из которого направлена связь,
уменьшается, то значение другого элемента увеличивается, и наоборот.
Вы можете добавить рядом со связями метки, которые будут обозначать полярность этих связей. Обычно полярность обозначается
с помощью символов +/- рядом со стрелкой связи. Таким образом,
Вы можете показать, как зависимая переменная изменяет свое значение при изменении значения независимой переменной.
Проставьте полярности у связей.
Чтобы отобразить у связи значок полярности, выделите связь и
выберите нужный символ (+ или -) из группы кнопок Полярность
на странице свойств связи:
Здесь же при желании можно изменить и цвет линии связи, а
также ее толщину (рис. 3.22).
91
Рис. 3.22
В нашей модели все связи, за исключением той, что ведет от
TotalPopulation к AdoptionFromWOM, имеют положительную полярность.
Можно увидеть, что наша модель содержит два цикла с обратной
связью: один компенсирующий и один усиливающий.
Компенсирующий цикл с обратной связью воздействует на поток приобретения продукта, вызванный рекламой. Поток приобретения продукта сокращает число потенциальных потребителей,
что в свою очередь приводит к снижению интенсивности приобретения продукта (рис. 3.23).
Усиливающий цикл с обратной связью воздействует на поток
приобретения продукта, вызванный общением с потребителями
продукта. Поток приобретения продукта увеличивает численность
потребителей продукта, что приводит к росту интенсивности приобретения продукта под влиянием общения с потребителями продукта, и, следовательно, к росту интенсивности приобретения продукта (рис. 3.24).
Добавьте идентификатор цикла, вызывающего насыщение
рынка.
Перетащите элемент Цикл
из палитры Системная динамика
на графическую диаграмму, как показано на рис. 3.25.
Рис. 3.23
92
Рис. 3.24
Рис. 3.25
Перейдите на страницу Основные панели Свойства, чтобы изменить свойства цикла.
Задайте Направление цикла – этот цикл направлен Против часовой стрелки.
В поле Текст введите краткое описание этого цикла, объясняющее его смысл: Market Saturation (или Насыщение рынка). Этот
текст будет показан на презентации.
Из группы кнопок Тип выберите символ, который будет отображаться для данного цикла. Выберите символ B (обозначающий
Balancing, т. е. компенсирующий цикл).
Чтобы определить, является ли цикл усиливающим или уравновешивающим, Вы можете начать с предположения, что, например
значение переменной А увеличивается, и проследить за изменением значений входящих в цикл переменных. Цикл является:
усиливающим, если после прохождения по циклу Вы видите
тот же результат, что был допущен при начальном предположении
(в нашем случае – увеличение значения).
уравновешивающим или компенсирующим, если результат противоречит начальному предположению.
Добавьте идентификатор для цикла, задающего общение людей друг с другом.
Добавьте еще один идентификатор цикла, как показано на
рис. 3.26.
Этот цикл соответствует общению людей друг с другом. Он является усиливающим, поэтому выберите для него символ R (обозначающий усиливающий, Reinforcing цикл) .
Задайте Word of Mouth (или Устное общение) в качестве текста.
Задайте Направление цикла – этот цикл направлен По часовой
стрелке.
93
Рис. 3.26
В итоге Ваша диаграмма должна выглядеть следующим образом
(рис. 3.27).
Шаг 7. Настройка запуска модели.
Вы можете сконфигурировать выполнение модели в соответствии с Вашими требованиями. Модель выполняется в соответствии с набором установок, задаваемым специальным элементом
модели – экспериментом. Вы можете создать несколько экспериментов с различными установками и изменять рабочую конфигурацию модели, просто запуская тот или иной эксперимент модели. В панели Проекты эксперименты отображаются в нижней части
дерева модели. Один эксперимент, названный Simulation, созда-
Рис. 3.27
94
ется по умолчанию. Это простой эксперимент, позволяющий запускать модель с заданными значениями параметров, поддерживающий режимы виртуального и реального времени, анимацию и
отладку модели.
Существуют также и другие типы экспериментов (оптимизационный эксперимент, эксперимент для оценки рисков, эксперимент
для варьирования параметров), которые используются в тех случаях, когда параметры модели играют существенную роль, и требуется проанализировать, как они влияют на поведение модели, или
когда нужно найти оптимальные значения параметров модели.
Если мы сейчас запустим модель, то она будет моделироваться
бесконечно, пока мы сами не остановим ее выполнение. Поскольку
мы хотим наблюдать поведение модели только тогда, когда происходит процесс распространения продукта, нам нужно остановить
модель, когда система придет в точку равновесия. Процесс распространения продукта в этой модели длится примерно 8 лет.
Задайте остановку модели по прошествии 8 единиц модельного времени.
В панели Проекты, выделите эксперимент Simulation:Main
щелчком мыши.
На странице Модельное время панели Свойства, выберите В заданное время из выпадающего списка Остановить. В расположенном ниже поле введите 8. Модель остановится после того, как истекут 8 единиц модельного времени.
Перед тем, как запустить модель, давайте выберем режим ее
выполнения. Модель AnyLogic может выполняться либо в режиме
виртуального, либо в режиме реального времени. В режиме виртуального времени модель выполняется без привязки к физическому
времени – она просто выполняется настолько быстро, насколько
это возможно. Этот режим лучше всего подходит в том случае, когда требуется моделировать работу системы в течение достаточно
длительного периода времени. В режиме реального времени задается связь модельного времени с физическим, т. е. задается количество единиц модельного времени, выполняемых в одну секунду.
Это часто требуется, когда Вы хотите, чтобы анимация модели отображалась с той же скоростью, что и в реальной жизни.
Задайте выполнение модели в режиме реального времени.
В панели Проекты, выделите эксперимент Simulation:Main
щелчком мыши.
На странице Презентация панели Свойства, перейдите в раздел Режим выполнения и выберите опцию Реальное время со скоростью.
95
Рис. 3.28
Задайте скорость выполнения модели, т.e., сколько единиц
модельного времени будет соответствовать одной секунде реального времени. Выберите в выпадающем списке справа, скажем, 2
(рис. 3.28).
И давайте теперь изменим еще одно свойство, но уже не эксперимента, а модели.
Во время моделирования мы будем изучать значения наших переменных и просматривать графики, демонстрирующие, как менялись их значения по ходу моделирования.
Для этого нам даже не понадобится добавлять и конфигурировать диаграммы – мы воспользуемся специальной возможностью
AnyLogic – окнами инспекта. Дело в том, что AnyLogic автоматически запоминает значения, принимаемые динамическими переменными по ходу моделирования, в специально создаваемых для
этого наборах данных. И значения этих наборов данных можно
легко просмотреть в окнах инспекта, которые доступны в режиме
запуска модели.
Все, что мы хотим изменить – это увеличить частоту сбора таких
данных. По умолчанию новые значения переменных добавляются
в наборы данных каждую единицу модельного времени. Мы же хотим, чтобы данные собирались, скажем, в 10 раз чаще.
Увеличьте частоту сбора данных для динамических переменных.
В панели Проекты, сделайте двойной щелчок по элементу Main.
Перейдите на страницу Дополнительные панели Свойства, промотайте ее вниз с помощью расположенного справа бегунка, и введите 0.1 в поле Период (рис. 3.29).
Шаг 8. Запуск модели.
Постройте Вашу модель с помощью кнопки панели инструментов Построить модель
(при этом в рабочей области AnyLogic
96
Рис. 3.29
Рис. 3.30
должен быть выбран какой-то элемент именно этой модели). Если
в модели есть какие-нибудь ошибки, то построение не будет завершено, и в панель Ошибки будет выведена информация об ошибках,
обнаруженных в модели. Двойным щелчком мыши по ошибке в
этом списке Вы можете перейти к предполагаемому месту ошибки,
чтобы исправить ее (рис. 3.30).
Панель Ошибки
После того, как Вы исправите все ошибки и успешно построите
Вашу модель, Вы можете ее запустить. Запустите модель.
Щелкните мышью по кнопке панели инструментов Запустить
и выберите из открывшегося списка эксперимент, который Вы
хотите запустить. Эксперимент этой модели будет называться Bass
Diffusion/Simulation (рис. 3.31).
97
Рис. 3.31
В дальнейшем по нажатию на кнопку Запустить
(или по нажатию F5) будет запускаться тот эксперимент, который запускался Вами в последний раз. Чтобы выбрать какой-то другой эксперимент, Вам будет нужно щелкнуть мышью по стрелке, находящейся
в правой части кнопки Запустить
и выбрать нужный Вам эксперимент из открывшегося списка (или щелкнуть правой кнопкой
мыши по этому эксперименту в панели Проект и выбрать Запустить
из контекстного меню).
Запустив модель, Вы увидите окно презентации этой модели.
В нем будет отображена презентация запущенного эксперимента.
AnyLogic автоматически помещает на презентацию каждого простого эксперимента заголовок и кнопку, позволяющую запустить
модель и перейти на презентацию, нарисованную Вами для главного класса активного объекта этого эксперимента (Main).
Щелкните по этой кнопке. Вы увидите диаграмму потоков и накопителей. Рядом с каждым элементом будет отображаться его текущее значение (рис. 3.32).
При желании Вы можете изменить скорость выполнения модели с помощью кнопок панели управления окна презентации Замедлить и Ускорить .
AnyLogic поддерживает различные инструменты для сбора, отображения и анализа данных во время выполнения модели. Простейшим способом просмотра текущего значения и истории изменения значений переменной или параметра во время выполнения
модели является использование окна инспекта. Исследуйте динамику обеих составляющих потока продаж.
Щелкните мышью по переменной AdoptionFromAd в окне презентации. Появится желтое окошко – окно «инспекта». При желании Вы можете передвинуть это окно, перетащив его мышью за
заголовок. Изменить размер можно перетащив мышью нижний
правый угол окна.
98
Рис. 3.32
По умолчанию окно инспекта находится в режиме инспекта –
оно отображает текущее значение переменной. Вы можете переключить окно в режим графика, при этом оно будет отображать
временной график изменений значения переменной с течением модельного времени. Текущее значение переменной также отображается и в этом режиме (рядом с началом координат графика). Окно
инспекта автоматически масштабируется таким образом, чтобы
полностью вместить кривые графиков от начала до конца периода
моделирования.
Обычно окна инспекта используются только для беглого ознакомления с проистекающими в модели процессами, для более тщательной визуализации и анализа данных используются диаграммы
и объекты сбора статистики, расположенные на палитре Статистика. С помощью этих элементов Вы можете добавлять на презентацию любые графики, диаграммы и гистограммы и вести статистический анализ собранных данных. Аналогичным образом откройте окно инспекта переменной
AdoptionFromWOM и переключите его в режим графика (рис. 3.33).
99
Рис. 3.33
Теперь мы можем увидеть, что при внедрении нового продукта
на рынок, когда число потребителей равно нулю, реклама будет
являться единственным источником продаж. Наибольший рекламный эффект отмечается в начале процесса распространения продукта; он неуклонно падает по мере уменьшения численности потенциальных потребителей. Шаг 9. Добавление диаграмм.
Как мы уже отмечали ранее, AnyLogic поддерживает различные
инструменты для сбора, отображения и анализа данных во время
выполнения модели. Простейшим способом просмотра истории изменения значений переменной во время выполнения модели является использование окна инспекта. Для более тщательной визуализации и анализа данных используются диаграммы и объекты сбора
данных, расположенные на палитре Статистика. С помощью этих элементов Вы можете добавлять на презентацию любые графики, диаграммы и гистограммы и вести статистический анализ собранных данных. 100
Давайте добавим диаграммы, с помощью которых мы будем изучать, как изменяются со временем численности потребителей и
потенциальных потребителей продукта, а также как изменяется
интенсивность продаж продукта.
Добавьте график, отображающий динамику изменения численностей потребителей и потенциальных потребителей продукта.
Перетащите элемент Временной график
из палитры Статистика на диаграмму класса Main и измените размер графика, как
показано на приведенном рис. 3.34.
Перейдите на страницу Основные панели Свойства.
В поле Временной диапазон задайте диапазон временной оси
диаграммы (количество единиц модельного времени (N), для которого будут отображаться значения переменной): 8. Диаграмма будет отображать график только для заданного временного интервала
(равного в нашем случае длительности периода моделирования).
Измените частоту обновления графика новыми данными. Введите 0.1 в поле Период, справа от секции Обновлять автоматически.
Добавьте элементы данных, историю изменения значений которых Вы хотите отображать на этом временном графике.
Чтобы добавить новую секцию свойств, в которой задаются
свойства отображаемого на графике элемента данных, щелкните
мышью по кнопке Добавить элемент данных.
Задайте выражение, результат вычисления которого будет отображаться на графике. Мы хотим отображать численность потенциальных потребителей, поэтому введите в поле Значение имя соответствующего накопителя: PotentialAdopters.
Рис. 3.34
101
Рис. 3.35
В поле Заголовок введите Potential adopters. Эта строка будет
отображаться в легенде диаграммы для этого элемента данных.
Аналогично добавьте на график еще один элемент данных, который будет отображать значение накопителя Adopters (если у Вас
возникнут вопросы, то Вы можете свериться с рис. 3.35.
Добавьте график, отображающий изменение интенсивности
продаж.
Добавьте на диаграмму еще один временной график. Поместите
его под добавленным ранее графиком (рис. 3.36).
Добавьте на график новый элемент данных (в качестве Значения
в этом случае должно быть задано имя потока AdoptionRate) и измените свойства графика, как показано на рис. 3.37.
Теперь Вы можете запустить модель и изучить динамику изменения численностей потребителей и потенциальных потребителей
продукта. Вы увидите классические для рассматриваемого примера системной динамики кривые S-формы. С помощью нижнего графика Вы можете проследить, как с течением времени будет изменяться интенсивность продаж продукта.
Если модель была создана правильно, то Вы увидите колоколообразную кривую.
Мы закончили создание простейшей модели системной динамики. Эта модель часто используется в классических учебниках по си102
Рис. 3.36
Рис. 3.37
103
стемной динамике, и именно поэтому она и была выбрана нами для
учебного пособия. На этом примере мы хотели продемонстрировать
Вам, как создаются типовые модели системной динамики в AnyLogic. Теперь мы можем несколько усовершенствовать эту модель, попутно продемонстрировав специализированные возможности AnyLogic, реализованные в первую очередь именно для приверженцев
системно-динамического метода моделирования.
Шаг 10. Моделирование повторных покупок.
Созданная модель не учитывает того, что со временем продукт
может быть израсходован или прийти в негодность, что вызовет
необходимость его повторного приобретения. Мы смоделируем повторные покупки, полагая, что потребители продукта снова становятся потенциальными потребителями, когда продукт, который
они приобрели, становится непригоден.
Вначале мы определим константу, задающую среднее время
жизни продукта.
Создайте константу ProductLifeTime.
Пусть средняя продолжительность использования нашего продукта равна двум годам. Введите Значение по умолчанию 2.
Потребители продукта снова становятся потенциальными потребителями тогда, когда продукт, который они приобрели, расходуется и перестает использоваться. Поэтому поток прекращения
использования продукта является ничем иным, как потоком приобретения, задержанным на среднее время пригодности продукта.
Создайте поток прекращения использования продукта, ведущий из Adopters в PotentialAdopters.
Если нарисовать новый поток прямой стрелкой, ведущей от
Adopters к PotentialAdopters, то этот поток будет нарисован поверх
стрелки существующего потока AdoptionRate. Поэтому давайте нарисуем поток более сложной формы (рис. 3.38). Для этого используем другой, более подходящий для данного случая, способ рисования потоков.
Сделайте двойной щелчок по элементу
Поток в палитре Системная динамика. Значок элемента при этом должен смениться на
следующий: .
Сразу после этого щелкните мышью по накопителю Adopters, потом щелкните в промежуточных точках изгиба стрелки потока, и
завершите рисование потока, сделав двойной щелчок по накопителю PotentialAdopters, в который этот поток втекает (рис. 3.38).
Назовите поток DiscardRate. Формулы накопителей после этого
должны будут выглядеть следующим образом (рис. 3.39, рис. 3.40).
104
Рис. 3.38
Рис. 3.39
Рис. 3.40
Задайте следующую формулу для потока DiscardRate: delay(Ado
ptionRate, ProductLifeTime) (рис. 3.41).
Функция delay() реализует временную задержку; она имеет следующую нотацию: delay(<задерживаемый поток>, <значение задержки>, <начальное значение>). В нашем случае функция представляет
собой AdoptionRate с временной задержкой ProductLifeTime. Пока
105
Рис. 3.41
не истекло время использования первого приобретенного продукта,
поток равен нулю.
Как и во всех других аналогичных случаях, написание такой формулы потребует добавления ссылок от переменных AdoptionRate и
ProductLifeTime к потоку DiscardRate.
Проверить работу функции задержки проще всего с помощью
диаграммы. Для этого мы добавим на график, отображающий динамику изменения интенсивности продаж, и другую интенсивность – интенсивность отказа от продукта, определяемую нашим
потоком DiscardRate.
Добавьте на нижний график новый элемент данных, отображающий динамику изменения интенсивности DiscardRate.
Добавьте на нижний график еще один элемент данных, аналогично тому, как мы это делали на предыдущем шаге учебного пособия. Задайте свойства этого элемента, как показано на рис. 3.42.
Рис. 3.42
106
Теперь мы закончили моделирование повторных покупок продукта. Вы можете проверить, как работает функция задержки. Запустите модель и исследуйте графики переменных AdoptionRate и
DiscardRate. Вы сможете увидеть, что график потока прекращения
использования продукта имеет именно тот вид, который мы и предполагали увидеть – он является ничем иным, как потоком приобретения продукта, задержанным на 2 года – время пригодности
продукта.
С помощью диаграммы проследите динамику изменения численностей потребителей.
Теперь численность потенциальных потребителей не уменьшается до нуля, а постоянно пополняется по мере того, как потребители заново покупают продукты взамен непригодных. Интенсивность
приобретения продукта растет, падает, и в итоге принимает какоето значение, зависящее от средней жизни продукта и параметров,
определяющих интенсивность этого потока. Наличие в модели прекращения использования продукта означает, что какая-то доля населения всегда будет оставаться потенциальными потребителями.
Шаг 11. Моделирование цикличности спроса.
В текущей модели доля контактов потребителей продукта с потенциальными потребителями, которая приводит к продажам продукта, полагается постоянной. На самом деле она изменяется, поскольку спрос на наш продукт зависит от текущего времени года.
Продукт пользуется наибольшим спросом летом, в то время как зимой спрос на товар резко падает, за исключением небольшого предпраздничного периода в декабре. Давайте и промоделируем теперь
сезонную цикличность спроса.
Добавление экспериментальных данных
Предположим, что у нас есть экспериментальные данные того,
как изменяется средний спрос на продукт в течение года. Мы добавим эти данные в нашу модель с помощью табличной функции.
Табличная функция – это функция, заданная в табличной форме,
которая может быть сделана непрерывной с помощью интерполяции и экстраполяции.
Задание кривой спроса с помощью табличной функции.
Перетащите элемент Табличная функция из палитры Системная динамика на диаграмму класса Main.
Назовите функцию demand.
Задайте данные табличной функции в таблице Табличные данные на странице свойств функции. Каждая пара «аргумент-значение» задается в отдельной строке таблицы (рис. 3.43). Чтобы задать
107
Рис. 3.43
новую пару значений, щелкните мышью в пустой ячейке Аргумент
и введите новый аргумент функции. Затем щелкните в соседней
ячейке Значение справа и введите значение функции, соответствующее этому аргументу. Задайте следующие данные:
Задайте тип интерполяции. Выберите Линейная из выпадающего списка Интерполяция. Интерполяция будет производиться соединением табличных точек прямыми линиями.
Задайте тип реакции на аргументы, лежащие за пределами области допустимых значений функции. Выберите Ближайший из
выпадающего списка, Если аргумент выходит за пределы. В случае
вызова функции с аргументом, лежащим за пределами интервала
заданных значений, будет использоваться ближайший заданный
аргумент функции.
Закончив задание функции, Вы можете посмотреть, как она выглядит, с помощью графика предварительного просмотра функции
на странице ее свойств (рис. 3.44).
Моделирование влияния меняющегося спроса на интенсивность
приобретения продукта.
Теперь мы хотим промоделировать то, как спрос на продукт влияет на количество людей, приобретающих продукт под влиянием
108
Рис. 3.44
общения с владельцами продукта. Для этого мы создадим специальную функцию и заменим параметр AdoptionFraction вспомогательной переменной, значение которой будет вычисляться согласно этой функции.
Задайте функцию.
Перетащите элемент Функция из палитры Основная на диаграмму класса Main.
Назовите функцию adoptFraction.
Функция будет возвращать вещественное значение, поэтому выберите double из группы кнопок Тип возвращаемого значения.
У функции должен быть один аргумент, с помощью которого ей
будет передаваться текущее значение времени. Добавьте в таблицу
Аргументы функции аргумент с именем time типа double.
На странице свойств Код задайте выражение функции. В поле
Тело функции замените существующую строку на следующую:
return demand((time-floor(time))*12+1)/200.0.
Это выражение вычисляет номер текущего месяца и передает
его табличной функции demand. Табличная функция возвращает
значение спроса на продукт для данного месяца. В заключение, для
получения значения доли людей, покупающих продукт под влиянием общения, значение спроса делится на коэффициент преобразования.
Функция floor() является одной из набора математических
функций, которые AnyLogic предоставляет пользователям, наряду
с такими, как sin, cos, exp, и т. д. Вводя выражения, Вы можете
пользоваться Мастером подстановки кода, в котором все доступные
в данном контексте функции присутствуют наряду с другими элементами модели, переменными, аргументами функций и т. д.
109
Ну и наконец, нужно будет заменить константу вспомогательной переменной, значение которой определяется нашей функцией.
Замените параметр AdoptionFraction вспомогательной переменной.
Удалите параметр AdoptionFraction.
Добавьте вспомогательную переменную AdoptionFraction. Задайте в качестве формулы переменной adoptFraction(time()). Таким образом, значение переменной будет вычисляться согласно нашей функции. Функция принимает один аргумент, time(). Функция time() возвращает текущее значение модельного времени.
Запустите модель. Вы увидите, что теперь поведение модели колеблется около точки равновесия в силу того, что теперь колеблются значения и потока приобретения, и потока прекращения использования продукта (рис. 3.45). Шаг 12. Моделирование стратегии рекламной кампании.
На данный момент эффективность рекламы в нашей модели полагается постоянной. На самом деле, она зависит от текущих расходов компании на рекламу. Мы хотим улучшить нашу модель,
Рис. 3.45
110
чтобы иметь возможность управлять расходами на рекламную кампанию. Изменяя месячные расходы на рекламу, мы сможем повлиять на текущую эффективность рекламы.
Моделирование месячных расходов
Создайте константу, задающую месячные расходы компании.
Создайте параметр MonthlyExpenditures.
Задайте Значение по умолчанию: 1100.
Замените параметр AdEffectiveness вспомогательной переменной.
Удалите параметр AdEffectiveness.
Создайте вспомогательную переменную AdEffectiveness с формулой: MonthlyExpenditures/10000.0. Мы полагаем, что именно
так эффективность рекламы зависит от текущих рекламных расходов компании.
Мы хотим вести статистику всех расходов компании. Это может
быть сделано созданием специальной переменной для хранения
информации о том, сколько денег было потрачено на рекламу продукта. Каждый месяц мы будем обновлять это значение с помощью
специального события, добавляя значение запланированных на
предстоящий месяц расходов на рекламную кампанию продукта.
Добавьте переменную для хранения общих расходов компании.
Перетащите элемент Переменная
из палитры Основная на
диаграмму класса Main.
Назовите переменную TotalExpenditures.
Создайте событие, которое будет обновлять значение TotalExpenditures.
Перетащите элемент Событие
из палитры Основная на диаграмму класса Main.
Назовите событие monthlyEvent.
Сделайте так, чтобы таймер срабатывал каждый месяц. Выберите Циклический из выпадающего списка Режим. Поскольку одна
единица модельного времени в нашей модели соответствует одному
году, то одному месяцу будет соответствовать выражение 1.0/12.0.
Введите 1.0/12 в поле Таймаут.
Задайте Действие события: TotalExpenditures += MonthlyExpenditures; Этот код будет выполняться каждый раз по истечении таймаута события. Он выполняет сбор статистики, а именно добавляет значение запланированных рекламных расходов на
предстоящий месяц к значению переменной TotalExpenditures
(рис. 3.46).
111
Рис. 3.46
Моделирование плана рекламной кампании
Поскольку реклама играет значительную роль только в начальной стадии процесса завоевания рынка, мы хотим в какой-то момент времени, скажем, через 3 года остановить рекламную кампанию. Этим мы сэкономим деньги, бесцельно тратящиеся на рекламу тогда, когда насыщение рынка будет определяться практически
исключительно покупками продукта, вызванными общением потребителей с потенциальными потребителями.
Добавьте константу, задающую время переключения.
Добавьте параметр SwitchTime.
Задайте Значение по умолчанию: 3.
Теперь мы визуально зададим поведение системы с помощью диаграммы состояний. Создайте диаграмму состояний для моделирования рекламной стратегии.
Начните задание диаграммы состояний с добавления элемента
Начало диаграммы состояний
(перетащите этот элемент на диаграмму из палитры Диаграмма состояний) (рис. 3.47).
Рис. 3.47
112
Добавьте состояние. Перетащите элемент Состояние из палитры Диаграмма состояний так, чтобы состояние присоединилось к
добавленному ранее элементу (рис. 3.48). Измените имя состояния
на with_advertising.
Добавьте еще одно состояние под только что созданным. Назовите его without_advertising (рис. 3.49).
Нам нужно остановить рекламную кампанию в тот момент,
когда диаграмма состояний войдет в это состояние. Поэтому напишите в поле свойства Действие при входе этого состояния
MonthlyExpenditures=0.0; (рис. 3.50).
Добавьте переход, ведущий из состояния with_advertising в состояние without_advertising. Сделайте двойной щелчок мышью по
элементу Переход в палитре Диаграмма состояний. Затем нарисуйте переход, ведущий из состояния with_advertising в состояние
without_advertising, щелкнув по границе верхнего состояния, а затем по границе нижнего состояния (рис. 3.51).
Рис. 3.48
Рис. 3.49
Рис. 3.50
Рис. 3.51
113
Укажите, что этот переход произойдет по истечении времени
SwitchTime. Для этого выберите По таймауту из выпадающего списка Происходит и введите SwitchTime в поле Таймаут (рис. 3.52).
Теперь, когда диаграмма состояний находится в начальном состоянии with_advertising, рекламные расходы кампании определяются переменной MonthlyExpenditures. Как только диаграмма
состояний покидает это состояние в момент времени SwitchTime,
компания перестает рекламировать продукт.
Запустите модель и убедитесь, что рекламная кампания длится
теперь только три года. Шаг 13. Оптимизация рекламной стратегии.
Рыночная стратегия в данной модели предельно проста: в определенный момент времени компания прекращает рекламировать
продукт. Мы же хотим найти оптимальную рыночную стратегию для достижения требуемого количества потребителей к определенному
моменту времени при минимальных затратах на рекламу. Мы можем решить эту проблему, используя оптимизацию, при
которой выбранные параметры модели будут систематически изменяться для минимизации или максимизации значения целевого
функционала.
Создайте оптимизационный эксперимент.
В панели Проекты щелкните правой кнопкой мыши по элементу
модели и выберите Создать|Эксперимент из контекстного меню. Откроется диалоговое окно Новый эксперимент.
Выберите Оптимизация из списка Тип эксперимента и нажмите Готово.
Вы увидите, что в модели будет создан еще один эксперимент, а
в графическом редакторе будет открыта его диаграмма.
Мы будем оптимизировать значения параметров MonthlyExpenditures и SwitchTime. Во время оптимизации, значения па-
Рис. 3.52
114
раметров модели будут систематически изменяться, чтобы найти
наименьшее значение переменной TotalExpenditures, выбранной в
качестве целевого функционала, при котором достигается насыщение рынка к заданному моменту времени.
Задайте оптимизационные параметры.
Выделите оптимизационный эксперимент в панели Проекты и
перейдите на страницу свойств Основные.
Все параметры корневого активного объекта эксперимента перечислены в таблице Параметры, расположенной на странице основных свойств эксперимента. По умолчанию все они сделаны фиксированными, т. е. они не участвуют в оптимизационном процессе (их
значения не меняются). Чтобы включить параметр в процесс оптимизации (т. е., разрешить варьирование его значения для поиска
наилучшего значения функционала), Вам нужно выбрать в ячейке
Тип соответствующих нужным параметрам строках таблицы другую опцию вместо фиксированный.
Давайте вначале сконфигурируем параметр MonthlyExpenditures. Выберите непрерывный в ячейке Тип строки MonthlyExpenditures. Задайте максимально возможное значение параметра
в ячейке Макс., равным 10000, а Начальное значение, равным 1000.
Таким образом, мы говорим оптимизатору, что параметр может принимать любые вещественные значения в интервале от 0 до 10000, а
начнет оптимизатор процесс оптимизации со значения 1000.
Теперь сделаем то же для параметра SwitchTime. Выберите дискретный в ячейке Тип, поскольку мы хотим, чтобы этот параметр принимал только значения, соответствующие определенным
временным промежуткам: один месяц, два месяца и т. д. Задайте 0.0833 в ячейке Шаг. Это значение соответствует одному месяцу в нашей модели, так как 1 соответствует одному году, то один
месяц равен 1.0/12.0 = 0.0833. В ячейке Макс. выберите 1.5, а в
ячейке Начальное 1 (рис. 3.53).
Рис. 3.53
115
Создайте интерфейс эксперимента.
Щелкните по кнопке Создать интерфейс на странице основных
свойств эксперимента.
Тем самым мы создадим заданный по умолчанию интерфейс для
эксперимента (рис. 3.54) – набор элементов управления для отображения результатов процесса оптимизации по ходу его выполнения.
Обратите внимание, что создание интерфейса удаляет все содержимое диаграммы оптимизационного эксперимента, поэтому мы
рекомендуем вначале создать предлагаемый по умолчанию интерфейс, а уже потом изменять его.
Задайте функционал оптимизации.
Мы хотим минимизировать деньги, затраченные на рекламу
продукта. На странице основных свойств эксперимента введите root.TotalExpenditures в поле Целевая функция. Здесь мы обращаемся к корневому активному объекту эксперимента как к переменной root.
Оставьте выбранной опцию минимизировать.
Сконфигурируйте оптимизацию.
На странице основных свойств эксперимента задайте максимальное количество «прогонов» модели, которое будет произведено
оптимизатором. Введите 1500 в поле Количество итераций.
Рис. 3.54
116
Чтобы процесс оптимизации успешно выполнялся, нужно убедиться в том, что он будет заканчиваться. По умолчанию моделирование не заканчивается, поэтому оптимизатор не получит результат, который должен бы был получить по окончании выполнения
каждого отдельного «прогона» модели. Поэтому нужно явно задать
условие останова «прогона». Перейдите на страницу свойств эксперимента Модельное время и выберите опцию В заданное время из
выпадающего списка Остановить. В поле ниже введите 1.5. Теперь
«прогоны» модели будут завершаться по прошествии полутора единиц модельного времени.
Задание дополнительного требования (проверка насыщения
рынка).
Теперь давайте зададим дополнительное требование к результатам оптимизации, которое будет проверяться после выполнения
каждого «прогона» модели. Мы хотим, чтобы по прошествии полутора лет модельного времени продукт приобрели 80000 человек. Задайте the requirement for the optimization experiment.
Выделите оптимизационный эксперимент в панели Проекты и
перейдите на страницу свойств Ограничения. Задайте требование
к результатам оптимизации в верхней строке таблицы Требования
(проверяются после “прогона” для определения того, допустимо ли
найденное решение).
Введите root.Adopters в ячейке Выражение. Корневой активный объект эксперимента доступен здесь по имени root.
Выберите >= в ячейке Тип.
Введите 80000 в ячейке Граница.
Наконец, установите флажок в самом левом столбце таблицы,
чтобы активировать это ограничение (рис. 3.55).
Рис. 3.55
117
Мы закончили задание дополнительного требования к результатам оптимизации. Оно будет проверяться после каждого «прогона»
модели. Если это требование не будет выполнено, то полученный в
результате данного «прогона» результат будет отброшен.
Запуск оптимизации
Теперь модель готова к проведению оптимизации. Запустите оптимизацию.
Щелкните правой кнопкой мыши по оптимизационному эксперименту в панели Проекты и выберите Запустить из контекстного
меню. Вы увидите окно презентации, отображающее презентацию
запущенного эксперимента.
Запустите процесс оптимизации, щелкнув по кнопке Запустить
оптимизацию на холсте презентации эксперимента.
AnyLogic запустит модель 1500 раз, изменяя значения параметров MonthlyExpenditures и SwitchTime. Итоговая информация о
результатах будет отображаться в специальных элементах управления на диаграмме эксперимента в окне презентации (рис. 3.56).
Рис. 3.56
118
Когда процесс оптимизации модели завершится, Вы увидите,
что лучшее значение функционала равно четырем с лишним тысячам. Эксперимент в итоге выдаст оптимальные значения параметров SwitchTime и MonthlyExpenditures, при которых было достигнуто это значение функционала.
Теперь можно обновить модель этими значениями параметров
SwitchTime и MonthlyExpenditures. Сохраните полученные значения параметров в эксперименте Simulation, чтобы использовать в
нашей модели найденную оптимальную стратегию.
Примените результаты оптимизации. После завершения оптимизации, щелкните по кнопке copy на холсте диаграммы эксперимента в окне презентации. Таким образом, Вы скопируете найденные (оптимальные) значения параметров в Буфер обмена.
Закройте окно презентации и выделите эксперимент Simulation
в панели Проекты.
Вставьте скопированные значения параметров из Буфера обмена, щелкнув по кнопке Вставить из буфера внизу страницы основных свойств эксперимента.
Запустите эксперимент Simulation. Теперь модель будет запущена с оптимальными значениями параметров, при которых в процессе оптимизации было получено наилучшее значение функционала.
Можете проверить, что к заданному времени (1,5 года) достигается
требуемое количество пользователей продукта. Теперь мы спланировали стратегию завоевания рынка таким образом, чтобы рекламная кампания была наиболее рациональной и эффективной.
Вопросы для самопроверки
1. В чем состоит разница между классом, не наследующим никакого другого класса, и классом, имеющим Entity в качестве базового класса?
2. Соединитель может передавать заявки:
a) из начальной точки в конечную;
b) из конечной в начальную;
c) в обоих направлениях.
3. Назовите ситуации, в которых могут понадобиться объекты
Enter и Exit.
119
4. АГЕНТНАЯ МОДЕЛЬ РАСПРОСТРАНЕНИЯ
ПРОДУКТА ПО БАССУ
Пакет моделирования AnyLogic поддерживает различные подходы моделирования. В этом учебном пособии описывается агентный подход моделирования, успешно применяемый в различных
сферах деятельности, таких как экология, социология, экономика,
моделирование движения и т. д. При помощи агентов моделируют
рынки (агент – потенциальный покупатель), конкуренцию и цепочки поставок (агент – компания), население (агент – семья, житель города или избиратель) и многое другое. Агентные модели позволяют получить представление об общем поведении системы, исходя из предположений о поведении ее элементов, при отсутствии
знания о глобальных законах – т. е. в наиболее общем случае.
AnyLogic является единственным инструментом моделирования, позволяющим быстро создавать гибкие модели с агентами,
взаимодействующими как друг с другом, так и со своим окружением. AnyLogic поддерживает все возможные способы задания поведения агентов – диаграммы состояний, синхронное и асинхронное
планирование событий. Это учебное пособие кратко ознакомит Вас с процессом создания
модели в AnyLogic. Его целью является ознакомление с интерфейсом и основными возможностями AnyLogic. Мы создадим простой
и наглядный пример – модель жизненного цикла продукта, используемую для предсказания распространения новых продуктов. Вначале мы создадим классическую модель распространения
инноваций Басса. Модель описывает процесс распространения продукта. Изначально продукт никому не известен, и для того, чтобы
люди начали его приобретать, он рекламируется. В итоге определенная доля людей приобретает продукт под воздействием рекламы. Также люди приобретают продукт в результате общения с
теми, кто этот продукт уже приобрел.
Затем мы расширим нашу модель, добавив некоторые новые
детали и продемонстрировав усовершенствованные возможности
AnyLogic.
Если при создании модели Вы будете сталкиваться с какими-то
трудностями, то Вы можете сравнить Вашу модель с контрольной
моделью, соответствующей создаваемой в этом учебном пособии
модели. Ссылки на контрольные модели даны в конце некоторых
шагов, чтобы открыть такую модель просто щелкните на ссылке с
ее названием.
120
Шаг 1. Создание простейшей агентной модели.
Давайте создадим простейшую агентную модель. Начиная с
версии 6.4, AnyLogic предоставляет пользователям возможность
использования шаблонов моделей при создании новых моделей.
Если раньше Вам приходилось всегда начинать создание модели
«с чистого листа», зачастую выполняя одни и те же типовые действия для каждой новой создаваемой модели, то теперь Вы можете
перепоручить выполнение первых, базовых, шагов Мастеру создания модели. Все, что Вам нужно – это указать, какой метод моделирования Вы будете использовать и выбрать те опции, которые Вам
нужны в модели – и Мастер автоматически создаст простейшую
модель, а Вы сможете продолжать ее разработку, лишь изменив незначительные детали.
Создайте новую агентную модель.
Щелкните мышью по кнопке панели инструментов Создать .
Появится диалоговое окно Новая модель.
Задайте имя новой модели. В поле Имя модели введите Bass
Diffusion Agent Based.
Выберите каталог, в котором будут сохранены файлы модели.
Если Вы хотите сменить предложенный по умолчанию каталог на
какой-то другой, Вы можете ввести путь к нему в поле Местоположение или выбрать этот каталог с помощью диалога навигации по файловой системе, открывающегося по нажатию на кнопку Выбрать.
Щелкните мышью по кнопке Далее. Откроется вторая страница Мастера создания модели. Здесь Вам будет предложено выбрать
шаблон модели, на базе которого Вы будете разрабатывать Вашу
модель. Поскольку мы хотим создать новую агентную модель, установите флажок Использовать шаблон модели и выберите Агентная
модель в расположенном ниже списке Выберите метод моделирования.
Щелкните мышью по кнопке Далее. Откроется следующая страница Мастера создания модели. Поскольку первым шагом при создании агентной модели всегда является создание агентов, то здесь
Вам как раз предлагается задать имя класса агента и количество
агентов, которое будет изначально создано в нашей модели. Задайте в качестве имени класса Person и введите в поле Начальное количество агентов 500. Автоматически в нашей модели будет создано
500 агентов (т. е., экземпляров класса Person, каждый из которых
будет представлять отдельного агента). Щелкните мышью по кнопке Далее. Откроется следующая страница Мастера создания модели. Здесь Вам будет предложено задать
121
свойства пространства, в котором будут обитать агенты, а также
выбрать фигуру анимации агента.
Установите флажок Добавить пространство и выберите ниже
тип этого пространства: Непрерывное. Здесь же Вы можете задать
размерности этого пространства: давайте введем в поле Ширина
600, а в поле Высота 350. Тем самым, в результате наши агенты будут располагаться каким-то образом в пределах непрерывного пространства, отображаемого на презентации моделей областью размером 600*350 пикселей.
Не меняйте значения, выбранные в выпадающих списках Начальное расположение и Анимация: пусть агенты изначально расставляются по пространству случайным образом, а анимируются с
помощью фигурки человечка.
Щелкните мышью по кнопке Далее. Откроется следующая страница Мастера создания модели. Здесь Вам будет выбрать, хотите
ли Вы, чтобы была задана сеть взаимосвязей агентов, и если да, то
каким образом должны устанавливаться связи между агентами.
Установите флажок Использовать сеть и оставьте выбранной опцию Случайное.
Щелкните мышью по кнопке Далее. Откроется последняя страница Мастера создания модели. Установите на ней флажок Добавить простое поведение. Тем самым, у нашего агента будет создана
диаграмма состояний (Вы сможете увидеть ее в панели предварительного просмотра модели Мастера создания модели). В свое время мы объясним, как задавать поведение агента с помощью диаграммы состояний.
Мы закончили конфигурирование шаблона создаваемой модели. Щелкните мышью по кнопке Готово, чтобы закончить процесс
создания модели.
Вы создали новую модель. Если Вы еще не знакомы с пользовательским интерфейсом AnyLogic, то давайте уделим пару минут основным его компонентам:
Пользовательский интерфейс AnyLogic.
В левой части рабочей области находится панель Проекты. Панель Проекты обеспечивает легкую навигацию по элементам моделей, открытым в текущий момент времени. Поскольку модель организована иерархически, то она отображается в виде дерева: сама
модель образует верхний уровень дерева; эксперименты, классы
активных объектов и Java классы образуют следующий уровень;
элементы, входящие в состав активных объектов, вложены в соответствующую подветвь дерева класса активного объекта и т. д.
122
В правой части рабочей области отображается панель Палитра,
а внизу – панель Свойства. Панель Палитра содержит разделенные
по категориям элементы, которые могут быть добавлены на графическую диаграмму класса активного объекта или эксперимента.
Панель Свойства используется для просмотра и изменения свойств
выбранного в данный момент элемента (или элементов) модели.
В центре рабочей области AnyLogic Вы увидите графический
редактор. В графическом редакторе автоматически откроется диаграмма класса Main (рис. 4.1).
Наша модель будет содержать созданные Мастером создания модели классы активных объектов Main и Person. Активные объекты
являются основными строительными блоками модели AnyLogic.
Активные объекты могут моделировать любые объекты реального
мира: машины, людей, станки, здания, аппаратное обеспечение и
т. д. В нашем случае активный объект Person будет моделировать
агентов (людей). Этот класс активного объекта был автоматически объявлен агентом (тем самым он получил доступ к специаль-
Рис. 4.1
123
ной функциональности агента). В панели Проекты такой класс отображается значком
. При работе с моделью, не забывайте сохранять производимые Вами изменения с помощью кнопки панели
инструментов Сохранить .
Шаг 2. Моделирование продаж под влиянием рекламы.
Мы (не без помощи Мастера создания модели) уже создали простейшую модель. Теперь давайте путем нескольких изменений
приведем ее к постановке нашей простейшей задачи – пусть наша
модель моделирует процесс приобретения нового продукта, но пока
только под влиянием рекламной кампании, проводимой с целью
выведения нового продукта на сложившийся рынок.
В этой модели интенсивность рекламы и вероятность того, что
продукт будет приобретен под ее влиянием, полагаются постоянными. Поэтому мы зададим эффективность рекламы константой.
Эффективность рекламы определяет, какая доля людей купит продукт вследствие ее влияния.
Характеристики модели задаются с помощью параметров. Мы
зададим параметры в классе Person, потому что наши агенты задаются экземплярами именно этого класса. Задав значение параметра в классе, мы задаем его для всех агентов одновременно. Но при
необходимости Вы сможете задать характеристики индивидуально
для каждого агента, поскольку AnyLogic позволяет задавать различные значения параметров для разных элементов одного и того
же класса.
Задайте подверженность человека влиянию рекламы.
Откройте диаграмму класса Person, сделав двойной щелчок мышью по элементу Person в панели Проекты.
Перетащите элемент Параметр из палитры Основная на диаграмму класса:
Когда Вы поместите элемент на диаграмму класса, этот элемент
будет считаться выбранным, и Вы сможете изменить свойства элемента в расположенной в нижней части рабочей области панели
Свойства. В дальнейшем для изменения свойств элемента нужно
будет вначале щелчком мыши выделить его в графическом редакторе или в дереве элементов модели, отображаемом в панели Проекты (рис. 4.2).
Перейдите на страницу Основные панели Свойства, чтобы изменить свойства созданного параметра.
Измените имя параметра. Введите AdEffectiveness в поле Имя
(рис. 4.3).
В поле Значение по умолчанию введите 0.011.
124
Рис. 4.2
Рис. 4.3
Вы можете задать краткое описание параметра на странице Описание панели Свойства (чтобы переключиться на другую страницу,
щелкните мышью по вкладке с ее названием в левой части панели).
Введите текст, который поможет объяснить смысл параметра тем,
кто не знаком с моделью.
Поведение агента обычно описывается визуально в классе этого
агента (в нашей модели это класс Person) с помощью диаграммы состояний.
Мастер создания моделей уже создал простейшую диаграмму состояний из двух состояний, между которыми существует два разнонаправленных перехода. 125
Измените диаграмму состояния.
Откройте диаграмму класса Person, сделав двойной щелчок мышью по элементу Person в панели Проекты. На диаграмме класса
Вы увидите следующую диаграмму состояний (рис. 4.4).
Измените, имя верхнего состояния на PotentialAdopter (поле
Имя на странице свойств перехода). Это начальное состояние, о
чем свидетельствует элемент Начало диаграммы состояний, направленный в это состояние. Если диаграмма состояний будет находиться в этом состоянии, то это будет означать, что этот человек
еще не купил продукт.
Назовите его Adopter. Если это состояние диаграммы будет активным, это будет означать, что этот человек уже купил продукт.
В нашей модели состояние Adopter должно становиться активным в момент приобретения агентом продукта. Процесс приобретения продукта этим человеком моделирует переход, ведущий из
верхнего состояния в нижнее. Нам нужно изменить его свойства,
чтобы он срабатывал в нужный нам момент времени.
Время, через которое человек купит продукт, экспоненциально
зависит от эффективности рекламы продукта. Поскольку время,
необходимое человеку, чтобы принять решение о покупке продукта экспоненциально зависит от подверженности этого человека
влиянию рекламы, то выберите из выпадающего списка Происходит С заданной интенсивностью и введите в поле свойства Интенсивность этого перехода имя созданного нами только что параметра
AdEffectiveness.
Введите AdEffectiveness в расположенном ниже поле Интенсивность. Чтобы не печатать полностью имена функций и переменных
в формулах, можете пользоваться Мастером подстановки кода. Чтобы открыть Мастер, щелкните мышью в том месте поля (в нашем
Рис. 4.4
126
случае – поля Интенсивность, куда Вы хотите поместить имя, а затем нажмите Ctrl+пробел (при работе на Mac OS: Alt+пробел). Появится окно Мастера подстановки кода, перечисляющего переменные модели и функции, доступные в текущем контексте. Прокрутите список к имени, которое Вы хотите вставить, или введите первые буквы имени, пока оно не будет выделено в списке. Двойным
щелчком мыши по имени добавьте его в поле формулы (рис. 4.5).
Удалите переход, ведущий из нижнего состояния в верхнее, поскольку мы пока создаем простейшую модель, в которой человек,
однажды приобретший продукт, навсегда остается его потребителем, и соответственно перехода из состояния Adopter в состояние
PotentialAdopter пока что быть не должно.Чтобы удалить переход,
выделите его на диаграмме и нажмите Del (рис. 4.6).
Рис. 4.5
Рис. 4.6
127
Шаг 3. Настройка запуска модели.
Вы можете сконфигурировать выполнение модели в соответствии с Вашими требованиями. Модель выполняется в соответствии с набором установок, задаваемым специальным элементом
модели – экспериментом. Вы можете создать несколько экспериментов с различными установками и изменять рабочую конфигурацию модели, просто запуская тот или иной эксперимент модели. В панели Проекты эксперименты отображаются в нижней части
дерева модели. Один эксперимент, названный Simulation, создается по умолчанию. Это простой эксперимент, позволяющий запускать модель с заданными значениями параметров, поддерживающий режимы виртуального и реального времени, анимацию и
отладку модели.
Существуют также и другие типы экспериментов (оптимизационный эксперимент, эксперимент для оценки рисков, эксперимент
для варьирования параметров), которые используются в тех случаях, когда параметры модели играют существенную роль, и требуется проанализировать, как они влияют на поведение модели, или
когда нужно найти оптимальные значения параметров модели.
Если мы сейчас запустим модель, то она будет работать бесконечно. Поскольку мы хотим наблюдать поведение модели только
тогда, когда происходит процесс распространения продукта, нам
нужно остановить модель, когда система придет в точку равновесия. Поскольку под единицей модельного времени мы будем понимать один год, а процесс распространения продукта в этой модели
длится примерно 8 лет, то нам нужно будет остановить модель после 8 единиц модельного времени. Задайте остановку модели по прошествии 8 единиц модельного времени.
В панели Проекты, выделите эксперимент Simulation:Main
щелчком мыши.
На странице Модельное время панели Свойства, выберите В заданное время из выпадающего списка Остановить. В расположенном ниже поле введите 8. Модель остановится после того, как истекут 8 единиц модельного времени (рис. 4.7).
Шаг 4. Запуск модели.
Постройте Вашу модель с помощью кнопки панели инструментов Построить модель
(при этом в рабочей области AnyLogic
должен быть выбран какой-то элемент именно этой модели). Если
в модели есть какие-нибудь ошибки, то построение не будет завершено, и в панель Ошибки будет выведена информация об ошибках,
128
Рис. 4.7
обнаруженных в модели. Двойным щелчком мыши по ошибке в
этом списке Вы можете перейти к предполагаемому месту ошибки,
чтобы исправить ее (рис. 4.8).
Панель Ошибки
После того, как Вы исправите все ошибки и успешно построите
Вашу модель, Вы можете ее запустить. Запустите модель.
Щелкните мышью по кнопке панели инструментов Запустить
и выберите из открывшегося списка эксперимент, который Вы
хотите запустить. Эксперимент этой модели будет называться Bass
Diffusion Agent Based/Simulation.
В дальнейшем по нажатию на кнопку Запустить
(или по нажатию F5) будет запускаться тот эксперимент, который запускался Вами в последний раз. Чтобы выбрать какой-то другой эксперимент, Вам будет нужно щелкнуть мышью по стрелке, находящейся
в правой части кнопки Запустить
и выбрать нужный Вам экс-
Рис. 4.8
129
перимент из открывшегося списка (или щелкнуть правой кнопкой
мыши по этому эксперименту в панели Проекты и выбрать Запустить из контекстного меню).
Запустив модель, Вы увидите окно презентации этой модели.
В нем будет отображена презентация запущенного эксперимента.
AnyLogic автоматически помещает на презентацию каждого простого эксперимента заголовок и кнопку, позволяющую запустить
модель и перейти на презентацию, нарисованную Вами для главного класса активного объекта этого эксперимента (Main).
Щелкните по этой кнопке. Тем самым Вы запустите модель и
перейдете к презентации корневого класса активного объекта запущенного эксперимента. На презентации Вы увидите моделируемых
нами агентов. Каждый агент отображается своей фигуркой, которая
меняет свой цвет в зависимости от того, приобрел ли данный агент
рассматриваемый нами продукт или нет. Линиями на презентации
будут соединены те агенты, между которыми существуют связи (в
данный момент эти связи генерируются случайным образом).
При желании Вы можете изменить скорость выполнения модели с помощью кнопок панели управления окна презентации Замедлить и Ускорить.
Шаг 5. Подсчет потребителей продукта.
Главная задача модели распространения продукта – изучение
того, как быстро люди покупают новый продукт. Поэтому сейчас
мы добавим возможность отслеживания того, сколько людей уже
купило продукт, а сколько – еще нет. Мы будем подсчитывать число потребителей и потенциальных потребителей продукта с помощью специальных функций сбора статистики по агентам.
Создайте функции сбора статистики для подсчета потенциальных потребителей продукта.
Откройте диаграмму класса Main, сделав двойной щелчок мышью по элементу Main в панели Проекты.
Выделите на диаграмме вложенный объект people.
Перейдите на страницу Статистика панели Свойства.
Щелкните мышью по кнопке Добавить ф-ю сбора статистики.
Откроется секция свойств для задания свойств новой функции
сбора статистики по элементам этого реплицированного объекта
(people).
Введите potentialAadopters в поле Имя. Это будет именем нашей
функции.
Оставьте выбранный по умолчанию Тип функции: Кол-во. Задайте Условие: item.statechart.isStateActive (item.PotentialAdopter)
130
Эта функция будет вести подсчет количества агентов, для которых
выполняется заданное условие, т. е. тех агентов, которые находятся в текущий момент времени в состоянии PotentialAdopter (являются потенциальными потребителями продукта). Здесь item – это
агент (элемент реплицированного объекта people) (рис. 4.9).
Создайте функции сбора статистики для подсчета потребителей продукта.
Аналогично создайте еще одну функцию сбора статистики.
Назовите ее adopters.
Оставьте выбранный по умолчанию Тип функции: Кол-во.
Задайте Условие: item.statechart.isStateActive (item.Adopter)
Эта функция будет вести подсчет количества агентов, которые
находятся в состоянии Adopter (т. е. уже приобрели продукт)
(рис. 4.10).
Рис. 4.9
Рис. 4.10
131
Шаг 6. Добавление диаграммы.
С помощью диаграмм Вы можете понаблюдать за динамикой моделируемого процесса. Сейчас мы создадим диаграмму, отображающую динамику изменения числа потребителей и потенциальных
потребителей продукта.
Добавьте временной график, отображающий динамику изменения численностей потребителей и потенциальных потребителей
продукта.
Откройте диаграмму класса Main, сделав двойной щелчок мышью по элементу Main в панели Проекты.
Перетащите элемент Временной график из палитры Статистика на диаграмму класса.
Перейдите на страницу Основные панели Свойства.
Укажите, что именно Вы хотите отображать на графике – т. е.,
задайте элементы данных этого графика.
Чтобы добавить элемент данных, щелкните мышью по кнопке
Добавить элемент данных и в открывшейся секции свойств задайте
свойства этого элемента.
Введите people.potentialAdopters() в поле Выражение. При этом
Вы можете воспользоваться помощником подстановки кода, вызываемым нажатием Ctrl+пробел при работе на Windows и Alt+пробел
на Mac OS. Здесь мы задаем выражение, результат вычисления которого будет отображаться на нашем графике – в нашем случае мы
помещаем здесь вызов ранее созданной нами функции сбора статистики по агентам, возвращающей текущее количество потенциальных потребителей продукта.
Введите Potential adopters в поле Заголовок. Эта строка будет
отображаться в легенде диаграммы для данного элемента данных.
Аналогично добавьте еще один элемент данных. Пусть он отображает количество потребителей продукта, возвращаемое другой нашей статистической функцией: people.adopters(). Задайте Adopters
в качестве заголовка этого элемента данных и измените свойства
внешнего вида, как и в предыдущем случае.
Задайте Временной диапазон: 8. Тем самым мы задаем диапазон
временной оси графика. Поскольку в текущей модели все время моделирования равно восьми единицам модельного времени, то мы можем ограничить и временную ось аналогичным значением (рис. 4.11).
Теперь наша диаграмма успешно добавлена и сконфигурирована на отображение численностей интересующих нас групп людей.
Запустите модель. С помощью диаграммы Вы можете понаблюдать за динамикой моделируемого процесса. Вы увидите, что под
132
Рис. 4.11
влиянием рекламы каждую единицу времени постоянная доля от
общей численности потенциальных потребителей продукта приобретает изучаемый нами продукт.
Шаг 7. Учет влияния общения людей.
В текущей модели люди приобретают продукт только под влиянием рекламы. На самом деле, рекламный эффект играет значительную роль только в момент выпуска продукта на рынок. В дальнейшем все большую роль будет играть общение людей с теми своими
знакомыми, которые этот продукт уже приобрели. В основном люди
приобретают новые продукты именно под влиянием убеждения своих
знакомых; этот процесс чем-то похож на распространение эпидемии.
Чтобы учесть влияние общения людей, мы должны внести в
нашу модель небольшие изменения.
Теперь нам нужно задать еще пару новых параметров.
Задайте среднегодовое количество встреч человека.
Откройте диаграмму класса Person, сделав двойной щелчок мышью по элементу Person в панели Проекты.
Создайте новый параметр.
Назовите его ContactRate.
Предположим, что человек в среднем встречается со 100 людьми в
год. Выберите Тип int и введите в поле Значение по умолчанию 100.
Задайте параметром убедительность человека.
Добавьте еще один параметр, задающий силу убеждения человека – долю общавшихся с владельцем продукта людей, которая приобретет этот продукт под влиянием общения.
133
Назовите этот параметр AdoptionFraction.
Задайте Значение по умолчанию 0.015 (рис. 4.12).
Измените диаграмму состояний агента.
Откройте диаграмму класса Person.
Добавьте внутренний переход в состояние Adopter. В данном
случае проще будет нарисовать его, перейдя в специальный режим
рисования. Для того чтобы перейти в этот режим, сделайте двойной
щелчок мышью по элементу Переход в палитре Диаграмма состояний (при этом его значок должен поменяться на этот:
). Теперь Вы можете рисовать переход, последовательными щелчками
мыши добавляя в нужных Вам местах диаграммы начальную точку
перехода, затем точки его изгиба и, наконец, двойным щелчком –
конечную точку перехода. Щелкните мышью вначале по одной границе состояния Adopter, а затем сделайте двойной щелчок мышью
по другой его границе. При этом должен будет нарисоваться следующий переход (рис. 4.13).
Рис. 4.12
Рис. 4.13
134
Это внутренний переход состояния Adopter. Этот переход будет
моделировать общение человека со своим знакомым, в результате
тот может быть убежден в покупке нового продукта. Интенсивность срабатывания этого перехода будет зависеть от интенсивности общения этого человека. Выберите на странице свойств этого
перехода из выпадающего списка Происходит: С заданной интенсивностью и задайте новое значение Интенсивности срабатывания
этого перехода: ContactRate.
Задайте Действие этого перехода: send («Buy!», RANDOM);
Этот переход посылает сообщение случайно выбранному человеку. Позднее мы сделаем так, что вследствие этого будет срабатывать переход диаграммы состояния этого человека, моделирующий покупку им продукта. Метод send() отсылает сообщение другому агенту. Первый аргумент задает сообщение, которое будет
послано, а второй задает агента, которому это сообщение будет
адресовано. В нашем случае мы посылаем сообщение какому-то
случайно выбранному агенту, поэтому в качестве значения этого аргумента мы используем специальную константу RANDOM.
Подробное описание этого и других методов, используемых для организации взаиомодействия агентов, смотрите в статье документации Взаимодействие агентов (рис. 4.14).
Добавьте еще один переход из состояния PotentialAdopter в состояние Adopter. Этот переход моделирует процесс приобретения
продукта под воздействием общения со знакомым (рис. 4.15).
Измените свойства этого перехода. Не каждое обсуждение достоинств продукта со своим знакомым приведет к немедленному
решению о приобретении этого продукта. Вероятность такого раз-
Рис. 4.14
135
Рис. 4.15
вития событий будет зависеть от того, насколько данный потенциальный потребитель подвержен внушению. В нашей модели
данная характеристика задается параметром AdoptionFraction.
Перейдите на страницу свойств этого перехода и введите
randomTrue(AdoptionFraction) в поле Доп. условие. Это дополнительное условие приведет к тому, что продукт будет приобретаться
с вероятностью, задаваемой параметром AdoptionFraction.
Этот переход будет срабатывать, когда диаграмма состояний
этого агента получит сообщение «Buy!» (т. е., «Купи») от другого
агента – своего знакомого. Чтобы этот переход срабатывал при получении сообщения, на странице свойств этого перехода выберите
из выпадающего списка Происходит При получении сообщения.
Теперь нам нужно указать, что переход будет срабатывать только при получении сообщения соответствующего содержания. Для
этого выберите из группы кнопок Тип сообщения опцию String, выберите ниже опцию Если сообщение равно и введите «Buy!» в расположенное ниже поле (рис. 4.16).
Теперь нам нужно изменить некоторые свойства агента, для
того, чтобы получаемые им сообщения от других агентов перенаправлялись в его диаграмму состояний и обрабатывались ею в соответствии с заданной логикой.
Измените свойства агента.
Щелкните мышью по классу Person в панели Проекты, чтобы
открыть его свойства в панели Свойства.
Перейдите на страницу свойств Агент.
В поле Действие при получении сообщения введите statechart.
receiveMessage(msg). Теперь, когда агент получит сообщение от
какого-то другого агента, он будет перенаправлять его в свою диаграмму состояний, где оно будет обрабатываться так, как мы с вами
136
Рис. 4.16
это задали (а именно: вызывать срабатывание перехода, моделирующего приобретение продукта под влиянием личного общения)
(рис. 4.17).
Рис. 4.17
137
Запустите модель и изучите динамику процесса приобретения
продукта. Вы можете увидеть, что из-за учета влияния устного общения этот процесс стал проистекать значительно быстрее.
Графики переменных представляют собой классические S-образные кривые – динамика процесса в чем-то напоминает динамику
распространения заболевания. Итак, можно сказать, что мы практически абсолютно точно воспроизвели результаты, которые выдавала для данной постановки задачи системно-динамическая модель.
Сейчас люди в нашей модели случайно располагаются в прямоугольном пространстве 650x300 километров (или других условных
единиц расстояния). И наша модель допускает общение любого человека с каждым, вне зависимости от того, на каком расстоянии
друг от друга они находятся. Обычно же у человека есть определенный круг знакомых, которые живут в непосредственной близости
к нему, и именно с ними он и общается. Поэтому мы хотим, чтобы
в нашей модели общались только те люди, которые находятся не
далее определенного расстояния друг от друга.
Давайте сделаем нашу модель более реалистичной, допустив
возможность общения только тех людей, которые находятся друг
от друга на расстоянии, не превышающем 25 километров.
Свойства формирования сетей контактов агентов, как и многие
другие свойства агентной модели, задаются в объекте среда.
Измените свойства среды.
Откройте диаграмму класса Main.
Выделите на диаграмме объект environment
, задающий настройки среды, в которой обитают агенты.
Перейдите на страницу свойств Дополнительные.
Нам нужно изменить тип сети контактов. Выберите Согласно
расстоянию из выпадающего списка Тип сети и введите 25 в расположенное ниже поле Радиус соединения (рис. 4.18).
Теперь нам нужно изменить диаграмму состояний агента, чтобы
сообщение «Купи продукт!» отсылалось не случайно выбранному
агенту, а только тому агенту, который является знакомым данного
агента.
Измените диаграмму состояний агента.
Откройте диаграмму класса Person.
Измените свойства внутреннего перехода состояния Adopter.
Измените Действие этого перехода на: send(«Buy!», RANDOM_
CONNECTED).
В нашем случае мы посылаем сообщение какому-то случайно выбранному агенту из числа тех, с которым данный агент знаком, по138
Рис. 4.18
Рис. 4.19
этому в качестве значения последнего аргумента метода send мы теперь используем специальную константу RANDOM_CONNECTED
(рис. 4.19). Теперь этот переход посылает сообщение случайно выбранному знакомому этого человека.
139
Рис. 4.20
Давайте теперь запустим модель и посмотрим, как изменилась
динамика приобретения продукта:
Можно увидеть, что теперь агенты соединены только с теми, которые находятся от них на расстоянии, не превышающем 25 единиц, а сам процесс распространения продукта происходит медленнее (рис. 4.20).
Шаг 8. Моделирование повторных покупок.
Созданная модель не учитывает того, что со временем продукт
может быть израсходован или прийти в негодность, что вызовет
необходимость его повторного приобретения. Мы промоделируем
повторные покупки, полагая, что потребители продукта снова становятся потенциальными потребителями, когда продукт, который
они приобрели, становится непригоден.
Вначале мы зададим срок службы продукта. Предположим, что
средний срок службы нашего продукта – 1 год.
Задайте средний срок службы продукта.
Откройте диаграмму класса Main.
140
Создайте параметр DiscardTime. Пусть средний срок службы нашего продукта равен одному году.
Задайте Значение по умолчанию: 1 (рис. 4.21).
Измените диаграмму состояний.
Откройте диаграмму класса Person, сделав двойной щелчок мышью по элементу Person в панели Проекты.
Добавьте переход из состояния Adopter в состояние PotentialAdopter (рис. 4.22).
Измените свойства перехода. Этот переход будет срабатывать по
прошествии срока службы нашего продукта, заданного параметром
DiscardTime, после того, как управление диаграммы состояний
перейдет в состояние Adopter. Поэтому оставьте в свойстве Происходит по принятое по умолчанию значение Таймаут и введите в
поле Таймаут get_Main().DiscardTime. Метод get_Main() здесь воз-
Рис. 4.21
Рис. 4.22
141
вращает экземпляр класса Main, в котором мы задали параметр
DiscardTime (рис. 4.23).
Мы закончили моделирование повторных покупок продукта.
Теперь мы хотим исследовать процесс приобретения продукта в
течение более длительного периода времени. Уберите заданное ра-
Рис. 4.23
Рис. 4.24
142
Рис. 4.25
нее условие остановки модели по пришествие определенного числа
единиц модельного времени, чтобы модель выполнялась бесконечно, пока ее не остановит пользователь. Удалите условие остановки модели по времени.
В панели Проекты, выделите эксперимент Simulation:Main
щелчком мыши.
На странице Модельное время панели Свойства, выберите Нет
из выпадающего списка Остановить (рис. 4.24). Запустите модель и с помощью диаграммы проследите динамику изменения числа потребителей продукта. Мы видим, что насыщение рынка в модели с повторными покупками не достигается
(рис. 4.25).
Вопросы для самопроверки
1. Какие режимы масштабирования есть у областей просмотра?
2. Области просмотра могут использоваться для навигации:
a) в режиме запуска модели; b) в режиме разработки; c) в обоих
режимах.
3. Какой механизм используется в AnyLogic для переключения
между областями просмотра?
a) кнопка на панели инструментов; b) контекстное меню; c) и то,
и другое.
4. Для чего в модель добавлены метки Factory и Retai store?
5. Эксперимент запускает:
a) Retailer; b) Main; c) заданный пользователем класс.
143
5. ПАВИЛЬОН МЕТРО
Пешеходная библиотека является высокоуровневой библиотекой для моделирования движения пешеходов в физическом пространстве. Она позволяет моделировать здания, в которых движутся пешеходы (станции метро, стадионы, музеи), улицы, парки отдыха и т. д. В моделях, созданных с помощью Пешеходной библиотеки, пешеходы движутся в непрерывном пространстве, реагируя
на различные виды препятствий в виде стен и других пешеходов.
Пешеходная библиотека AnyLogic позволяет собирать статистику работы моделируемой системы и наглядно визуализировать
моделируемый процесс с помощью анимации. Вы можете отслеживать плотность пешеходов в различных областях модели для того,
чтобы убедиться в том, что система сможет справиться с потенциальным ростом нагрузки, вычислить время пребывания пешеходов
в каких-то определенных участках модели, выявить возможные
проблемы, которые могут возникнуть при перепланировке интерьера здания, и т. д. Это учебное пособие научит Вас создавать простые модели с помощью Пешеходной библиотеки. Мы создадим простейшую модель
наземного павильона метро, с помощью которой наглядно покажем, как моделировать простейшие пассажиропотоки и сервисы.
Если при создании модели Вы будете сталкиваться с какими-то
трудностями, то Вы можете сравнить Вашу модель с контрольной
моделью, соответствующей создаваемой в этом учебном пособии
модели. Ссылки на контрольные модели даны в конце некоторых
шагов, чтобы открыть такую модель просто щелкните на ссылке с
ее названием.
В этом разделе учебного пособия мы создадим простейшую модель, моделирующую движение пассажиров в наземном павильоне метро. Перед тем, как пройти к поездам метро, пассажиры проходят через турникеты, проверяющие наличие билетов. Те пассажиры, которые не купили билеты заранее, должны будут вначале
приобрести их в находящейся в павильоне билетной кассе, и только
потом они смогут пройти к поездам. Эта модель продемонстрирует,
как промоделировать поток пешеходов и простейшие сервисы в Пешеходной библиотеке AnyLogic.
Шаг 1. Создание новой модели.
Вначале мы создадим новую модель.
Начиная с версии 6.4, AnyLogic предоставляет пользователям
возможность использования шаблонов моделей при создании но144
вых моделей. Если раньше Вам приходилось всегда начинать создание модели «с чистого листа», зачастую выполняя одни и те же
типовые действия для каждой новой создаваемой модели, то теперь
Вы можете перепоручить выполнение первых, базовых, шагов Мастеру создания модели. Все, что Вам нужно – это указать, какой метод моделирования Вы будете использовать и выбрать те опции, которые Вам нужны в модели – и Мастер автоматически создаст простейшую модель, а Вы сможете продолжить ее разработку, лишь
изменив незначительные детали.
Создайте новую модель.
1. Щелкните мышью по кнопке панели инструментов Создать
. Появится окно Мастера создания модели.
2. Задайте имя новой модели. В поле Имя модели введите Subway
Entrance. 3. Выберите каталог, в котором будут сохранены файлы модели.
Если Вы хотите сменить предложенный по умолчанию каталог на
какой-то другой, Вы можете ввести путь к нему в поле Местоположение или выбрать этот каталог с помощью диалога навигации по файловой системе, открывающегося по нажатию на кнопку Выбрать.
4. Щелкните мышью по кнопке Далее. Откроется вторая страница Мастера создания модели.
5. Здесь Вам будет предложено выбрать шаблон модели, на базе
которого Вы будете разрабатывать Вашу модель. Поскольку мы хотим научить Вас процессу создания модели «с нуля», чтобы в дальнейшем Вы могли самостоятельно создавать аналогичные модели,
не выбирайте шаблон модели, а просто закончите создание модели,
щелкнув мышью по кнопке Готово.
Вы создали новую модель. Если Вы еще не знакомы с пользовательским интерфейсом AnyLogic, то давайте уделим пару минут его
основным компонентам:
Пользовательский интерфейс AnyLogic.
В левой части рабочей области будет находиться панель Проекты. Панель Проекты обеспечивает легкую навигацию по элементам
моделей, открытых в текущий момент времени. Поскольку модель
организована иерархически, то она отображается в виде дерева:
сама модель образует верхний уровень дерева; эксперименты, классы активных объектов и Java классы образуют следующий уровень; элементы, входящие в состав активных объектов, вложены в
соответствующую подветвь дерева класса активного объекта и т. д.
В правой рабочей области будет отображаться панель Палитра,
а внизу – панель Свойства. Панель Палитра содержит разделенные
145
по категориям элементы, которые могут быть добавлены на диаграмму класса активного объекта или эксперимента. Панель Свойства используется для просмотра и изменения свойств выбранного
в данный момент элемента (или элементов) модели.
В центре рабочей области AnyLogic Вы увидите графический редактор диаграммы класса активного объекта Main. При работе с моделью не забывайте сохранять производимые
Вами изменения с помощью кнопки панели инструментов Сохранить .
Шаг 2. Создание анимации.
Теперь мы готовы к тому, чтобы начать разработку нашей модели.
Прежде всего, нам нужно создать анимацию модели. С помощью анимации Вы сможете визуально отображать поведение модели, кроме того анимация нужна для того, чтобы графически задать
объекты среды модели.
Чтобы облегчить рисование, мы вначале добавим изображение
плана павильона метро. Мы не будем рисовать план в графическом
редакторе, а просто вставим уже готовое изображение.
Добавьте рисунок с изображением плана павильона.
1. Вначале откройте закладку Презентация панели Палитра.
Чтобы открыть какую-либо закладку панели Палитра (именуемую
в дальнейшем палитрой), нужно щелкнуть мышью по заголовку
этой палитры. 2. Палитра Презентация содержит элементы, используемые для
рисования презентаций моделей: фигуры, с помощью которых Вы
можете рисовать сложные презентации, а также элементы управления, с помощью которых Вы можете сделать Ваши презентации
интерактивными.
3. Перетащите элемент Изображение
из палитры Презентация на диаграмму класса активного объекта. Поместите его так,
как показано на рис. 5.1.
4. Задайте свойства изображения в панели Свойства. Щелкните мыщью по кнопке Добавить и выберите файл изображения плана павильона. Файл находится в каталоге <каталог AnyLogic>\
resources\tutorials\Subway Entrance\entrance_layout.png Вы увидите добавленное изображение в области предварительного просмотра на панели Свойства (рис. 5.2).
5. Чтобы сохранить исходный размер изображения, установите
флажок Исходный размер.
6. Заблокируйте изображение, установив флажок Блокировать. Вы не сможете выбрать заблокированную фигуру в графиче146
Рис. 5.1
Рис. 5.2
ском редакторе до тех пор, пока Вы не снимете с нее блокировку.
Мы делаем так потому, что мы будем рисовать другие фигуры поверх этого изображения, и поэтому мы хотим исключить возможность случайного редактирования изображения при рисовании
этих фигур.
7. Изображение должно будет выглядеть следующим образом
(рис. 5.3).
147
Рис. 5.3
Теперь мы нарисуем на анимации объекты моделируемой среды.
Вначале мы нарисуем границу моделируемого нами пространства, играющей роль стен здания.
Нарисуйте границы здания.
1. Чтобы было легче рисовать, лучше отключить сетку и увеличить масштаб анимации с помощью соответствующих кнопок панели инструментов:
2. Нарисуйте ломаную, как показано на рис. 5.4. Чтобы нарисовать ломаную, сделайте двойной щелчок мышью по элементу
Ломаная в палитре (при этом его значок должен поменяться на
этот: ). Теперь Вы можете рисовать ломаную точка за точкой, последовательно щелкая мышью в тех точках диаграммы, куда Вы
хотите поместить вершины ломаной. Чтобы завершить рисование,
добавьте последнюю точку ломаной двойным щелчком мыши.
3. Измените свойства только что нарисованной ломаной:
– Назовите ломаную walls.
148
Рис. 5.4
– Измените цвет и толщину линии, чтобы она была более заметна на презентации.
– Сделайте ломаную замкнутой. Установите флажок Замкнутая. Тем самым, Вы сделаете ломаную замкнутой, соединив ее первую и последнюю точки (рис. 5.5).
Зачастую границы моделируемого пространства рисуются с помощью нескольких фигур, поэтому у Пешеходной библиотеки есть
требование, чтобы все такие фигуры были добавлены в одну группу, а эта группа была указана в параметре Стены соответствующего
библиотечного объекта. Поэтому сейчас мы добавим нарисованную
нами ломаную линию walls в группу.
Рис. 5.5
149
Добавьте ломаную в группу.
1. Добавьте только что нарисованную ломаную в группу. Щелкните по ней правой кнопкой мыши (при этом она должна подсветиться синим цветом) и выберите Группировка|Создать группу из
контекстного меню.
Теперь нужно задать области входа и выхода пешеходов.
Вначале мы нарисуем область входа – линию, в которой пешеходы будут появляться. Область входа может быть задана линией
или ломаной.
Нарисуйте вход.
1. Перетащите элемент Линия из палитры Презентация в
графический редактор (в место, показанное на рис. 5.6).
2. Перетащите точки линии так, чтобы они были расположены
примерно в тех же местах диаграммы, что и точки линии на рисунке.
3. Назовите линию entry. Позднее мы будем ссылаться на эту
линию в блоках диаграммы процесса именно по этому имени.
Нарисуйте выход.
1. Аналогично нарисуйте линию выхода пешеходов из моделируемого пространства. При достижении линии выхода пешеходы
будут удаляться из моделируемой среды (рис. 5.7).
2. Назовите линию exit.
Обе линии должны находиться полностью внутри фигуры, задающей границу моделируемой среды – в нашем случае – внутри
ломаной линии walls.
Шаг 3. Моделирование потока пассажиров.
Теперь мы закончим создание модели, моделирующей простейший
пассажиропоток, создав диаграмму моделируемого нами процесса.
С помощью диаграммы процесса в моделях пешеходной динамики задается поведение пешеходов (так же, как в Основной библиотеке с их помощью задается поведение заявок). Диаграмма про-
Рис. 5.6
150
Рис. 5.7
цесса в AnyLogic создается путем добавления объектов библиотеки
из палитры на диаграмму класса активного объекта, соединения
их портов и изменения значений свойств объектов в соответствии с
требованиями Вашей модели. Попадающие в моделируемую систему пешеходы будут последовательно проходить по блокам созданной Вами диаграммы процесса. Помимо объектов, составляющих диаграмму процесса, модели Пешеходной библиотеки состоят из объектов, моделирующих
объекты среды (стены, различные области, сервисы, очереди и
т. д.). Чтобы задать объект среды, Вы должны вначале графически
нарисовать его на анимации, а затем добавить соответствующий
объект библиотеки на структурную диаграмму активного класса
модели и задать необходимые свойства этого объекта.
Создайте диаграмму процесса.
1. Добавьте на диаграмму класса Main объекты Пешеходной библиотеки (имена их типов показаны на приведенном рис. 5.8).
Рис. 5.8
151
Рис. 5.9
2. Чтобы добавить на диаграмму объект Пешеходной библиотеки, нужно открыть в панели Палитра палитру этой библиотеки,
щелкнув мышью по панели с ее заголовком, а затем перетащить
нужный Вам объект из палитры на диаграмму класса.
3. Разместите объекты так, как показано на рис. 5.8.
Соедините порты добавленных на диаграмму объектов, как
показано на рис. 5.9.
1. Чтобы соединить порты объектов, сделайте двойной щелчок
мышью по одному порту, затем при желании щелкните в тех местах диаграммы, где Вы хотите добавить точку изгиба соединителя, и завершите создание, сделав двойной щелчок мышью по второму порту. При этом между портами появится соединитель заданной
Вами формы (рис. 5.9).
2. Если Вы выделите соединитель щелчком мыши, и его конечные точки в портах будут подсвечиваться светло-зеленым цветом,
то это будет означать, что Вы успешно соединили порты. Иначе же
Вам придется проверить, точно ли в порт была добавлена одна из
двух конечных точек соединителя, и если нужно, то передвинуть
ее туда.
Согласно принятым стандартам, блоки в диаграмме процесса
обычно располагаются цепочкой слева направо, представляя собой
последовательную очередность операций, которые будут производиться над пешеходом. Теперь, когда мы создали диаграмму моделируемого нами процесса, нам осталось только немного подкорректировать значения
объектов диаграммы в соответствии с нашими требованиями. Давайте последовательно сконфигурируем каждый добавленный
нами библиотечный объект (на приведенном рис. 5.9 мы отметили
тип каждого блока, чтобы Вам было легче привыкнуть к пока незнакомым пиктограммам этих объектов).
Объект PedGround позволяет задавать двумерное пространство
в моделируемой среде, представляющее собой «этаж», т.е. поверхность, по которой будут перемещаться пешеходы. Этажи могут
152
быть ограничены какой-то стеной или быть неограниченными. Стены – это объекты, которые пешеходы не могут пересекать. Стены
являются частью этажа, т. е. одна стена не может быть использована несколькими этажами.
Измените свойства блока pedGround.
1. Свойства объекта (как и любого другого элемента AnyLogic)
можно изменить в панели Свойства.
Обратите внимание, что панель Свойства является контекстнозависимой – она отображает свойства выделенного в текущий момент элемента. Поэтому для изменения свойств элемента нужно
будет предварительно щелчком мыши выделить его в графическом
редакторе или в панели Проекты.
Чтобы у Вас всегда была уверенность в том, что в текущий момент в рабочем пространстве выбран именно нужный Вам элемент,
и именно его свойства Вы редактируете в панели Свойства, обращайте внимание на первую строку, показываемую в панели Свойства – в ней отображается имя выбранного в текущий момент времени элемента и его тип. 2. Задайте стены моделируемого этажа. Введите в поле Стены
(группа, необязательный) имя нашей группы: group, созданной ранее именно для этой цели (рис. 5.10).
Объект PedSource создает пешеходов. Обычно он используется
в качестве начальной точки диаграммы процесса, формализующей
поток пешеходов. В нашем примере он моделирует приход пассажиров в павильон.
Рис. 5.10
153
Измените свойства блока pedSource.
1. Укажите имя объекта PedGround, задающего этаж, на который будут прибывать пассажиры. В поле Этаж (PedGround) введите
имя добавленного Вами ранее объекта PedGround: pedGround.
2. Задайте место на этаже, где будут появляться пассажиры. Место появления пешеходов на этаже может быть задано линией или
ломаной. Введите entry (имя ломаной, нарисованной нами ранее
для этой цели) в поле Место появления (линия, ломаная). Теперь
наши пешеходы будут появляться в случайно выбранной точке линии entry (рис. 5.11).
Следующий объект в созданной нами диаграмме процесса –
PedGoTo. Этот объект моделирует перемещение пешеходов из текущего местоположения в другое (заданное параметром этого объекта). С помощью этого объекта мы будем моделировать то, как пассажиры перемещаются от входа в павильон к поездам метро.
Рис. 5.11
154
Измените свойства блока pedGoTo.
1. Задайте то место, куда будут перемещаться пешеходы, достигшие этого блока в диаграмме процесса. Такое место может быть
задано линией или точкой, нарисованной на презентации. На данный момент мы хотим, чтобы пассажиры, вошедшие в павильон,
сразу двигались к поездам метро. Поэтому введите exit (имя линии,
нарисованной нами на плане у выхода из коридора, ведущего к поездам метро) в поле Цель (точка, линия). Теперь для того, чтобы
покинуть моделируемую среду, пешеходы должны будут вначале
дойти до заданной области выхода (рис. 5.12).
Оставьте заданные по умолчанию свойства объекта PedSink без
изменений. Объект PedSink удаляет поступивших в объект пешеходов из моделируемой среды. Обычно объект используется в качестве конечной точки диаграммы процесса.
Объект PedConfiguration позволяет изменять общие настройки
библиотеки, настроив ее под конкретную задачу таким образом,
чтобы повысить производительность модели.
Измените свойства блока pedConfiguration.
1. Сбросьте флажок Скрыть фигуры среды, чтобы не отображать на анимации фигуры, которые использовались для задания
моделируемой среды (стен, различных областей, сервисов и т. д.)
(рис. 5.13).
Детальное описание объектов Пешеходной библиотеки, их
функций и параметров Вы можете найти в Справочном руководстве
по Пешеходной библиотеке (отдельная книга Справки AnyLogic).
Рис. 5.12
155
Рис. 5.13
Мы закончили создание простой модели павильона метро. Теперь давайте запустим ее и посмотрим, как она работает.
Шаг 4. Настройка запуска модели.
Вы можете сконфигурировать выполнение модели в соответствии с Вашими требованиями. Модель выполняется в соответствии с набором установок, задаваемым специальным элементом
модели – экспериментом. Вы можете создать несколько экспериментов с различными установками и изменять рабочую конфигурацию модели, просто запуская тот или иной эксперимент модели.
В панели Проекты эксперименты отображаются в нижней части
дерева модели. Один эксперимент, названный Simulation, создается по умолчанию. Это простой эксперимент, позволяющий запускать модель с заданными значениями параметров, поддерживающий режимы виртуального и реального времени, анимацию и
отладку модели.
Если мы сейчас запустим модель, то будут моделироваться 100
единиц модельного времени, после чего выполнение модели будет
остановлено. Поскольку Вы можете захотеть наблюдать поведение
модели в течение длительного периода (до того момента, пока Вы
сами не остановите выполнение модели), нужно изменить соответствующие настройки эксперимента.
Уберите условие остановки модели по прошествии заданного
времени.
1. В панели Проекты, выделите эксперимент Simulation:Main
щелчком мыши.
156
2. Перейдите на страницу Модельное время панели Свойства.
Здесь задаются установки модельного времени. Вы можете увидеть, что по умолчанию в качестве единиц модельного времени
в моделях изучения движения пешеходов используются секунды.
3. Чтобы убрать условие остановки модели, выберите Нет из выпадающего списка Остановить.
Шаг 5. Запуск модели.
Постройте Вашу модель с помощью кнопки панели инструментов Построить модель (при этом в рабочей области AnyLogic
должен быть выбран какой-то элемент именно этой модели). Если
в модели есть какие-нибудь ошибки, то построение не будет завершено, и в панель Ошибки будет выведена информация об ошибках,
обнаруженных в модели. Двойным щелчком мыши по ошибке в
этом списке Вы можете перейти к предполагаемому месту ошибки,
чтобы исправить ее (рис. 5.14).
Панель Ошибки
После того, как Вы исправите все ошибки и успешно построите
Вашу модель, Вы можете ее запустить. Запустите модель.
1. Щелкните мышью по кнопке панели инструментов Запустить и выберите из открывшегося списка эксперимент, который
Вы хотите запустить. Эксперимент этой модели будет называться
Subway Entrance/Simulation.
В дальнейшем по нажатию на кнопку Запустить
(или по нажатию F5) будет запускаться тот эксперимент, который запускался Вами в последний раз. Чтобы выбрать какой-то другой эксперимент, Вам будет нужно щелкнуть мышью по стрелке, находящейся
в правой части кнопки Запустить
и выбрать нужный Вам эксперимент из открывшегося списка (или щелкнуть правой кнопкой
Рис. 5.14
157
мыши по этому эксперименту в панели Проекты и выбрать Запустить из контекстного меню).
Запустив модель, Вы увидите окно презентации этой модели.
В нем будет отображена презентация запущенного эксперимента.
AnyLogic автоматически помещает на презентацию каждого простого эксперимента заголовок и кнопку, позволяющую запустить
модель и перейти на презентацию, нарисованную Вами для главного класса активного объекта этого эксперимента (Main).
Щелкните по кнопке Запустить модель и открыть презентацию
класса Main. Модель запустится и Вы сможете пронаблюдать за динамикой моделируемого процесса с помощью нарисованной Вами в
классе Main презентации.
Можно увидеть, что пассажиры входят в павильон и движутся
по коридору, ведущему к поездам метро.
Вы можете изменить скорость выполнения модели с помощью
кнопок панели инструментов Замедлить и Ускорить .
Вы можете переключиться в режим виртуального времени, тогда модель будет выполняться на максимально возможной скорости
и Вы сможете быстро промоделировать работу системы за долгий
период времени. Чтобы переключиться в режим виртуального времени, нужно щелкнуть мышью по кнопке панели инструментов
Виртуальное время Реальное/виртуальное время
.
Когда Вы захотите остановить выполнение модели, щелкните
мышью по кнопке панели управления окна презентации Прекратить выполнение .
Шаг 6. Моделирование турникетов.
Теперь мы добавим в нашу модель турникеты для проверки билетов у пассажиров. Таким образом, мы покажем, как моделируются сервисы в Пешеходной библиотеке.
Вначале мы изменим анимацию модели, а затем – диаграмму
процесса.
Измените анимацию модели.
1. Нарисуйте четыре линии, которые будут графически задавать
турникеты в нашей модели.
2. Чтобы нарисовать линию, сделайте двойной щелчок мышью
по элементу Линия в палитре Презентация (при этом его значок
должен поменяться на этот: ). Затем рисуйте линию согласно
данным на рис. 5.15 инструкциям.
2. Очень важно, где Вы поместите начальную точку линии. Пассажиры будут двигаться от точки, которую Вы нарисуете первой, к
точке, которую Вы нарисуете последней.
158
Рис. 5.15
3. Создайте группу фигур. Группа фигур нужна нам для того,
чтобы сгруппировать нарисованные линии турникетов, поскольку мы хотим задать одним объектом сразу несколько идентичных
сервисов. Выделите все четыре линии (проще всего сделать это, последовательно щелкая по ним мышью с нажатой клавишей Ctrl),
щелкните правой кнопкой мыши по выделенным фигурам и выберите Группировка/Создать группу из контекстного меню. Вы увидите в панели Свойства только что созданной группы. Переименуйте группу в gatesGroup.
4. Нарисуйте линии, которые будут графически задавать очереди к турникетам. Нарисуйте четыре ломаные линии так, как показано на рис. 5.16. 5. Очень важно, где Вы поместите начальную точку ломаной.
Эта точка в нашем случае будет соответствовать началу очереди.
Поэтому ее нужно будет поместить рядом с соответствующим турникетом.
Рис. 5.16
159
6. Добавьте только что нарисованные ломаные в группу фигур
(как это сделать, мы объяснили на примере ранее нарисованных
линий). Назовите эту группу gatesQueuesGroup.
Теперь мы внесем небольшие изменения в диаграмму процесса.
Измените диаграмму процесса.
1. Добавьте новые объекты и соедините их, как показано на
рис. 5.17.
Первым добавленным нами объектом является объект PedServices. Объект PedServices задает группу одинаковых физических объектов обслуживания (например, несколько турникетов
или автоматов по продаже билетов). Объект позволяет задавать
очереди и сервисы в любой комбинации и задавать правила выбора
сервисов – какую очередь выбрать, какой сервис выбрать, к какой
очереди должен обращаться сервис, может ли сервис обслуживать
несколько очередей и т. д.).
Задав такой объект, Вы можете ссылаться на него в диаграмме
моделируемого Вами процесса с помощью блока PedService.
Измените свойства объекта pedServices.
1. Назовите объект gates.
2. Задайте группу фигур, задающую линии точек сервисов (в нашем случае это турникеты). Введите gatesGroup в поле Сервисы
(группа линий) (рис. 5.18).
3. Введите имя группы, задающей очереди к сервисам, в поле
Очереди (группа линий, ломаных): gatesQueuesGroup. Мы задаем в
качестве фигуры группу фигур, содержащую несколько ломаных,
поскольку мы хотим задать несколько очередей (по одной на каждый турникет).
4. Оставьте остальные свойства без изменений. Вы увидите, что
заданное Время задержки распределено по нормальному закону с
Рис. 5.17
160
Рис. 5.18
минимальным значением, равным 2 секундам и максимальным,
равным 3 секундам. Оставьте это значение, поскольку оно является типичным временем задержки при прохождении турникетов.
Функция uniform() является стандартной функцией генератора
случайных чисел AnyLogic. AnyLogic предоставляет функции и
других случайных распределений, таких как нормальное, экспоненциальное, треугольное и т. д. Детальное описание всех функций
вероятностных распределений дано здесь.
5. Оставьте выбранным Тип сервиса: Протяженный. В Пешеходной библиотеке есть два типа сервисов: протяженные и точечные. Протяженные сервисы используются тогда, когда пешеходы
должны пройти вдоль заданной линии сервиса, от начальной точки до конечной. Точечные сервисы используются тогда, когда для
того, чтобы быть обслуженным, пешеход должен просто подойти к
любой точке фигуры, задающей соответствующий сервис. В нашем
примере турникеты моделируются протяженным сервисом.
Измените, свойства объекта PedService. Объект PedService добавляется в диаграмму процесса, чтобы промоделировать, как пешеходы обслуживаются в сервисе, заданном объектом PedServices.
Измените свойства объекта pedService.
1. В поле Сервис (PedServices) укажите имя объекта PedServices,
задающего сервис, через который должны пройти пассажиры (турникеты). Введите здесь gates (имя нашего объекта PedServices)
(рис. 5.19).
161
Рис. 5.19
Запустите модель и проследите за поведением модели с помощью
анимации. Вы можете увидеть, что теперь пассажиры проходят через турникеты. Иногда перед турникетами образуются небольшие
очереди (рис. 5.20).
Рис. 5.20
162
Шаг 7. Изменение интенсивности пассажиропотока.
Теперь мы хотим показать Вам, как можно динамически изменять параметры объектов Pedestrian Library. В текущей модели интенсивность пассажиропотока задана фиксированной величиной.
Мы же хотим иметь возможность интерактивно изменять интенсивность во время выполнения модели, чтобы проверить, насколько модель устойчива к возможным увеличениям нагрузки. Для
этого мы добавим специальный элемент управления.
Добавьте бегунок, чтобы менять интенсивность пассажиропотока.
1. Откройте палитру Элементы управления и перетащите элемент Бегунок
из палитры на диаграмму класса Main (справа от
плана павильона) (рис. 5.21).
2. Измените свойства бегунка. Мы хотим изменять с помощью
этого бегунка значение параметра rate объекта pedSource. Для этого установите флажок Связать с и введите имя параметра, который
мы хотим варьировать, в расположенном справа поле: pedSource.
rate (рис. 5.22).
3. Мы хотим дать возможность пользователю варьировать количество приходящих в минуту пешеходов от 0 до 100. Введите 100/
minute() в поле Максимальное значение.
4. Щелкните по кнопке Добавить метки... на странице свойств
бегунка. Тем самым, мы создадим рядом с бегунком три текстовые метки, которые будут отображать его минимальное, текущее и
максимальное значения.
Чтобы другим пользователям модели было понятнее, какой
именно параметр варьирует добавленный нами бегунок, добавьте
рядом с ним поясняющую текстовую метку.
Добавьте текстовую метку для бегунка.
Рис. 5.21
163
Рис. 5.22
1. Добавьте к бегунку текстовую метку с заголовком. Перетащите элемент Текст
из палитры Презентация на диаграмму (выше
бегунка) (рис. 5.23).
2. Введите текст, который Вы хотите показать с помощью этой
метки, в поле Текст:
Запустите модель. Теперь Вы можете интерактивно изменять
интенсивность потока пассажиров с помощью созданного элемента
управления. Таким образом, Вы можете проанализировать, как хорошо система справляется с текущей нагрузкой (рис. 5.24).
Рис. 5.23
164
Рис. 5.24
Шаг 8. Моделирование билетных касс.
Теперь мы добавим в нашу модель билетные кассы.
Изменить анимацию модели.
1. Нарисуйте линии, которые будут графически задавать кассы
в нашей модели. Нарисуйте линии так, как показано на рис. 5.25.
2. Добавьте эти линии в новую группу фигур. Назовите ее windowsGroup.
3. Нарисуйте ломаные линии, которые будут графически задавать очереди к кассам. Нарисуйте ломаные так, как показано на
рис. 5.26.
4. Первую точку ломаной рисуйте рядом с линией, задающей
сервис. Именно эта точка будет соответствовать началу очереди.
5. Добавьте эти ломаные в новую группу. Назовите группу windowsQueuesGroup.
Измените диаграмму процесса.
165
Рис. 5.25
Рис. 5.26
1. Добавьте новые объекты и соедините их, как показано на
рис. 5.27.
Измените, свойства объекта PedServices. Этот объект будет задавать параметры сервиса билетных касс. Измените свойства только, что добавленного объекта pedServices.
1. Назовите этот объект windows.
2. Задайте группу фигур, задающую линии сервисов (окошек билетных касс). Введите windowsGroup в поле Сервисы (группа линий).
3. Введите имя группы, задающей очереди к сервисам, в поле
Очереди (группа линий, ломаных): windowsQueuesGroup.
4. Задайте время обслуживания. Предположим, что время обслуживания распределено по треугольному закону с минимальным
значением, равным 15 секундам, средним – равным 25 секундам,
и максимальным – равным 35 секундам. Введите в поле Время задержки triangular(15*second(), 25*second(), 35*second()).
Рис. 5.27
166
Рис. 5.28
5. Измените Тип сервиса на Точечный. Точечные сервисы используются тогда, когда для того, чтобы быть обслуженным, пешеход должен просто подойти к любой точке фигуры, задающей
соответствующий сервис, и провести там время, заданное как Время обслуживания этого сервиса. В нашем примере билетные кассы
представляют собой именно точечный сервис (рис. 5.28).
Объект PedSelectOutput является блоком принятия решения Пешеходной библиотеки. Пешеход, вошедший в блок PedSelectOutput,
будет перенаправляться в один из пяти выходных портов в зависимости от заданных для этих портов коэффициентов предпочтения.
Объект PedSelectOutput будет перенаправлять пассажиров без
билетов к кассам, а пассажиров с билетами – к турникетам. Измените свойства объекта pedSelectOutput.
1. Задайте коэффициенты предпочтения для пассажиропотоков,
следующих к турникетам (Коэфф. предпочтения 1) и к билетным
кассам (Коэфф. предпочтения 2). В этой модели мы полагаем, что
доля пассажиров, заранее приобретших билеты, значительно выше
(рис. 5.29).
Еще один объект PedService добавляется нами для того, чтобы
направить проходящий через него поток пассажиров на обслуживание в сервис – наши билетные кассы.
Измените свойства только что добавленного объекта pedService.
1. В поле Сервис (PedServices) укажите имя объекта PedServices,
задающего сервис (билетные кассы), где должны быть обслужены
167
Рис. 5.29
проходящие через этот блок пассажиры. Введите windows (имя соответствующего объекта PedServices) в поле Сервис (PedServices).
2. Введите ped.setColor(Color.orange) в качестве действия при
выходе пешехода из объекта. Те пассажиры, которые приобретут
билет в кассе, будут отображаться на анимации желтым цветом
(рис. 5.30).
Рис. 5.30
168
Рис. 5.31
Запустите модель. Вы увидите, что некоторые пассажиры теперь перед тем, как пройти к турникетам, вначале подходят к кассам, чтобы приобрести билет (рис. 5.31).
В результате мы создадим очень простую модель, в которой будет один прямой железнодорожный путь и не будет стрелок. Пассажирские поезда будут останавливаться на одну минуту посередине
этого пути, после чего будут продолжать свое движение в прежнем
направлении.
Вопросы для самопроверки:
1. Обсуждение: в чем заключается разница между переменными
и параметрами?
2. Диаграмма действия выполняется:
a) за 1 единицу времени;
169
b) в течение нулевого времени;
c) зависит от диаграммы.
3. Как можно изменить размер окна презентации?
4. Каким образом можно связать параметр с элементом управления (например, бегунком)?
5. Перечислите все режимы создания заявок объекта Source.
6. Как Вы можете промоделировать создание ограниченного количества заявок?
7. Что будет возвращать функция minute(), если Вы выберете в
качестве единиц модельного времени минуты? А если Вы выберете
часы?
170
6. СОЗДАНИЕ ЖЕЛЕЗНОЙ ДОРОГИ
Шаг 1. Добавление поезда.
Создайте поезд и «запустите» его по пути.
1. Нарисуйте ломаную линию, состоящую из одного участка.
Пусть ломаная начинается в точке с координатами (0,50) и заканчивается в точке (1100, 50). Назовите ее track.
2. Щелкните правой кнопкой мыши по ломаной и выберите Группировка | Создать группу из контекстного меню. Будет создана группа, содержащая только эту ломаную. Назовите эту группу
groupRailYard.
3. Откройте палитру Железнодорожная библиотека и перетащите объект RailYard из палитры на графическую диаграмму, скажем, в точку (50, 100).
4. Введите в поле параметра Группа фигур объекта railYard имя
только что созданной группы: groupRailYard.
5. Перетащите из той же палитры три объекта: TrainSource,
TrainMoveTo и TrainDispose. Поместите и соедините их последовательно, как показано на рисунке ниже (чтобы соединить два порта,
сделайте двойной щелчок по одному соединяемому порту, а затем
одиночный щелчок – по другому порту) (рис. 6.1).
6. Выберите объект trainSource. Задайте у этого объекта следующие параметры:
Объект RailYard: railYard;
Путь (ломаная): track;
Смещение первого вагона, м.: 200;
Крейсерская скорость, м/с: 10.
7. Щелкните мышью по элементу модели (самый верхний элемент дерева) в панели Проекты. Проверьте на странице основных
свойств, что в поле Единицы модельного времени выбраны минуты.
8. Запустите модель. До момента модельного времени 10 ничего
происходить не будет. В момент 10 (и затем – в моменты 20, 30 и
т. д.) в начале пути будет появляться поезд. Он будет перемещаться
вправо и покидать путь.
Рис. 6.1
171
Обратите внимание на параметры объекта trainSource. Мы сконфигурировали объект trainSource так, что он создает поезд на ж/д
узле, помещает его на путь track так, что передний торец его первого вагона расположен в 200 метрах от начала пути. Поезд будет направлен вперед относительно направления пути (см. параметр Направление на пути), поэтому оставшаяся часть поезда расположится между началом пути и точкой 200. В момент своего создания
поезд должен полностью находиться на пути, поэтому Вам нужно
будет проверить, достаточно ли свободного места на пути для его
размещения. По умолчанию у создаваемого объектом TrainSource
поезда 11 вагонов, а длина каждого вагона по умолчанию равна 14
метрам. Поскольку 11*14 = 154 < 200, то места для размещения
нового поезда на пути должно хватить (рис. 6.2).
Простейшая диаграмма железнодорожного процесса: поезд появляется и движется вдоль пути. По умолчанию объект TrainSource
создает поезда каждые 10 минут, поэтому в моменты модельного
времени 10, 20, 30… (как Вы помните, единицами модельного времени являются минуты), объект trainSource будет создавать поезд в
одном и том же месте, и нам нужно убедиться, что ранее добавленный поезд уже освободит требуемую часть пути к моменту создания
следующего поезда. Крейсерская скорость, заданная Вами в объекте
trainSource (10 метров в секунду, что соответствует 36 км/ч), будет
принятой по умолчанию скоростью движения нашего поезда (рис.
6.3). У поезда есть текущая скорость (скорость, с которой он движется в текущий момент времени). При создании поезда объектом
TrainSource его текущая скорость задается равной его крейсерской
скорости, полагается, что поезд уже двигался с этой крейсерской
скоростью. Это делается для того, чтобы сделать возможным немедленное продолжение движения с той же скоростью. В любой момент времени Вы можете изменить скорость путем вызова функции
setVelocity() этого поезда. Теперь взгляните на параметры объекта
trainMoveTo. Вы увидите, что в параметре При начале движения
выбрана опция Продолжать движение с текущей скоростью, в параметре Направление движения выбрано Вперед, что означает, что
поезд появится в модели двигающимся со скоростью 36 км/ч. В объ-
Рис. 6.2
172
екте trainMoveTo не заданы ни цель движения, ни опции маршрутизации поезда, поэтому поезд будет естественным образом покидать
путь track через его правый конец, и заявка-поезд будет покидать
объект trainMoveTo и уничтожаться объектом TrainDispose.
Шаг 2. Добавление остановки поезда.
Теперь давайте промоделируем, как поезд ненадолго останавливается по ходу своего движения.
Добавьте остановку поезда.
1. Откройте палитру Презентация, сделайте двойной щелчок по
элементу палитры Линия и нарисуйте короткую вертикальную линию, пересекающую путь в точке с координатой X=500. Назовите
линию redLine.
2. Выделите объект trainMoveTo и задайте следующие параметры: Маршрут: Вычисляется автоматически от текущего пути до
пути назначения.
Рис. 6.3
173
3. Цель движения: Пересечение заданного пути и линии.
4. Путь: track.
5. Линия: redLine.
6. Запустите модель. Вы увидите, что теперь при достижении
красной линии поезда будут исчезать.
7. Измените диаграмму процесса. Отсоедините объект trainDispose от объекта trainMoveTo и переместите его вправо, чтобы освободить место для двух новых объектов.
8. Переименуйте объект trainMoveTo в toStop.
9. Откройте палитру Enterprise Library и перетащите объект
Delay из палитры в диаграмму процесса, поместив его сразу за объектом toStop. Назовите объект trainStop. Установите для параметра Время задержки значение 1*minute().
10. Снова откройте палитру Железнодорожная библиотека и добавьте оттуда один объект TrainMoveTo, поместив его между объектами trainStop и trainDispose. Назовите его toExit. Соедините
порты этих объектов.
11. Снова запустите модель. Теперь поезд будет останавливаться
у красной линии, задерживаться там на одну минуту, а затем продолжать свое движение к правому концу пути.
В первом объекте TrainMoveTo, который теперь называется
toStop, мы указали цель движения, заданную графически с помощью красной линии. (Обратите внимание, что линия не является
частью группы фигур ж/д узла.) Достигнув красной линии, заявкапоезд покидает объект toStop и поступает в объект trainStop типа
Delay, моделирующий задержку. Пока заявка-поезд находится в
объекте trainStop, поезд не движется. Затем, по истечении одноминутной задержки, заявка-поезд покидает объект trainStop и поступает во второй объект TrainMoveTo (toExit), который перемещает ее дальше (рис. 6.4). В этой диаграмме процесса мы используем
объекты Железнодорожной библиотеки совместно с объектами
Основной библиотеки. Это возможно в силу того, что создаваемый
объектом TrainSource объект Train является подклассом базового
класса заявки Entity. Поэтому поезд может интерпретироваться
как заявка и управляться блоками Основной библиотеки.
Полная диаграмма процесса модели 2D анимация по умолчанию.
Если Вы посмотрите на параметры объекта toExit, то увидите, что в
параметре При начале движения выбрана опция Продолжать движение с текущей скоростью. Вы можете резонно спросить – почему же
поезд начал движение, если его скорость во время остановки была
равна нулю? Ответ таков: мы не просили поезд тормозить и останав174
Рис. 6.4
ливаться во время первого перемещения. Поэтому поезд покинул
объект toStop со скоростью 10 м/с, которая «осталась неизменной» во
время остановки, хотя физически поезд не двигался. Очевидно, что
это неестественное поведение: поезд не может мгновенно останавливаться и мгновенно набирать необходимую скорость. Но на определенном уровне абстракции, не требующем излишней точности на физическом уровне, такое упрощение может быть допустимо. Теперь давайте добавим торможение поезда перед остановкой и ускорение при
возобновлении движения.
Добавьте ускорение / торможение.
1. Выделите объект toStop и выберите из группы кнопок При
окончани движения опцию Затормозить и остановиться.
2. Выделите объект toExit и выберите из группы кнопок При начале движения опцию Ускорять/тормозить до крейсерской скорости.
3. Запустите модель. Попробуйте менять значения крейсерской скорости, торможения и ускорения (они заданы в объекте
TrainSource). Если нужно, замедлите выполнение модели.
Шаг 3. Добавление 3D анимации.
Закончим создание нашего примера добавлением трехмерной
анимации моделируемого процесса.
Добавьте 3D анимацию.
1. Щелкните по группе groupRailYard и установите флажок Отображать на 3D сцене на странице свойств Основные.
175
2. Щелкните правой кнопкой мыши по группе и выберите Выделить содержимое группы из контекстного меню. При этом будут
выделены все фигуры ж/д узла.
3. На странице свойств Дополнительные введите 1 в поле Z-Высота.
4. Откройте палитру 3D и перетащите элемент 3D Окно на графическую диаграмму, под диаграмму процесса. Измените размер
окна (пусть он будет примерно равен 1000x250 пикселей).
5. Запустите модель. Переместите камеру так, чтобы было лучше видно путь и поезд.
По умолчанию вагонам приписаны достаточно схематичные
фигуры 3D анимации. Но Вы всегда можете заменить их, загрузив
другое трехмерное изображение вагона с помощью элемента 3D
объект или, что еще проще, просто использовав в качестве фигуры
анимации вагона один из готовых к использованию трехмерных
объектов, расположенных в палитре AnyLogic 3D Объекты.
Используйте готовые 3D объекты в качестве фигур анимации
вагонов.
1. Откройте палитру 3D Объекты. Перетащите элементы Пассажирский вагон и Локомотив из палитры куда-нибудь на диаграмму
класса.
2. Выделите объект trainSource.
3. Введите в поле параметра Анимация вагонов {shape1, … }:
{locomotive, passengerCar}.
Хотя в нашем поезде всего 11 вагонов, мы можем использовать
только две фигуры в списке: последняя фигура будет использоваться в качестве анимации для всех оставшихся вагонов. В нашем случае такая возможность представляется крайне удобной: все вагоны, за исключением первого – пассажирские, и могут отображаться одной и той же фигурой.
4. Запустите модель. Посмотрите на 3D анимацию поезда. Вы
можете заметить, что фигуры вагонов на анимации накладываются друг на друга.
Это происходит потому, что трехмерные изображения вагонов имеют различную длину (как и в реальной жизни), а объект
TrainSource использует для всех вагонов одну, заданную по умолчанию для объекта RailCar, длину, равную 14 метрам. Нам нужно
задать различные длины для наших вагонов. Это может быть сделано в параметре Длины вагонов, м. объекта TrainSource или в коде
его параметра Инициализация вагона.
5. Выделите объект trainSource. Введите в поле параметра Длины вагонов, м.: {14, 27}.
176
Рис. 6.5
В AnyLogic трехмерные изображения локомотива и всех типов
грузовых вагонов в палитре 3D Объекты имеют длину 14 метров, а
пассажирский вагон – 27 метров.
6. Поскольку наш поезд стал длиннее, нам нужно так изменить
его начальное расположение, чтобы все вагоны помещались на
путь. Введите в поле параметра Смещение первого вагона, м.: 14 +
27*10 + 10. (Последнее слагаемое, 10, добавлено для надежности,
ведь могут произойти численные ошибки вычисления.)
7. Запустите модель.
Нарисуйте платформу в месте остановки поезда.
1. Откройте палитру 3D и перетащите Прямоугольник на холст
диаграммы.
1. Измените, размер и местоположение прямоугольника следующим образом (для этого Вам может понадобиться изменить масштаб):
X: 265, Y:52, Ширина: 285, Высота: 10. Прямоугольник должен
появиться прямо под путем, слева от красной линии.
Выберите в свойстве прямоугольника Цвет линии: Нет цвета, а в
свойстве Цвет заливки – текстуру concrete (бетон).
На странице свойств прямоугольника Дополнительные задайте:
Z: 2, Z-Высота: 1.
177
Снова запустите модель.
Запущенная модель Train Stop. Местоположение камеры было
изменено (рис. 6.5).
Вопросы для самопроверки
1. Как AnyLogic отделяет обычные фигуры презентации от фигур сети? Как сеть узнает о том, какая именно группа фигур задает
топологию этой сети?
2. Опишите ситуацию, в которой может быть крайне полезна
блокировка фигур.
3. Как Вы можете задать скорость движения сетевого ресурса?
4. Какие объекты Вы использовали для того, чтобы добавить/
извлечь заявку из зоны хранения?
178
Библиографический список
1. Блок, А. А. Курс лекций по дисциплине Моделирование систем:
учеб. пособие. Архангельск: Изд-во Арх. гос. техн. ун-та, 2009. – 96 с.
5. Боев, В. Д. Компьютерное моделирование. Элементы теории и
практики: учеб. пособие. СПб.: ВАС, 2009. – 156 с.
2. Варжапетян А. Г. Имитационное моделирование на GPSS/H:
монография. М.: Вузовская книга, 2007. – 201 с.
3. Гурьев, Т. А. Имитационное моделирование процессов лесного
комплекса: учеб. пособие. Архангельск: Изд-во Арх. гос. техн. ун-та,
2003. – 188 с.
4. Емельянов, В. В. Имитационное моделирование систем: учеб.
пособие для вузов М.: Изд-во МГТУ им. Н. Э. Баумана, 2009. – 583 с.
5. Карпов, Ю. Г. Имитационное моделирование систем. Введение
в моделирование на AnyLogic 6. СПб: БХВ-Петербург, 2006. – 400 с.
6. Каталевский, Д. Ю. Основы имитационного моделирования
и системного анализа в управлении. М.: Изд-во МГУ, 2011. – 312 с.
7. Кобелев, Н. Б. Основы имитационного моделирования сложных экономических систем: учеб. пособие для вузов. М.: Дело,
2003. – 336 с.
8. Колесов, Ю. Б., Сениченков, Ю. Б. Моделирование систем.
Объектно-ориентированный подход: учеб. пособие. СПб.: БХВПетербург, 2006.
9. Колесов, Ю. Б., Сениченков, Ю. Б. Моделирование систем.
Практикум по компьютерному моделированию: учеб. пособие.
СПб.: БХВ-Петербург, 2007.
10. Лоу, А., Кельтон, Д. Имитационное моделирование. СПб.:
Питер, БХВ-Петербург, 2004.
11. Лычкина, Н. Н. Имитационное моделирование экономических процессов. М.: Инфра-М, 2012. – 256 с.
12. Максимей, И. В. Имитационное моделирование сложных систем. Минск: Изд-во БГУ, 2009. – 264 с.
13. Митюков, Н. В. Имитационное моделирование в военной
истории. М.: Изд-во ЛКИ, 2007. 280 с.
14. Павловский, Ю. Н. Опыт имитационного моделирования при
анализе социально-экономических явлений. М.: М3 Пресс, – 2005. –
136 с.
15. Рыжиков, Ю. И. Имитационное моделирование: Теория и технологии. СПб.: Корона. 2004. – 384 с.
16. Строгалев, В. П. Имитационное моделирование. М.: Изд-во
МГТУ им. Н. Э. Баумана, 2008. – 280 с.
179
17. Худякова, Е. В. Имитационное моделирование экономических процессов в АПК. М.: ФГОУ ВПО МГАУ, 2006. – 192 с.
18. Шеннон, Р. Имитационное моделирование – искусство и наука. М.: Мир, 1978.
19. Шрайбер, Т. Дж. Моделирование на GPSS. М.: Машиностроение, 1980.
20. «Экс Джей Текнолоджис» www.xjtek.ru.
180
СОДЕРЖАНИЕ
Введение........................................................................... 3
1. Разработка модели банковского отделения......................... 10
Вопросы для самопроверки.................................................. 47
2. Разработка модели отделения офтальмологии.................... 48
Вопросы для самопроверки.................................................. 75
3. Модель распространения продукта по Бассу....................... 76
Вопросы для самопроверки.................................................. 119
4. Агентная модель распространения продукта по Бассу.......... 120
Вопросы для самопроверки.................................................. 143
5. Павильон метро.............................................................. 144
Вопросы для самопроверки:................................................. 169
6. Создание железной дороги............................................... 171
Вопросы для самопроверки:................................................. 178
Библиографический список................................................. 179
Учебное издание
Латыпова Рамиля Рамисовна
КОМПЬЮТЕРНЫЙ ПРАКТИКУМ
ПО ANYLOGIC
Учебное пособие
Редактор В. П. Зуева
Верстальщик С. Б. Мацапура
Сдано в набор 2.09.13. Подписано к печати 18.11.13.
Формат 60×84 1/16. Бумага офсетная. Усл. печ. л. 10,6.
Уч.-изд. л. 11,6. Тираж 100 экз. Заказ № 587.
Редакционно-издательский центр ГУАП
190000, Санкт-Петербург, Б. Морская ул., 67
Документ
Категория
Без категории
Просмотров
1
Размер файла
5 741 Кб
Теги
latipova
1/--страниц
Пожаловаться на содержимое документа