extracted_text:
МИНИСТЕРСТВО
КУЛЬТУРЫ РОССИИ

Федеральное
государственное бюджетное образовательное учреждение высшего образования
«ТЮМЕНСКИЙ
ГОСУДАРСТВЕННЫЙ ИНСТИТУТ КУЛЬТУРЫ»
Кафедра
информатики и информационных технологий

ИМИТАЦИОННОЕ МОДЕЛИРОВАНИЕ

Методические указания по выполнению
практических работ
для студентов направления:
080500.62 «Бизнес - информатика»

очной формы обучения

Тюмень, 2016
СОДЕРЖАНИЕ
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА.. 3
ОБЩИЕ ТРЕБОВАНИЯ К ВЫПОЛНЕНИЮ ПРАКТИЧЕСКИХ ЗАНЯТИЙ.. 4
КРИТЕРИИ ОЦЕНКИ ПРАКТИЧЕСКИХ РАБОТ. 4
Практическая работа №1. 5
Практическая работа №2. 9
Практическая работа №3. 16
Практическая работа №4. 32
Практическая работа №5. 54
Практическая работа №6. 88
Практическая работа №7. 131
Практическая работа №8. 150
Практическая работа №9. 192
Практическая работа №10. 237
Практическая работа №11. 257
СПИСОК ЛИТЕРАТУРЫ.. 278

ПОЯСНИТЕЛЬНАЯ
ЗАПИСКА
Методические указания по выполнению
практических работ составлены в соответствии с рабочей программой по дисциплине
«Имитационное моделирование» для направления 080500.62 «Бизнес - информатика».
Практические работы занимают важное место
при изучении дисциплины «Имитационное моделирование». Целями освоения
дисциплины «Имитационное моделирование» являются формирование теоретических
знаний и практических навыков проведения имитационного моделирования для
анализа экономических процессов и систем.
В результате выполнения практических работ
студент должен:
знать:
-
теоретические
основы имитационного моделирования;
-
содержание
процесса имитационного моделирования и область применения имитационного моделирования;

-
программное
обеспечение, используемое для целей имитационного моделирования;
-
приёмы
формализации и алгоритмизации основных экономических процессов.
уметь
-
осуществлять
формализацию конкретных экономических задач для разработки имитационных моделей;

-
выбирать
показатели и критерии эффективности операций с экономическими системами при их
имитационном моделировании, моделировать процессы в экономических системах;
-
рассчитывать
показатели эффективности операций с экономическими системами при их имитационном
моделировании;
-
осуществлять
анализ результатов имитационного моделирования экономических процессов.
владеть:
-
разработки
компонентов имитационных моделей;
-
отладки
имитационных моделей;
-
построения
и использования модели для описания и прогнозирования различных явлений,
осуществления их качественного и количественного анализа;
-
использования
систем моделирования GPSS и AnyLogic для решения задач имитационного
моделирования.
Методические указания по выполнению
практических работ состоят из пояснительной записки, критериев оценки работы
студента, общих требований к выполнению и оформлению практических работ,
содержания практических работ, которые снабжены основными теоретическими
положениями, заданиями, контрольными вопросами и списком литературы.
На выполнение каждой работы отводится
определенное количество часов в соответствии с тематическим планом.
Выполнять работы рекомендуется на
компьютере под управлением операционной системы Windows XP/Vista/2007 с
пользованием прикладных программам MS Office Excel, GPSS и AnyLogic
с соблюдением техники безопасности.
Методические указания по выполнению
практических работ окажут помощь преподавателям в организации и управлении
работой студентов в процессе занятий, а студенты могут использовать их как
пособие для повторения изученного материала, подготовке к зачёту.
ОБЩИЕ ТРЕБОВАНИЯ К ВЫПОЛНЕНИЮ ПРАКТИЧЕСКИХ ЗАНЯТИЙ
1.
Ход работы:
1.
Выполнить
практические задания.
2.
Описать
ход выполнения заданий.
3.
Ответить
на контрольные вопросы.
1. Форма отчетности:
Практические
занятия должны оформляться в отдельной тетради и содержать:
-    номер и тему
занятия;
-    условия заданий;
-    подробное решение
заданий;
-    ответы на
контрольные вопросы.
КРИТЕРИИ ОЦЕНКИ ПРАКТИЧЕСКИХ РАБОТ
Основными
критериями оценки выполненной студентом и представленной для проверки
работы являются:
1.
Степень
соответствия выполненного задания поставленным требованиям;
2.
Структурирование
и комментирование практической работы;
3.
Уникальность
выполнение работы (отличие от работ коллег);
4.
Успешные
ответы на контрольные вопросы.
«5 баллов» - оформление
соответствует требованиям, критерии выдержаны, защита всего перечня контрольных
вопросов.
«4 балла» - оформление
соответствует требованиям, критерии выдержаны, защита только 80 % контрольных
вопросов.
«3 балла» - оформление соответствует требованиям,
критерии выдержаны, защита только 61 % контрольных вопросов.

Практическая работа №1
Тема:
Простейший
поток требований
Цель:
-
научиться определять, является поток событий
Вид
работы:
фронтальный
Время
выполнения:
2 часа
Теоретические сведения
Поток
событий – последовательность
однотипных ситуаций, наступающих одна за другой в случайные моменты времени
(пример, поток отказов и поток восстановлений,  поток вызовов на телефонной
станции, поток покупателей в магазине).
Поток
событий можно наглядно изобразить рядом точек на оси времени

Рисунок - Изображение потока событий на оси времени
Характеристики
потоков событий:
1)
Интенсивность потока событий
() – это
среднее число событий, приходящееся на единицу времени.
2)
Регулярность, поток называют регулярным если события следуют одно
за другим через равные промежутки времени
3)
стационарность, поток называется стационарным,  если его
вероятностные характеристики не зависят от времени.
4)
Отсутствие последствия, поток называется потоком без последствия, если для
любых двух непересекающихся отрезков и  число событий, попадающих на один из
отрезков, не зависит от числа событий, попадающих на др.
5)
Ординарность, поток событий называется ординарным, если события в
нем появляются поодиночке, а не группами по нескольку сразу.
Поток
событий называется простейшим (или стационарным пуассоновским), если он
обладает сразу тремя свойствами: 1) стационарен, 2) ординарен, 3) отсут-ие
последействия. Простейший поток обязательное понятие для аналит-го
моделирования.
Для
простейшего потока с интенсивностью  интервал Dt между соседними событиями имеет так называемое показательное
(экспоненциальное) распределение с плотностью

где - параметр показательного закона, Dt>0.
Примерами могут
быть:
- поток вызовов на
телефонной станции;
- поток включений
приборов в бытовой электросети;
- поток грузовых
составов, поступающих на железнодорожную станцию;
- поток
неисправностей (сбоев) вычислительной машины;
- поток выстрелов,
направляемых на цель, и т. д.
Простейшим
потоком вызовов называется стационарный ординарный поток без последействия.
Основные характерные свойства простейшего потока выражают следующие определения
этого потока:
1.)
ординарный поток без последействия с постоянным параметром λ
(0<λ<∞);
2.)
интенсивность простейшего потока равна его параметру μ=λ;
3.)
поток без последействия, для которого вероятность Pi(t) поступления
i вызовов на промежутке длиной t определяется формулой (распределением)
Пуассона:
,
Вероятность не поступления ни одного соб (i=0):

Противоположное событие:

4.)
поток с независимыми промежутками zk (k=1,2,…) между вызовами,
распределенными по одинаковому экспоненциальному закону:
,
5а.)
плотность распределения вероятностей промежутков времени между вызовами:
,
5б.)
распределения промежутка времени между вызовами подчинено показательному закону
и является достаточным условием существования простейшего потока;
6.)
если известно, что случайный промежуток времени z, распределенный по
показательному закону длится уже некоторое время τ, то закон распределения
оставшейся части промежутка будет также показательным и с тем же параметром
μ не будет зависеть от τ;
7.)
объединение независимых простейших потоков с параметрами λ1,
λ2, λ3 очевидно, тоже будет простейшим потоком
с параметром (λ1+ λ2+ λ3);

Рис 1.4.
Разъединение и объединение Пуассоновского потока.
8.)
сумма большого числа малых станционных потоков близка к простейшему;
9.)
математическое ожидание промежутка z между вызовами:
,
10.)
дисперсия промежутка z между вызовами:
,
11.)
среднеквадратическое отклонение промежутка t:
,
12.)
математическое ожидание числа вызовов за промежуток t:
,
13.)
дисперсия числа вызовов за промежуток t:
,
14.) совпадение  за промежуток  для
простейшего потока на практике удобно использовать при проверке соответствия
реального потока модели простейшего потока времени между вызовами подчинено
показательному закону и является достаточным условием существования простейшего
потока.
Задания к практической работе
Задание.
1.
Из
таблиц Приложения согласно варианту, заданному преподавателем, выписать задачу.
2.
С
помощью программы MS Excel рассчитать теоретические значения частоты
требований, соответствующие пуассоновскому потоку.
3.
Сравнить
теоретические значения частоты требований и практические, заданные по варианту.
4.
Сделать
вывод, является ли заданный по варианту поток простейшим Пуассоновским.
Ход работы
1.
Пусть
путем наблюдений составлен график прибытия заявок в СМО за 10 минут. Данные
занесли в таблицу:

2.
Найдем
среднее значение числа прибытий за 10 минут. Для этого умножим каждое значение
в строке 1, на соответствующее значение в строке 2 и сложим полученные
значения. (Например значение в ячейке В1 равно 5, умножим его на значение в
ячейке В2 равный 1% или 0,01 и т.д.) Результат отображается в ячейки А3.
Найденное значение соответствует числу λ*t, где λ - представляет
собой среднее количество прибытий за выбранную единицу времени, t - время. В
четвертом строке вычислим предполагаемые вероятности по распределению Пуассона
по формуле:

В результате получается следующая таблица:

3.
Сравним
теоретический и практический законы распределения. Для этого найдем разность
между каждым элементом второй и четвертой строки, а затем, среднее значение.
Получается - 0%.
4.
Следовательно,
данный закон распределения, подчиняется закону Пуассона
Приложение. Проверить, подчиняется ли данный
закон закону распределения Пуассона:
Вариант
1

Вариант
2

Вариант
3

Вариант
4

Вариант
5

Вариант
6

Вариант
7

Вариант
8

Вариант
9

Вариант
10

Вариант
11

Вариант
12

Контрольные вопросы
1.
Что
такое СМО?
2.
Приведите
классификацию СМО.
3.
Приведите
примеры параметров СМО.
4.
Что
такое поток?
5.
Какой
поток называют простейшим?
6.
Какой
процесс называют марковским?
7.
Что
такое процесс с дискретными состояниями?
8.
Что
такое процесс с непрерывным временем?
9.
Что
означает условие отсутствия последействия?
10.
Что
такое граф состояний?
Практическая работа №2
Тема:
Моделирование
на основе метода Монте- Карло
Цель:
- научиться
выполнять имитационное моделирование стохастических процессов методом
статистических испытаний (Монте-Карло).
Вид
работы:
фронтальный
Время
выполнения:
2 часа
Порядок выполнения работы
1.
Ознакомьтесь с
постановкой задачи.
2.
Выберите
условие задачи в соответствии с номером варианта из табл. 1.
3.
Заполните
расчетную таблицу MS Excel по аналогии с примером выполнения для задания 1.
4.
Составьте
программу на языке Паскаль, имитирующую статистический эксперимент по аналогии
с примером выполнения для задания 2. Выполните расчеты
5.
Сравните
результаты расчетов в MS Excel с результатами расчетов с помощью
Паскаль-программы и точным значением вероятности отказа системы.
Задания к практической работе
Условие задачи
Задана схема соединения приборов,
составляющих систему контроля качества продукции. Вероятность отказа каждого из
приборов в течение времени t одинакова и равна P1.
Приборы выходят из строя независимо друг от друга. Используя метод
статистических испытаний (метод Монте-Карло), найти вероятность Р
того, что система откажет за время t.
Задание 1
Выполнить имитационное моделирование
эксперимента средствами табличного процессора MS Excel. Выполнить расчеты для 10
экспериментов, каждый из которых включает в себя 1000 испытаний
системы. Для имитации состояния прибора в испытании использовать стандартную
функцию СЛЧИС. Искомую вероятность отказа системы определить как
среднее значение по результатам 10 экспериментов.
Задание 2
Выполнить имитационное моделирование эксперимента
средствами языка программирования Паскаль. Для имитации состояния прибора в
испытании использовать стандартную функцию Random. Предусмотреть
в программе ввод значений числа экспериментов и числа испытаний системы в одном
эксперименте. Выполнить расчеты для разных значений числа экспериментов (m)
и числа испытаний в эксперименте (n). Заполнить таблицу с
результатами расчетов в документе MS Word.
Описание процедуры моделирования
Обычно числа, полученные с помощью
программного генератора случайных чисел, подчиняются равномерному закону
распределения. На практике это означает, что вероятности появления любого
из чисел из некоторого заданного интервала одинаковы.
Допустим, все случайные числа принадлежат
интервалу [0,1). Тогда попадание сгенерированного числа в интервал [0, 0.1)
будет соответствовать выходу из строя испытуемого прибора, если эта вероятность
равна 0.1. Попадание числа в интервал [0.1, 1) будет соответствовать
безотказной работе прибора (рис. 1).

Рисунок 1 - Моделирование работы прибора

В том случае, если вероятность отказа
  каждого прибора равна 0.2, отказ прибора имитируется попаданием случайного
  числа в интервал [0, 0.2). Если вероятность отказа каждого прибора равна 0.3,
  отказ прибора имитируется попаданием случайного числа в интервал [0, 0.3) и
  т.д.

Так будет моделироваться работа любого из
приборов, составляющих систему контроля качества. Компьютерная генерация
случайных чисел, количество которых равно количеству приборов в системе, с
проверкой условия, соответствующего схеме соединения приборов, будет
соответствовать одному испытанию со всей системой. Под экспериментом
будем понимать серию последовательных испытаний.
Построенная модель позволит многократно
имитировать испытания, фиксируя всякий раз результат (безотказная работа или отказ
системы). При большом количестве испытаний отношение числа отрицательных
исходов (система вышла из строя) к общему числу испытаний даст приближенное
значение вероятности Р выхода из строя системы за время t.
Пример выполнения работы
Выполним расчеты для схемы соединения
приборов, показанной на рис. 2 для P1=0.1.

Рисунок 2 - Схема соединения приборов в системе
контроля качества
В этом случае испытание каждого прибора
моделируется в соответствии с рис. 1. Анализ схемы соединения приборов (рис. 2)
позволяет сделать вывод, что вся система выйдет из строя, если хотя бы один из
приборов выйдет из строя. В условиях имитационной модели этот факт
формулируется следующим образом: если хотя бы одно из трех случайных
чисел, полученных в результате имитации испытания системы, попадает в интервал
[0, 0.1), фиксируется отказ всей системы в данном испытании.
Задание 1. Выполним
имитационное моделирование эксперимента средствами табличного процессора MS
Excel.
Для генерации случайных чисел в
электронной таблице MS Excel используется стандартная функция СЛЧИС().
Функция возвращает равномерно распределенное случайное число, большее либо
равное 0 и меньшее 1.
Для имитации испытаний системы заполним
таблицу, показанную на рис. 3. При заполнении столбца Номер испытания
введем значения 1 и 2 в ячейки А2 и А3
соответственно. Затем выделим эти ячейки и «протянем» вниз до ячейки А1001,
используя маркер заполнения. В ячейку В2 введем формулу =СЛЧИС()
и «протянем» сначала вправо на ячейки С2 и D2, а
затем вниз до ячеек В1001:D1001.

Рисунок 3 - Таблица с имитацией испытаний в режиме
показа формул
В ячейку Е2 введем формулу =ЕСЛИ(ИЛИ(B2<0,1;C2<0,1;D2<0,1);0;1).
Эта формула фиксирует состояние системы, полученное в испытании с номером 1.
Если хотя бы один прибор выходит из строя (ИЛИ(B2<0,1;C2<0,1;D2
<0,1)), то фиксируется отказ всей системы (значение в ячейке Е2
равно 0), в противном случае система работоспособна (значение в ячейке Е2
равно 1). Используя маркер заполнения, распространим формулу на ячейки
диапазона Е3:Е1001.
Для удобства работы с таблицей скроем
строки с 13 по 999, выделив их и выбрав из контекстного меню (открывается
щелчком правой кнопки мыши) команду Скрыть.
В ячейку F2 введем формулу
для вычисления вероятности отказа системы по результатам 1000 испытаний.
За вероятность принимается отношение числа зафиксированных отказов к общему
числу испытаний: =СЧЁТЕСЛИ(E1:E1001;0)/1000.
С целью возможности управления
экспериментом установим пересчет формул на рабочем листе в ручном режиме,
выполнив в меню Формулы – Вычисление – Параметры вычислений – вручную
(рис. 4). В этом случае для имитации серии испытаний (пересчета значений
рабочего листа таблицы) потребуется нажимать на клавиатуре клавишу <F9>.

Рисунок 4 - Установка параметров пересчета формул
рабочего листа таблицы
В ячейки диапазона G2:G11
введем номера экспериментов от 1 до 10 (рис. 5). В ячейки Н2:Н11
будем заносить вычисленные в каждом эксперименте значения из ячейки F2.
В ячейку Н12 внесем формулу для вычисления среднего
арифметического значения вероятности отказа системы по результатам 10
экспериментов: =СРЗНАЧ(H2:H11).

Рисунок 5 - Расчетная таблица, имитирующая испытания
системы
Опишем последовательность действий,
имитирующих один эксперимент:
P нажимаем на
клавиатуре клавишу <F9>;
P выделив ячейку F2,
Щелкните правой кнопкой мыши – Копировать;
P выделив ячейку
столбца Н, соответствующую номеру эксперимента, выполняем Щелкните
правой кнопкой мыши – Специальная вставка… – значения (в ячейку будет
вставлено вычисленное значение вероятности).
Полученное в результате расчетов значение
в ячейке Н12 даст нам приближенное значение вероятности отказа
системы. Для оценки точности полученного с помощью имитационной модели значения
вероятности можно сравнить его с точным значением вероятности отказа системы,
вычисленным по формулам теории вероятностей, которое для рассматриваемого
случая равно 0.271.
Задание 2. Выполним
имитационное моделирование эксперимента средствами языка программирования
Паскаль.
В программе на языке программирования
Паскаль для включения генератора случайных чисел используется процедура
Randomize. Функция Random возвращает случайное число типа Real из диапазона [
0, 1 ).
Введем соответствие обозначений в
программе и задаче (табл. 1).
Таблица 1 - Соответствие
обозначений в задаче и в программе

В задаче

В программе

Тип переменной в программе

Количество
  экспериментов

m

word (целый)

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

n

word (целый)

Текущий
  номер эксперимента

j

word (целый)

Текущий
  номер испытания в рамках эксперимента

i

word (целый)

Состояние
  прибора 1 в испытании с номером i

k1 [ i ]

массив типа real (вещественный)

Состояние
  прибора 2 в испытании с номером i

k2 [ i ]

массив типа real (вещественный)

Состояние
  прибора 3 в испытании с номером i

k3 [ i ]

массив типа real (вещественный)

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

kol

word (целый)

Вероятность
  отказа системы в каждом эксперименте

p

real (вещественный)

Сумма
  вероятностей отказа системы по всем экспериментам

sum

real (вещественный)

Среднее
  значение вероятности отказа системы по результатам всех экспериментов

sred

real (вещественный)

В окне редактора Turbo Pascal
введем с клавиатуры текст программы (текст комментариев, заключенный в
фигурные скобки, вводить не нужно):
Program MonteCarlo;                                                                                {1}
Var i, j, n, m, kol : word;                                                                                {2}
k1, k2, k3 : array [ 1 .. 2000 ] of real;                                                                          {3}
p, sred, sum : real;                                                                                {4}
begin                                                                                {5}
Randomize; {Запуск
генератора случайных чисел}                                                {6}
Repeat                                                                                {7}
Writeln ( ' Введите число
экспериментов >=1 и <=1000 ' );                               {8}
Readln ( m );                                                                                {9}
until ( m >= 1 ) and ( m <= 1000 );                                                                              {10}
Repeat                                                                                {11}
Writeln ( ' Введите число
испытаний >=100 и <=2000 ' );                                 {12}
Readln ( n );                                                                                {13}
until ( n >= 100 ) and ( n <= 2000
);                                                                           {14}
sum := 0;                                                                                {15}
for j := 1 to m do {Цикл по номеру
эксперимента}                                 {16}
begin                                                                                {17}
kol := 0;                                                                                {18}
for i := 1 to n do {Цикл по номеру испытания}
                                                      {19}
begin                                                                                {20}
k1 [ i ] := random; k2 [ i ] := random; k3
[ i ] := random;                                     {21}
if ( k1 [ i ] < 0.1) or ( k2 [ i ] <
0.1) or ( k3 [ i ] < 0.1) then kol := kol + 1;         {22}
end;                                                                                {23}
p := kol / n; writeln ( ' Вероятность
отказа системы = ' , p : 8 : 4 );              {24}
sum := sum + p;                                                                                {25}
end;                                                                                {26}
sred := sum / m;                                                                                {27}
writeln ( ' Среднее
значение вероятности отказа системы = ', sred : 8 : 4 );{28}
readln                                                                                {29}
end.                                                                                {30}
Комментарий к программе
Строка 1 – заголовок программы;
Строки 2, 3, 4 – описание
переменных программы;
Строки 5, 30 – начало и конец
исполнительной части программы;
Строка 6 – запуск генератора случайных
чисел;
Строки 7, 8, 9, 10 – ввод числа
экспериментов с контролем ввода данных;
Строки 11, 12, 13, 14 – ввод числа
испытаний с контролем ввода данных;
Строка 15 – обнуление
переменной для накопления суммы вероятностей;
Строки 16, 17, 26 – границы цикла
(начало и конец) по номеру эксперимента;
Строка 18 – обнуление
счетчика числа отказов системы в каждом эксперименте;
Строки 19, 20, 23 - границы цикла
(начало и конец) по номеру испытания в рамках одного эксперимента;
Строка 21 – имитация одного
испытания системы (присваивание элементам массивов k1 [ i ], k2 [ i ], k3 [ i ]
случайных значений из интервала [0, 1), имитирующих состояние прибора в
испытании с номером i );
Строка 22 – анализ
состояния системы (отказ или исправное состояние) в зависимости от значений k1
[ i ], k2 [ i ], k3 [ i ] и изменение значения счетчика (переменная kol) в
случае отказа системы в текущем испытании;
Строка 24 – вычисление и
вывод значения вероятности отказа системы по результатам текущего эксперимента;
Строка 25 – вычисление
суммы вероятностей отказа системы по результатам всех экспериментов;
Строки 27, 28 – вычисление и
вывод среднего значения вероятности отказа системы по результатам всех
экспериментов;
Строка 29 – задержка экрана
вывода результатов работы программы.
Выполним расчеты по программе для разных
значений m и n и зафиксируем эти результаты в
таблице (табл. 2).
Таблица 2 - Результаты расчетов по методу Монте-Карло

Номер расчета

Число экспериментов (m)

Число испытаний в эксперименте (n)

Вероятность отказа системы

1.

10

100

0.2670

2.

10

1000

0.2665

3.

10

2000

0.2720

4.

100

100

0.2744

5.

100

1000

0.2715

6.

100

2000

0.2709

7.

1000

100

0.2704

8.

1000

1000

0.2712

9.

1000

2000

0.2709

Анализ результатов расчетов позволяет
принять за приближенное значение вероятности отказа значение P = 0.27.
Сравним полученное значение с точным значением вероятности отказа системы,
вычисленным по формулам теории вероятностей, которое равно 0.271.
В рассмотренном случае относительное отклонение вычисленного по методу
Монте-Карло значения вероятности от точного значения составляет менее 0.37% ((0.271
- 0.27) *100 / 0.271 = 0.369%).
Таблица 3 - Варианты заданий

№ варианта

Вид схемы соединения приборов в системе
  контроля качества продукции

Значение P1

Точное значение вероятности P
  отказа системы (используется для контроля правильности расчетов)

1,
  19

0.1

0.109

2,
  20

0.2

0.232

3,
  21

0.3

0.363

4

0.3

0.027

5

0.4

0.064

6

0.5

0.125

7,
  22

0.3

0.1719

8,
  23

0.2

0.0719

9,
  24

0.4

0.2944

10,
  25

0.4

0.4384

11,
  26

0.3

0.3189

12,
  27

0.2

0.2064

13,
  28

0.1

0.1981

14,
  29

0.2

0.3856

15,
  30

0.3

0.5541

16

0.1

0.3439

17

0.2

0.5904

18

0.05

0.1855

Контрольные вопросы
1.
От
каких условий зависит точность метода Монте-Карло?
2.
Можно
ли находить с помощью метода Монте-Карло площади фигур в многомерной области?
3.
Назовите
области применения метода Монте-Карло.
Практическая работа №3
Тема: Графическое
изображение статистических данных и прогнозирование в Microsoft Excel
Цель:
-
изучение возможностей Microsoft Excel для графического представления данных и
прогнозирования.
Вид
работы:
фронтальный
Время
выполнения:
2 часа
Теоретические сведения
Понятие
прогнозирования. Виды прогнозов
Проблема
прогнозирования, вследствие быстрых и трудно предсказуемых изменений внешней
среды, является особенно сложной. С учетом этих трудностей и ошибок в прогнозах
многие специалисты были вынуждены заговорить о тщетности прогнозирования. На
самом деле прогнозирование – это обязанность, которую в явной или неявной форме
должны выполнять все организации.
Различие
понятий «планирование» и «прогнозирование»
Несмотря на
актуальность проблемы прогнозирования в современной экономической литературе
существуют неоднозначные трактовки терминов «планирование» и «прогнозирование».
В связи с этим, прежде всего, следует определиться с содержанием указанных
понятий.
Под прогнозированием
будем понимать процесс исследования, направленный  на выявление тенденций
развития объекта и его внешнего окружения.
Прогноз – это вероятностное
научно-обоснованное суждение о перспективах, возможных состояниях того или
иного объекта или явления в будущем.
Планирование же предполагает
разработку комплекса действий (мероприятий) по достижению желаемого результата,
определение последовательности и сроков их реализации.
Процесс
прогнозирования
Процесс
прогнозирования включает в себя ряд последовательных этапов, представленных на
рисунке 1.

Рисунок 1 - Процесс
прогнозирования
Прогнозирование – процесс
сложный, трудоемкий и весьма дорогостоящий для компании, поэтому исходным
этапом процесса прогнозирования является идентификация потребности в прогнозной
информации.
Субъект
прогнозирования
– это организация,  подразделение  или отдельное лицо, осуществляющее
разработку прогноза.
Заказчик прогноза - организация,
подразделение или отдельное лицо, выдающее задание на прогноз, выступающее
инициатором его разработки.
Потребитель
прогноза
- организация, подразделение или отдельное лицо, использующее его результаты в
своей деятельности. В отдельных случаях потребителем прогноза может являться
заказчик.
Процесс
прогнозирования в организации должен быть формализован, т.е. должна быть
описана методика его разработки, последовательность прохождения по всем
подразделениям с четким указанием применяемых методов построения прогноза,
сроков и форм подачи информации. Если это не сделано, то процесс
прогнозирования будет происходить стихийно. Выявляя отклонения прогнозных
значений от фактических, невозможно будет выявить причины и разработать
мероприятия для недопущения этих ошибок в будущем и повышения точности
прогнозирования.
Выбор метода
прогнозирования зависит от множества факторов, в т.ч. от наличия данных,
желаемой точности прогноза, временных и стоимостных затрат на его разработку, а
также от необходимого вида прогноза. Классификация видов прогнозов по различным
признакам представлена в таблице 1.
Таблица 1. - Виды
прогнозов

Признак
  классификации

Виды прогнозов

1.
  По горизонту прогнозирования

- краткосрочные
  (до 1 года, но обычно квартал);
- среднесрочные
  (от 1 года до 3 лет);
- долгосрочные (на
  3 года и более).

2.
  По типу прогнозирования

- поисковые
  прогнозы (построенные на основе выявленных причинно-следственных связей);
- нормативные прогнозы
  (строятся в результате анализ временных рядов);
- основанные на
  творческом видении (или экспертные оценки).

3.
  По степени вероятности будущих событий

- вариантные
  (предусматривается несколько вариантов развития событий);
- инвариантные
  (имеется только 1 вариант).

4.
  По способу представления результатов

- точечный прогноз
  - конкретное значение показателя (например, объем продаж в 2015 году составит
  2,5 млн.руб. );
- интервальные
  прогнозы представляют собой диапазон значений (например, объем продаж в 2015
  году составит от 2 до 3 млн.руб.).

5. По охвату рынка (в зависимости от
  того, что охватывает прогноз)

- глобальный;
- региональный;
- номенклатурная
  группа;
- отдельный
  товар/услуга.

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

Рисунок 2 - Классификация
методов прогнозирования
Количественные
методы прогнозирования требуют значительного количества статистических данных и
при их отсутствии не могут быть использованы. К количественным методам
прогнозирования относятся:
- методы анализа
временных рядов;
- каузальные или
причинно-следственные методы.
Методы
анализа временных рядов
Временным рядом называется
последовательность значений некоторого показателя во времени.
Например:
- количество
пользователей Интернет по годам;
- телефонная
плотность по годам;
- объем продаж и
т.д.
Различают два вида
временных рядов:
- моментные;
- интервальные.
В моментном ряду
значения рассматриваемого показателя отнесены к определенным моментам времени
(см.табл.2).
Таблица 2 –
Моментный ряд

Момент времени

t1

t2

t3

…

tn

Значение показателя

Y1

Y2

Y3

…

Yn

при этом
считается, что t1< t2< t3<…< tn
В интервальном
ряду указаны соответствующие промежутки времени, интервалы (см.табл.3).
Таблица
3 – Интервальный ряд

Момент времени

[t0,
  t1]

(t1,
  t2]

…

(tn-1,
  tn]

Значение показателя

Y1

Y2

…

Yn

Графически они
могут быть представлены следующим образом:

Рисунок 3 –
Моментный ряд

Рисунок 4 –
Интервальный ряд
В задачах
прогнозирования методы анализа временных рядов используются при наличии
значительного количества значений рассматриваемого показателя из прошлого и при
условии, что наметившаяся тенденция ясна и относительно стабильна.
Задания к практической работе
Задание
1. Законспектируйте
теоретическую часть практической работы №2.
Задание
2.
Модель с аддитивной компонентой
Моделью с
аддитивной компонентой называется модель, в которой вариация значений
переменной описывается в виде суммы компонент. Аддитивную модель
прогнозирования можно представить в виде формулы:
F = T + S +E
где F –
прогнозируемое значение,
T – трендовая
составляющая,
S – сезонная
компонента,
E – случайная
составляющая или ошибка прогноза.
Алгоритм анализа
сезонности представлен на рисунке 5.

Рисунок 5 – Алгоритм
анализа сезонности
Рассмотрим процесс
построения модели с аддитивной компонентой на примере.
Имеются данные по
объему продаж компании за последние 13 кварталов (см. табл.4). Необходимо
проанализировать имеющийся массив данных на наличие сезонных колебаний и
составить прогноз на следующий квартал с помощью моделей с аддитивной и
мультипликативной компонентой. Выбрать модель, обеспечивающую наибольшую
точность расчетов.
Таблица 4 –
Исходные данные

Алгоритм
построения прогноза на основе аддитивной модели
1.
Расчет
значений сезонной компоненты
1.1.
На
основе исходных данных (см. табл.4) построим точечную диаграмму

Рисунок 6 – Точечная
диаграмма
Из рисунка видно,
что объем продаж подвержен сезонным колебаниям. Для того чтобы элиминировать
влияние сезонной компоненты воспользуемся методом скользящей средней.
1.2.
Расчет
среднего значения объема продаж за 4 квартала (столбец 5)

Рисунок 7 - Расчет
скользящего среднего
Введенные формулы
необходимо растянуть на весь диапазон ячеек (D5:D14). Рассчитанные значения уже
не содержат сезонной компоненты и соответствуют середине года, т.е. находится
между 2 и 3 кварталом. Далее данные необходимо центрировать.
1.3.
Расчет
центрированной скользящей средней
Центрированная
скользящая средняя (столбец 6) рассчитывается по формуле средней арифметической
простой. Пример расчета представлен на рисунке:

Рисунок 8 - Расчет
центрированной скользящей средней
Разность между
фактическим значением объема продаж и центрированной скользящей средней и будет
составлять величину сезонной компоненты и ошибки.

Рисунок 9 - Оценка
сезонной компоненты
Далее необходимо
рассчитать средние значения сезонной компоненты. Расчет проведем в следующей
таблице:

Рисунок 10 - Логика
расчета скорректированных значений сезонных компонент
Сумма сезонных
компонент за четыре квартала должна быть равна нулю. Если это условие не
выполняется, то значения сезонных компонент необходимо скорректировать.
Например, сумма сезонных компонент = - 0,2 Делим эту величину на 4 квартала
(-0,2 / 4 = -0,05) и полученный результат прибавляем к каждой компоненте с
противоположным знаком.

Рисунок 11 - Расчет
скорректированных значений сезонных компонент
На этом расчет
сезонных компонент окончен.
2.
Десезонализация
данных. Расчет тренда.
Десезонализация
данных состоит в вычитании значений сезонной компоненты из фактических
значений: Q – S = T + E

Рисунок 12 - Десезонализация
данных
Формулу, введенную
в ячейку Е30 необходимо растянуть на диапазон (E31:Е42). Полученные оценки
можно использовать для построения тренда.
На основе данных
десезонализированного ряда необходимо построить набор трендовых моделей
(линейную, степенную, экспоненциальную, логарифмическую) и выбрать трендовую
модель, обеспечивающую наибольшую точность аппроксимации (R2).

Рисунок 13 - Линейная
трендовая модель

Рисунок 14 - Экспоненциальная
трендовая модель

Рисунок 15 - Логарифмическая
трендовая модель

Рисунок 16 - Степенная
трендовая модель
Из рисунков 12-16
видно, что наибольшая точность аппроксимации достигается в линейной трендовой
модели. Для определения трендовой составляющей в полученное уравнение вместо x
необходимо подставить порядковый номер квартала.

Рисунок 17 - Определение
прогнозируемых значений
Построенная модель
позволяет определить прогнозируемый объем продаж. Он равен сумме сезонной и
трендовой составляющих.
3.
Расчет
ошибок. Оценка точности прогноза
Аддитивная модель
имеет вид:
Q = T + S + E.
Значения сезонной
и трендовой составляющих уже найдены. Вычитая эти значения из фактических
объемов продаж, получим значения ошибок.
Q- T- S = E.

Рисунок 18 - Расчет
ошибки
Для оценки
точности прогноза рассчитывают следующие показатели:
3.1.
Среднее
абсолютное отклонение (MAD – mean absolute derivation)

где n – число
уровней временного ряда, для которых определялось
прогнозное
значение,
         - прогнозное значение
показателя,
         -  фактическое
значение.
Использование этой
характеристики полезно в тех случаях, когда исследователю требуется получить
оценку точности в тех же единицах, в которых измерены уровни исходного
временного ряда.
Среднее абсолютное
отклонение показывает, на какое количество единиц измерения (кол-во
пользователей, тыс. руб. и т.д.) в среднем отклоняется в большую или меньшую
сторону наш прогноз. Позволяет определить ошибку в конкретных единицах
измерения.
3.2.
Средняя ошибка аппроксимации (MAPE
– mean absolute percentage error)

Значение MAPE характеризует величину, на
которую теоретические уровни, рассчитанные по модели, в среднем отклоняются от
фактических. Для получения вывода о точности прогноза может быть использована
следующая шкала (см.табл.5).
Таблица 5 - Оценка
точности прогноза по критерию MAPE

Значение средней
  абс. ошибки в процентах (MAPE)

Точность
  прогнозной модели

Менее 10%

Очень высокая

10-20%

Высокая

20-50%

Удовлетворительная

Более 50%

Неудовлетворительная

3.3.
Средняя процентная ошибка (MPE –
mean percentage error)
используется для оценки смещения прогноза,
т.е. получения информации о том, является ли прогноз переоценивающим или
недооценивающим

если MPE < 0, прогноз переоценивающий
(характерно систематическое завышение прогнозируемого показателя по сравнению с
фактическими значениями).
MPE > 0,
прогноз недооценивающий (характерно занижение показателя).
Кроме того, при
выборе лучшего метода прогнозирования часто используют среднеквадратическую
ошибку (MSE - mean squared errors).
3.4.
Среднеквадратическая
ошибка (MSE – mean squared errors)

Для оценки
точности модели рекомендуется создать следующую расчетную таблицу:

Рисунок 19 - Оценка
точности прогноза
Для определения
абсолютного значения показателя (модуля) рекомендуется использовать встроенную
функцию MS Excel ABS(…). Формулы необходимо растянуть на весь диапазон ячеек,
определить сумму по каждому столбцу и затем итоговое значение показателей
точности.
Для расчета
среднеквадратической ошибки рекомендуется воспользоваться формулой:
=КОРЕНЬ(СУММКВРАЗН(C47:C59;F47:F59)/13)

Рисунок 20 - Результат
оценки точности прогноза
По результатам
выполненных расчетов на основе аддитивной модели можно сделать следующие
выводы:
-
в
среднем прогнозируемый объем продаж отклоняется от фактического в большую или в
меньшую сторону на 3,5 тыс.руб.;
-
средняя
ошибка аппроксимации (MAPE) составляет 2,02%, что говорит о высокой точности
аддитивной модели;
-
средняя
процентная ошибка (MPE) близка к нулю (составляет 0,013%), что означает незначительное
занижение показателя. В целом прогноз близок к несмещенному. Прогнозируемый
объем продаж на следующий (14-ый) квартал составит 362,62 т.р. средняя процентная
ошибка (MPE) близка к нулю (составляет 0,013%), что означает незначительное
занижение показателя. В целом прогноз близок к несмещенному. Прогнозируемый
объем продаж на следующий (14-ый) квартал составит 362,62 т.р.
4.
Модель
с мультипликативной компонентой
Применение мультипликативных
моделей обусловлено тем, что в некоторых временных рядах значение сезонной
компоненты представляет собой определенную долю трендового значения.
Мультипликативная модель в общем виде может быть представлена в виде формулы:
F = T * S * E,
T – трендовая
составляющая,
S – сезонная
составляющая,
E – случайная
составляющая (ошибка прогноза)
Алгоритм
построения модели с мультипликативной компонентой во многом схож с предыдущим.
В процессе разработки мультипликативной модели также необходимо определить
сезонную компоненту. Сезонная компонент будет определяться как отношение
фактического объема продаж к центрированной скользящей средней.
4.1.
Расчет
значений сезонной компоненты

Рисунок 21 - Расчет
сезонной компоненты
Далее необходимо
рассчитать средние значения сезонной компоненты. Т.к. значения сезонной
компоненты в мультипликативной модели – это доли, а число кварталов равно 4, то
сумма сезонных компонент должна быть равна 4. Если это условие не выполняется,
то необходимо выполнить корректировку. Например, сумма сезонных компонент =
4,014
Разница между
фактическим значением и нормативным делится на 4 и прибавляется к каждой
компоненте.

Рисунок 22 - Расчет
скорректированных значений сезонных компонент
Результат
представлен на рис.23.

Рисунок 23 - Результат
расчетов
На этом расчет
сезонных компонент закончен.
4.2.
Десезонализация
данных. Расчет тренда.

Рисунок 24 - Расчет
десезонализированного объема продаж
Далее на основе
данных десезонализированного объема продаж строятся трендовые модели различного
вида (линейная, степенная, экспоненциальная, логарифмическая) и выбирается
модель с наибольшим значением коэффициента детерминации. Эта модель и будет
использоваться для расчета трендового значения (Т). В результате проведенных
расчетов установлено, что наиболее точной является линейная трендовая модель (R2=0,959).

Рисунок 25 - Линейная
трендовая модель
Прогнозные значения
объема продаже (F) рассчитывается  путем произведения соответствующего значения
сезонной компоненты (S) и трендовых значений (T). Дальнейший расчет
показателей, характеризующих точность прогноза, выполняются аналогично расчетам
модели с аддитивной компонентой. Расчеты рекомендуется выполнять в форме
таблицы (см.рис.26).

Рисунок 26 - Оценка
точности прогноза
Таким образом,
наибольшая точность достигается в случае использования модели с аддитивной
компонентой.
Контрольные вопросы
1.  Что такое прогноз?
2.  Для чего
необходимы прогнозы? Поясните цель процесса прогнозирования в организации.
3.  Можно ли считать
термины «план» и «прогноз» синонимами?
4.  Назовите основные
виды прогнозов.
5.  В чем заключается
отличие качественных и количественных методов прогнозирования.
6.  Укажите область
применения метода скользящего среднего, его преимущества и недостатки.
7.  Каким образом
метод скользящего среднего может быть реализован в MS Excel?
8.  Какие виды
трендовых моделей могут быть построены в MS Excel?
Практическая работа №4
Тема:
Моделирование системы массового обслуживания в
AnyLogic
Цель:
-
получить практические навыки построения дискретно-событийных моделей систем в
среде AnyLogic.
Вид
работы:
фронтальный
Время
выполнения:
2 часа
Теоретические сведения
Модель AnyLogic представляет
собой файл с именем, заданным пользователем, и расширением .alp. При создании
новой модели нужно сразу указать полный путь и имя каталога, в котором будет
находиться ваша модель.
1.     Запустите АnyLogic.
2.     Для создания новой
модели щелкните мышью по кнопке Создать модель. Появится диалоговое окно
(см. рис.1), в котором вы должны будете дать имя файлу вашей модели и выбрать
каталог, где он будет храниться. Щелкните по кнопке Далее.

Рисунок 1 –
Создание новой модели
3.     Выберите Начать
создание модели «с нуля». Щелкните по кнопке Готово.
4.     Откроется рабочее
окно AnyLogic (см. рис. 2).

Рисунок 2 –
Рабочее окно AnyLogic
В левой части
рабочей области находится панель «Проект».
Панель «Проект» обеспечивает навигацию по элементам модели, открытых в текущий
момент времени. Поскольку модель организована иерархически, то она отображается
в виде дерева: сама модель образует верхний уровень дерева; эксперименты,
классы активных объектов и Java-классы образуют следующий уровень; элементы,
входящие в состав активных объектов, вложены в соответствующую подветвь дерева
класса активного объекта и т.д.
В правой рабочей
области отображается панель «Палитра», а внизу – панель «Свойства». Панель «Палитра»
содержит разделенные по категориям элементы, которые могут быть добавлены на
диаграмму класса активного объекта или эксперимента. Панель «Свойства»
используется для просмотра и изменения свойств выбранного в данный момент
элемента (или элементов) модели.
В центре рабочей
области AnyLogic открывается графический редактор диаграммы класса активного
объекта Main.
Чтобы добавить объект
на блок-схему модели, щелкните по объекту в окне палитры Enterprise Library и
перетащите его мышью на структурную диаграмму. При этом его свойства будут
отображены на панели «Свойства». В этом окне вы можете изменять свойства
элемента в соответствии с требованиями вашей модели. Позднее для изменения
свойств элемента нужно будет сначала щелчком мыши выделить его на диаграмме или
в дереве проекта.
Объекты должны
взаимодействовать между собой, поэтому вы должны будете соединять их друг с
другом. Можно соединять объекты с помощью мыши, перетаскиванием порта одного
объекта на порт другого или с помощью специального средства «Соединитель». Чтобы
соединить порты объектов, щелкните мышью по кнопке панели инструментов Соединитель,
а затем щелкните мышью поочередно по обоим портам. Точку изгиба можно создать с
помощью мыши.
Модель выполняется
в соответствии с набором конфигурационных установок, называемым экспериментом.
Вы можете создать несколько экспериментов и изменять рабочую конфигурацию
модели, просто меняя текущий эксперимент модели. Один эксперимент, названный Simulation,
создается автоматически. Выберите его щелчком мыши по элементу дерева и изучите
настройки модели в окне Свойства (рис. 3). Окно Свойства имеет
вкладки: основные, дополнительные, модельное время, презентация, окно,
параметры, описание.

Рисунок 3 – Окно Свойства
На вкладке Основные
можно выбрать класс, который будет запущен при запуске модели. По умолчанию в
качестве корневого объекта выбран объект класса Main, автоматически
создаваемого в каждой модели. Вы можете переименовывать классы модели. Для
этого нужно выделить класс щелчком мыши по значку класса в дереве модели и
затем изменить его имя в окне Свойства.
Дополнительные
свойства эксперимента (вкладка Дополнительные) позволяют управлять
выполнением модели. Можно задать действие перед и после запуска модели, а также
задать численные методы для прогона и точность получаемых значений.
На вкладке Модельное
время можно:
1)    Задать единицу
модельного времени.
2)    Задать интервал
времени моделирования.
На вкладе Презентация
можно определить вид и скорость выполнения прогона. В режиме реального
времени задается связь модельного времени с физическим, т.е. задается
количество единиц модельного времени, выполняемых в одну секунду. Режим
реального времени лучше всего подходит для показа анимации. В режиме
виртуального времени модель выполняется без привязки к физическому времени –
она выполняется так быстро, как это возможно. Данный режим лучше всего
подходит, когда требуется моделировать работу системы в течение достаточно
длительного периода времени.
Чтобы запустить
модель, нажмите кнопку Запустить  и выберите из открывшегося списка
эксперимент, который Вы хотите запустить. До запуска модели постройте Вашу
модель с помощью кнопки панели инструментов Построить модель  (при этом в
рабочей области AnyLogic должен быть выбран какой-то элемент именно этой
модели). Если в модели есть какие-нибудь ошибки, то построение не будет
завершено, и в панель Ошибки будет выведена информация об ошибках,
обнаруженных в модели. Двойным щелчком мыши по ошибке в этом списке Вы можете
перейти к предполагаемому месту ошибки, чтобы исправить ее.
При работе с моделью, не забывайте сохранять
производимые Вами изменения с помощью кнопки панели инструментов Сохранить модель. По окончании работы с моделью используйте команды Файл | Сохранить все, затем Файл | Закрыть все.
Задания к практической работе
В ходе выполнения практической
работы необходимо научиться создавать дискретно-событийные модели с помощью
библиотеки Enterprise Library.
При выполнении практической
работы студент сначала выполняет общее задание, а затем индивидуальное задание.
Краткое описание некоторых элементов библиотеки Enterprise Library приводится в
приложение 1.
Задание. Построим с помощью
элементов библиотеки Enterprise Library модель простой системы массового
обслуживания – модель банковского отделения.
В банковском
отделении находятся банкомат и стойки банковских кассиров, которые
предназначены для быстрого обслуживания посетителей банка. Операции с наличностью
клиенты банка производят с помощью банкомата, а более сложные операции, такие
как оплата счетов, – с помощью кассиров.
1. Создайте новую
модель. В свойствах эксперимента Simulation задайте выполнение модели в
режиме реального времени с выполнением одной единицы модельного времени в одну
секунду. В этой модели под единицей модельного времени мы будем понимать одну
минуту работы банковского отделения.
2. Создайте
блок-схему модели, которая пока будет состоять только из банкомата. Для этого
перетащите в окно структуры элементы библиотеки Enterprise Library и соедините
их так, как показано на рис. 4.
Объект source
генерирует заявки (entities) определенного типа через заданный временной
интервал. Заявки представляют собой объекты, которые производятся, обрабатываются,
обслуживаются или еще каким-нибудь образом подвергаются воздействию
моделируемого процесса: это могут быть клиенты в системе обслуживания, детали в
модели производства, документы в модели документооборота и др. В нашем примере
заявками будут посетители банка, а объект source будет моделировать их
приход в банковское отделение.

Рисунок 4 -
Блок-схема модели
Объект queue
моделирует очередь клиентов, ожидающих обслуживания.
Объект delay
моделирует задержку. В нашем примере он будет имитировать банкомат, тратящий
определенное время на обслуживание клиента.
Объект sink
обозначает конец блок-схемы.
3. Запустите
модель.
Для каждой модели,
созданной в Enterprise Library, автоматически создается блок-схема с наглядной
визуализацией процесса, с помощью которой вы можете изучить текущее состояние
модели, например, длину очереди, количество обслуженных человек и т.д.
Для запуска модели
щелкните мышью по кнопке Запустить. Откроется окно с презентацией
запущенного эксперимента. AnyLogic автоматически помещает на презентацию
каждого простого эксперимента заголовок и кнопку, позволяющую запустить модель
и перейти на презентацию (рис. 5), нарисованную вами для главного класса
активного объекта этого эксперимента (Main). Щелкните по этой кнопке.
AnyLogic переключится в режим работы модели. С помощью визуализированной
блок-схемы проследите, сколько человек находится в очереди, сколько человек в
данный момент обслуживается и т.д.

Рисунок 5 – Запуск
презентации
Попробуйте
изменить скорость выполнения модели, переключиться в виртуальный режим. Во
время выполнения модели можно следить за состоянием любого блока диаграммы
процесса с помощью окна инспекта этого объекта (рис. 6). Чтобы открыть
окно инспекта, щелкните мышью по значку блока. В окне инспекта будет отображена
базовая информация по выделенному блоку, например, для блока Queue будет
отображена вместимость очереди, количество заявок, прошедшее через каждый порт
объекта, и т.д.

Рисунок 6 - Окно инспекта
Встройте в файл
отчета полученные характеристики процесса обслуживания. Сколько клиентов пришло
в банк и сколько обслужилось на момент окончания прогона модели?
4. Задайте данные
модели, изменяя свойства созданных объектов (рис. 7).
Откройте окно
свойств объекта source, перейдите на вкладку Параметры. В свойстве
interarrivalTime укажите, как часто в отделение приходят клиенты – exponential(0.67).

Рисунок 7 - Свойства
созданных объектов
Интервал между
приходом клиентов распределен экспоненциально со средним значением, равным 1.5
единицы модельного времени. Заметьте, что аргумент функции exponential()
равен 0.67, потому что в качестве аргумента задается интенсивность прихода
клиентов.
Функция exponential()
является стандартной функцией генератора случайных чисел AnyLogic. AnyLogic
предоставляет функции и других случайных распределений, таких как нормальное,
равномерное, треугольное и т.д. За детальным описанием функций и их параметров
обращайтесь к руководству пользователя или справочнику классов (см. методы
класса Func). Для вызова руководства пользователя, справочника классов
AnyLogic выберите соответствующие пункты меню Справка.
В свойстве capacity объекта queue (рис. 8) задайте
максимальную длину очереди – 15.

Рисунок 8 - Свойства
capacity объекта queue
В свойстве delayTime объекта delay (рис. 9) задайте
время задержки (время обслуживания) –  triangular( 0.8, 1, 1.3 ).

Рисунок 9 -
Свойства delayTime объекта delay
Обслуживание
одного клиента занимает примерно 1 минуту. Здесь время обслуживания
распределено по треугольному закону со средним значением, равным 1 минуте,
минимальным – 0.8 и максимальным – 1.3 минуты.
5. Запустите
модель и проанализируйте ее работу. Как изменились характеристики процесса
обслуживания? Сравните результаты с предыдущим прогоном.
6. Включите сбор
статистики для блоков queue и delay.
AnyLogic позволяет
производить сбор сложной статистики. Для этого нужно лишь включить у объекта
режим сбора статистики, поскольку по умолчанию он отключен для повышения
скорости выполнения модели.
В
системе собирается статистика по длине очереди для блока queue (length) и статистика по коэффициенту использования для блока delay (utilization). Чтобы включить сбор статистики для
объекта, установите переключатель Включить сбор статистики на
вкладке Основные свойств объекта.
Запустите
модель и просмотрите в окне инспекта статистику для блоков queue и delay. Каковы средняя длина
очереди посетителей к банкомату и загрузка банкомата?
7. Добавьте в
модель банковских кассиров.
Можно моделировать
число кассиров, как и банкомат, с помощью объектов delay. Но удобнее
моделировать число кассиров с помощью ресурсов (многоканальное устройство).
Ресурс – это специальный объект Enterprise Library, который может потребоваться
заявке для выполнения какой-то задачи. В нашем примере посетителям банковского
отделения (заявкам) необходимо получить помощь у банковских служащих
(ресурсов).
Добавьте на
диаграмму следующие объекты:
1) selectOutput – является блоком
принятия решения. В зависимости от заданного вами условия, заявка, поступившая
в этот объект, будет поступать на один из двух выходов объекта. Оставьте все
свойства объекта без изменений. Пусть выход true выбирается С заданной
вероятностью, а Вероятность [0..1] равна 0.5. В этом случае к кассирам и
банкомату будет приходить примерно равное количество клиентов;
2) service – блок
захватывает для заявки заданное количество ресурсов, задерживает заявку, а
затем освобождает захваченные ею ресурсы. В нашей модели этот объект будет
моделировать обслуживание клиента кассиром (или каким-то другим служащим
банковского отделения). Задайте следующие свойства объекта: укажите, что в
очереди к кассирам может находиться до 20 человек (свойство queueCapacity); задайте время
обслуживания (свойство delayTime). Будем полагать,
что время обслуживания имеет треугольное распределение с минимальным средним
значением 2.5, средним – 6 и максимальным – 11 минут;
3) ResourcePool – задает ресурсы
определенного типа. Он должен быть подсоединен к объектам, моделирующим занятие
и освобождение ресурсов (в нашем случае это объект Service). В нашем случае
моделирует банковских кассиров. Перейдите в окно свойств объекта и задайте
число кассиров (свойство capacity) – 4.
Соедините объекты
соответствующим образом (рис. 10).

Рисунок 10 -
Соединение объектов
8. Запустите
модель. Сколько посетителей обслужилось у банковских работников и сколько у
банкомата? Какова средняя длина очереди к банкомату? Оцените занятость кассиров
и банкомата.
9. Создайте
анимацию модели.
Сначала изобразим
на анимации следующие элементы: банкомат (в виде кружка) и ведущую к нему очередь
клиентов (в виде ломаной); клиентов анимируем человечками; две диаграммы для
отображения статистики занятости банкомата и очереди к банкомату. Анимация
модели рисуется в той же диаграмме (в графическом редакторе), в которой
задается и диаграмма моделируемого процесса (см. рис. 11).
1)
Перетащите
элемент Овал из палитры Презентация на диаграмму класса активного
объекта.
2)
Перейдите
на страницу Динамические панели свойств данной фигуры. В поле Цвет
заливки введите следующую строку: delay.size() > 0 ? red :
green. Здесь delay
– это имя нашего объекта Delay. Функция size() возвращает число человек,
обслуживаемых в данный момент времени. Во время моделирования будет меняться
цвет фигуры. Если банкомат занят, то цвет кружка будет красным, в противном
случае – зеленым.
3)
На
странице свойств объекта delay введите в поле Фигура анимации
имя нашего овала: oval. Выберите из
выпадающего списка Тип анимации – Одиночная.

4)
Нарисуйте
ломаную, которая будет обозначать на анимации очередь к банкомату (см. рис.
12). Чтобы нарисовать ломаную, сделайте двойной щелчок мышью по элементу Ломаная
в палитре (при этом его значок должен поменяться на этот: ). Далее рисуйте
ломаную точка за точкой, последовательно щелкая мышью в тех точках диаграммы,
куда Вы хотите поместить вершины ломаной. Чтобы завершить рисование, добавьте
последнюю точку ломаной двойным щелчком мыши.  Очень важно, какую точку ломаной
Вы создаете первой. Заявки будут располагаться вдоль нарисованной Вами ломаной
в направлении от конечной к начальной. Поэтому рисуйте ломаную слева направо и
поместите рядом с банкоматом конечную точку ломаной, которая будет соответствовать
в этом случае началу очереди.
5)
На
странице свойств объекта queue введите polyline в поле Фигура
анимации.
6)
Создайте
анимацию клиента. Откройте палитру Картинки. Эта палитра содержит набор
картинок, которые наиболее часто используются пользователями AnyLogic при
создании моделей. Перетащите элемент Человек из палитры на диаграмму
графического редактора и поместите ее за границу видимой области презентации
(т.е. выше верхней границы презентации). Для этого понадобится передвинуть весь
холст диаграммы немного вниз (нажмите правую кнопку мыши и перетащите мышь, не
отпуская кнопки), затем поднимите холст обратно. По умолчанию эта картинка
будет называться person.
7)
Перейдите
в окно свойств объекта source. В поле Фигура анимации заявки
введите имя нашей фигурки человека: person.

Рисунок 11 - Диаграмма моделируемого
процесса
8)
Перейдите
в окно свойств эксперимента. На вкладке модельное время в выпадающем меню Остановить
выберите – нет.
9)    Запустите модель.
Увеличьте скорость выполнения модели. Пронаблюдайте за анимацией Вашей модели.
10) Добавьте диаграмму для отображения
средней занятости банкомата. Для этого перетащите элемент Столбиковая
диаграмма  из палитры Статистика на диаграмму класса и поместите ее
справа от фигуры банкомата.
11) Перейдите на страницу Основные
панели свойств диаграммы. Щелкните мышью по кнопке Добавить элемент данных.
При этом появится  секция свойств того элемента данных, который будет отображаться
на этой диаграмме. Измените Заголовок на Загрузка банкомата.
12) Введите delay.statsUtilization.mean()
в поле Значение. Здесь delay – это имя нашего объекта Delay.
У каждого объекта Delay есть встроенный набор данных statsUtilization,
занимающийся сбором статистики использования этого объекта. Функция mean()
возвращает среднее из всех измеренных этим набором данных значений. Вы можете
использовать и другие методы сбора статистики, такие, как min() или max().
Полный список методов можно найти на странице документации этого класса набора
данных: StatisticsContinuous (на английском языке).
13)
Перейдите
на страницу Внешний вид панели свойств. Измените расположение легенды
диаграммы (справа относительно диаграммы) с помощью кнопок Расположение.
Измените размер диаграммы, как показано на рис. 11.
14)
Аналогичным
образом добавьте еще одну столбиковую диаграмму для отображения средней длины
очереди. Измените ее размер, как показано на рис. 11. Перейдите на страницу Внешний
вид панели свойств диаграммы и измените направление столбцов диаграммы так,
чтобы столбцы столбиковой диаграммы росли влево.
15)
Добавьте
элемент данных, который будет отображаться на диаграмме. Задайте Заголовок:
Длина очереди и задайте Значение: queue.statsSize.mean().
Здесь statsSize – это имя объекта типа «статистика» StatisticsContinuous,
производящего сбор статистики размера очереди объекта Queue.
16)
Запустите
модель и пронаблюдайте за занятостью банкомата и средней длиной очереди с
помощью только что созданных диаграмм.

Теперь добавим анимацию для банковских
кассиров (см. рис. 12):
17)
Нарисуйте
ломаную, которая будет отображать очередь клиентов, ожидающих обслуживания
кассирами. Рисуйте ее, как и раньше, слева направо.
18)
Справа
от этой ломаной нарисуйте еще одну, из четырех точек, чтобы указать на анимации
места, в которых будут находиться банковские служащие.
19)
Нарисуйте
на презентации кассиров. Будем отображать их одной из двух картинок – одна
будет показывать занятого кассира, а другая – свободного. Для этого перетащите
элемент Изображение  из палитры Презентация в то место
диаграммы, где у нас находится человечек. Перейдите в панель Свойства.
Щелкните мышью по кнопке Добавить и выберите файл изображения, которое
будет отображать данная фигура. Картинка busy.png (изображение занятого клерка)
находится в каталоге <каталог AnyLogic>\resources\tutorials\Bank Office.
Чтобы сохранить исходный размер изображения, установите флажок Исходный
размер.

20)
Аналогичным
образом добавьте изображение занятого кассира (клерка).

Рис. 12.
21)
Перейдите
в окно свойств объекта service. Введите polyline1 (имя ломаной,
задающей форму очереди, ведущей к кассирам) в поле Фигура анимации (queue).
22)
Перейдите
в окно свойств объекта resourcePool. В поле Фигура
анимации введите имя ломаной, задающей местоположение кассиров на
презентации: polyline2. Выберите Набор из выпадающего
списка Тип анимации. В поле Фигура анимации свободного ресурса введите
имя изображения свободного клерка: image1. В поле Фигура
анимации занятого ресурса введите image.

23)
Откройте
палитру Элементы управления и перетащите элемент Бегунок из
палитры на нашу диаграмму. Поместите бегунок под объектом ResourcePool,
чтобы было понятно, что с помощью этого бегунка будет меняться количество
ресурсов, задаваемых именно этим объектом (см. рис. 12).
24)
Перейдите
в окно свойств данного элемента. Введите 4 в поле Максимальное значение
(будем варьировать количество клерков от 0 до 4). Введите resourcePool.capacity в поле Связать
с.

10. Запустите
модель. Пронаблюдайте за созданной анимацией. Попробуйте изменить количество
кассиров. Образуется ли очередь перед кассирами? Сделайте вывод о том, сколько
служащих необходимо для нормальной работы банковского отделения при заданной
интенсивности прихода клиентов. Как посмотреть статистику занятости каждого
кассира?
11. Добавьте в
модель сбор статистики о времени обслуживания клиента.
Необходимо
определить, сколько времени клиент проводит в банковском отделении и сколько
времени он теряет, ожидая своей очереди. Такая статистика собирается с помощью
специальных объектов сбора данных. Собранная статистика распределения времени
обслуживания клиентов отображается с помощьюгистограмм.
1) Создайте класс
сообщения Customer (сообщения этого класса будут представлять клиентов
банковского отделения). Для этого в панели Проект, щелкните правой
кнопкой мыши по элементу модели и выберите Создать | Java класс из
контекстного меню. В диалоговом окне Новый Java класс в поле Имя
введите имя нового класса Customer (рис. 13); выберите из выпадающего
списка Базовый класс полное имя данного класса: com.xj.anylogic.libraries.enterprise.Entity
(этот класс будет наследоваться от базового класса заявки Entity).
Щелкните по кнопке Далее.

Рисунок 13 - Ввод
имя нового класса Customer
2) На второй
странице мастера задайте параметры создаваемого Java-класса: enteredSystem
тип double для сохранения момента времени, когда клиент пришел в
банковское отделение; startWaiting тип double для сохранения
момента времени, когда клиент встал в очередь к банкомату (рис. 14).

Рисунок 14 -
параметры создаваемого Java-класса
3) Щелкните по кнопке
Готово. Откроется редактор кода созданного класса (можно его закрыть).
Добавим элементы
сбора статистики. Эти элементы будут запоминать соответствующие значения
времени для каждого клиента и предоставят пользователю стандартную
статистическую информацию: среднее, минимальное, максимальное из измеренных
значений, среднеквадратичное отклонение, доверительный интервал для среднего и
т.п.
4) Перетащите
элемент Данные гистограммы с палитры Статистика на диаграмму
класса Main. Задайте свойства
элемента: Кол-во интервалов – 50; Нач. размер интервала – 0.01;
измените Имя на waitTimeDistr.

5) Создайте еще
один элемент сбора данных гистограммы (Ctrl + перетащите только что
созданный объект данных гистограммы, чтобы создать его копию). Измените Имя
этого элемента на timeInSystemDistr.
6) Перейдите в
свойства блока source и задайте новые свойства. Измените поле Класс
заявки на Customer. В поле Новая
заявка – введите new
Customer().
Это позволит напрямую обращаться к полям класса заявки Customer в коде
динамических параметров этого объекта. В поле Действие при выходе
Введите entity.enteredSystem
= time();.
Этот код будет сохранять время создания заявки-клиента в переменной enteredSystem нашего класса
заявки Customer. Функция time() возвращает текущее значение модельного
времени.

7) Измените
свойства блока queue. Введите Customer в поле Класс заявки. Добавьте код
в поля:
Действие при входе: entity.startWaiting = time();
Действие при
выходе:

waitTimeDistr.add(time()-entity.startWaiting);
Данный код
добавляет время, в течение которого клиент ожидал обслуживания, в объект сбора
данных waitTimeDistr;

8) Измените
свойства блока sink. Введите Customer в поле Класс заявки. Введите в
поле Действие при входе следующий код:
timeInSystemDistr.add(time()-entity.enteredSystem);. Этот код добавляет
полное время пребывания клиента в банковском отделении в объект сбора данных
гистограммы timeInSystemDistr.

9) Запустите
модель и просмотрите статистику с помощью окон инспекта (открыть окно инспекта
можно, щелкнув мышью по значку Данные гистограммы). Зафиксируйте в
отчете статистическую информацию для значений, собранных в данных объектах
сбора статистики.
10) Добавьте гистограмму
для отображения распределения времени ожидания клиента в очереди. Перетащите
элемент Гистограмма из палитры Статистика. Поместите ее под
элементом сбора данных (см. рис. 15). В свойствах гистограммы щелкните мышью по
кнопке Добавить данные и введите в поле Данные имя
соответствующего элемента – waitTimeDistr. На гистограмме будет
отображаться распределение времени ожидания клиента. Измените Заголовок
на Распределение времени ожидания.
11) Аналогичным
образом добавьте еще одну гистограмму, расположите ее под ранее добавленной. В
поле Данные введите timeInSystemDistr. На гистограмме будет
отображаться распределение времени пребывания клиента в системе. Измените, Заголовок
на Распределение времени пребывания.

Рисунок 15 –
Добавление гистограммы для отображения распределения времени ожидания клиента в
очереди
12. Запустите
модель. Включите режим виртуального времени. Какой вид примет распределение
времени ожидания и времени пребывания клиента в системе?
13. Внесите
изменения в модель банковского отделения согласно варианту (см. табл. 1).
Запустите модель. Сравните результаты прогона модели с исходными и новыми
значениями входных данных. Сделайте выводы. Эффективно ли работает система с
новыми значениями интенсивностей входного потока и потока обслуживания? Как
изменилось среднее время ожидания клиента? Влияет ли количество кассиров на
время пребывания клиента в системе?
Таблица 1.

Вари-ант

Распределение
  вероятности прихода клиентов в банк

Вероятность
  обращения  к кассиру/ к банкомату

Время обслуживания
  клиента кассиром

Количество кассиров

1

Экспоненциальное

1/1

4 ± 2

1

2

Экспоненциальное

1/2

6 ± 2

2

3

Экспоненциальное

2/1

8 ± 2

3

4

Экспоненциальное

1/3

7 ± 2

4

5

Экспоненциальное

3/1

9 ± 2

5

6

Нормальное

1/1

8 ± 2

1

7

Нормальное

1/2

7 ± 2

2

8

Нормальное

2/1

9 ± 2

3

9

Нормальное

1/3

4 ± 2

4

10

Нормальное

3/1

6 ± 2

5

11

Треугольное

1/1

2 ± 2

1

12

Треугольное

1/2

7 ± 2

2

13

Треугольное

2/1

9 ± 2

3

14

Треугольное

1/3

4 ± 2

4

15

Треугольное

3/1

6 ± 2

5

16

Равномерное

1/1

4 ± 2

1

17

Равномерное

1/2

6 ± 2

2

18

Равномерное

2/1

7 ± 2

3

19

Равномерное

1/3

8 ± 2

4

20

Равномерное

3/1

9 ± 2

5

14. Самостоятельно
постройте еще одну новую модель системы массового обслуживания. (Варианты
заданий приведены ниже.) Назовите модель smo2.alp. Создайте
анимацию для модели. Анимация модели должна включать следующие элементы:
название и описание модели; слайдеры для задания параметров модели; графики
и/или диаграммы; анимацию процесса обслуживания. Используйте закрашенные
прямоугольники или встройте изображение для задания фона Вашей презентации.
Настройте также две области просмотра презентации модели: область просмотра
логики (схема процесса) и область просмотра анимации. (Область просмотра
задается с помощью палитры Презентация.) Сравните результаты моделирования в GPSS и AnyLogic.
Варианты 1
Имеется некоторая
конвейерная автоматизированная линия по выпуску баночек фруктового сока.

Пустые баночки для фруктового сока
поступают в накопитель 1 автоматизированной линии каждые 3,5 ± 1,1 секунд.
После этого в них автоматически заливается сок. Одновременно может заливаться
лишь одна баночка, на что расходуется 1,5 секунды. Потом баночки
поступают в накопитель 2 для выполнения операции закупоривания. Для этого
расходуется 1,6 секунд времени на каждую баночку. Одновременно может
обрабатываться одна баночка. Потом они попадают в накопитель 3 для следующей
операции. В конце конвейера баночки устанавливаются в ящики. Время установки
одной баночки представляет собой равномерно распределенную случайную величину в
интервале 2,0 ± 0,8 секунд. Одновременно может устанавливаться в
ящик не больше двух баночек. В начале смены в накопителе 2 находится 20
баночек, а в накопителе 3 – 36 баночек. Определите,
какие размеры должны иметь накопители. Промоделируйте работу линии на
протяжении одной смены (8 часов).
Варианты 2
В состав
двухпроцессорной системы входят: два процессора под символическими именами PR1 и PR2 и оперативная
память.

Система обрабатывает потока заявок Z1
и Z2, поступающих в систему по равномерному закону с интервалами 4 ± 2 и 25 ± 2 соответственно. Поток заявок Z2
обрабатывается только на PR1 и придерживает обработку заявок потока Z1,
после чего прерванная заявка до обслуживается. Обслуживание заявок потока Z1
происходит по условию: если очередь PR2 > PR1,то обслуживание
происходит на PR1, иначе на PR2. После обработки на процессорах
заявка помещается в оперативную память. Смоделируйте систему без потерь.
Варианты 3
В небольшом кафе
работают две официантки (А и B) обслуживая по 5 четырехместных
столиков. Официантка А пользуется большей популярностью,
чем официантка В. Приходя в кафе, клиент садится за столик официантки В
только в том случае, если все места за столиками, которые обслуживает официантка
А, заняты. Клиенты приходят в кафе через 2± 1 минут и, если не
застают свободных мест, становятся в очередь. Когда клиент садится на
освободившееся место, он ждет, пока к нему подойдет официантка и примет у него
заказ. Время приема заказа у официантки А занимает 45 ± 15
секунд, у официантки В соответственно 17 ± 4 секунд. Приняв заказ
у клиента, официантки сразу же его выполняют. Время выполнения заказа обеими
официантками составляет 160 ± 20 секунд. После получения заказа клиент
на протяжении 16 ± 4 минут обедает и уходит из кафе. Официантки
обслуживают клиентов по принципу FIFO и в каждый момент времени могут
обслуживать не более одного клиента. Определить время ожидания в
очереди и время, которое клиент проводит за столиком кафе. Промоделируйте
работу кафе на протяжении 10 ч.
Варианты 4
В студенческом машинном зале расположены
две ЭВМ и одно устройство подготовки данных (УПД). Студенты приходят с
интервалом в 8 ± 2 мин, и треть из
них хочет использовать УПД и ЭВМ, а остальные только ЭВМ. Допустимая очередь в
машинном зале составляет четыре человека, включая работающего на УПД. Работа на
УПД занимает 8 ± 1 мин, а на ЭВМ –
17 мин. Кроме того, 20% работавших на ЭВМ возвращается для повторного
использования УПД и ЭВМ. Смоделируйте
работу машинного зала в течение 60 ч. Определите загрузку УПД, ЭВМ и
вероятность отказа в обслуживании вследствие переполнения очереди.
Варианты 5
В вычислительном классе на обработку
принимаются три класса заданий А, В, С. Исходя из наличия
оперативной памяти ЭВМ задания классов А и В могут решаться
одновременно, а задания класса С монополизируют ЭВМ. Задания класса А
поступают через 20 ± 5 мин, класса В
– через 20 ± 10 мин и класса С
– через 30 ± 10 мин и требуют
для выполнения: класс А – 20 ±
5 мин, класс В – 21 ±
3 мин и класс С – 28 ±
5 мин. Задачи класса С загружаются в ЭВМ, если она полностью свободна.
Задачи класса А и В могут до загружаться к решающей задаче.
Смоделируйте процесс обслуживания в течение 80 ч. Определите загрузку ЭВМ.
Варианты 6
Пять операторов работают в справочной
телефонной сети города, сообщая номера телефонов по запросам абонентов, которые
обращаются по одному номеру - 09. Автоматический коммутатор переключает
абонента на того оператора, в очереди которого ожидает наименьшее количество
абонентов, причем наибольшая допустимая длина очереди перед оператором – два
абонента. Если все очереди имеют максимальную длину, вновь поступивший вызов
получает отказ. Обслуживание абонентов операторами длится 30 ± 20 с. Вызовы
поступают в справочную через каждые 5 ± 3 с. Смоделируйте обслуживание 200 вызовов.
Подсчитайте количество отказов. Определите коэффициенты загрузки операторов
справочной.
Вариант 7
Собранные телевизоры проходят серию
испытаний на станции технического контроля. Если оказывается, что
функционирование телевизора ненормально, то отбракованный телевизор передают в
цех наладки, где заменяют неисправные блоки. После наладки телевизор возвращают
на станцию контроля и снова проверяют. Со станции технического контроля
телевизоры после одной или нескольких проверок поступают в цех упаковки.

Телевизоры попадают на станцию
технического контроля каждые 5,5 ± 2,0 минут. На станции работают 2 контролера
одинаковой квалификации. Операция контроля одного телевизора состоит из двух
проверок:
1) для первой проверки каждому контролеру
необходимо 9± 3 минут;
2) для второй проверки на всех контролеров
имеется один тестовый прибор (продолжительность тестирования – 1,2 минут).
Приблизительно 85 процентов телевизоров
успешно проходят проверку и попадают в цех упаковки, а другие 15 процентов – в
цех наладки, в котором находится один рабочий – наладчик. Время наладки (замены)
неисправных блоков распределено в соответствии c равномерным законом в
интервале 30 ±7 минут. Промоделируйте функционирование станции технического
контроля в течение 8 часов.
Вариант 8
Информационно-поисковая библиографическая
система построена на базе двух ЭВМ и имеет один терминал для ввода и вывода
информации. Первая ЭВМ обеспечивает поиск научно-технической литературы
(вероятность обращения к ней – 0,7), а вторая – медицинской (вероятность
обращения к ней – 0,3). Пользователи обращаются к услугам системы каждые 5 ± 2
мин. Если в очереди к терминалу ожидают 10 пользователей, то вновь прибывшие
пользователи получают отказ в обслуживании. Поиск информации на первой ЭВМ
продолжается 6 ± 4 мин, а на второй 3 ± 2 мин. Для установления связи с нужной
ЭВМ и передачи текста запроса пользователи тратят 2 ± 1 мин. Вывод результатов
поиска происходит за 1 мин. Смоделируйте процесс работы системы за 8 часов.
Вариант 9
Изготовление деталей определенного вида
включает длительный процесс сборки, который заканчивается коротким периодом
обжига в печи. Поскольку эксплуатация печи обходится очень дорого, несколько
сборщиков используют одну печь, в которой одновременно можно обжигать только
одну деталь. Сборщик не может начать новую сборку, пока не вытащит из печи
предыдущую деталь. Таким образом, сборщик работает в таком режиме:
1) Собирает следующую деталь.
2) Ожидает возможности использования печи
по принципу FIFO.
3) Использует печь.
4) Возвращается к п. 1.
Время, необходимое на выполнение различных
операций: сборка – 30±5 мин.; обжиг – 8±2 мин.
Необходимо построить на GPSS модель
описанного процесса. Определить оптимальное число сборщиков, использующих одну
печь, т.е. такое количество, которое дает наибольшую прибыль при моделировании
в течение 40 часов модельного времени. Предполагается, что в течение рабочего
дня нет перерывов, а рабочими днями являются все дни (без выходных).
Варианты 10
В вычислительный зал с интервалом времени
10±5 мин. Заходят
пользователи, желающие произвести расчеты на ЭВМ. В зале имеется 8 ЭВМ, к одной
ЭВМ подключен принтер. Время, необходимое для решения задачи и вывода
результатов на печать, составляет 15±5
мин. Вывод результатов на печать не мешает проведению расчетов, время печати
составляет 3±2 мин. В зал не
допускается более 10 студентов. Смоделировать процесс обслуживания 100 пользователей.
Подсчитать число пользователей, не нашедших свободного места в очереди.
Определите среднее число пользователей в очереди, а также коэффициенты загрузки
всех ЭВМ и принтера.
Вариант 11
Самолеты прибывают для посадки в район
крупного аэропорта каждые 10 ± 5 мин. Если взлетно-посадочная полоса свободна,
прибывший самолет получает разрешение на посадку. Если полоса занята, самолет
выполняет полет по кругу и возвращается к аэропорту через каждые 4 мин. Если
после пятого круга самолет не получает разрешения на  посадку, он отправляется
на запасной аэродром. В аэропорту через каждые 10 ± 2 мин к взлетно-посадочной
полосе выруливают готовые к взлету машины и получают  разрешение на взлет, если
полоса свободна. Для взлета и посадки самолеты занимают полосу ровно на 2 мин.
Если при свободной полосе одновременно один самолет прибывает для посадки, а
другой – для взлета, полоса предоставляется взлетающей машине. Смоделируйте
работу аэропорта в течение суток. Подсчитайте количество самолетов, которые
взлетели, сели и были направлены на запасной аэродром. Определите коэффициент
загрузки взлетно-посадочной полосы.
Вариант 12
Вычислительная система состоит из трех
ЭВМ. С интервалом 3 ± 1 мин в систему поступают задания, которые с
вероятностями Р1= 0,4, P2= P3= 0,3 адресуются
одной из трех ЭВМ. Перед  каждой ЭВМ имеется очередь заданий, длина которой не
ограничена. После обработки задания на первой ЭВМ  оно с вероятностью P12 = 0,3 поступает в
очередь ко второй ЭВМ и с вероятностью P13 = 0,7 – в очередь
к третьей ЭВМ. После обработки на второй или третьей ЭВМ задание считается
выполненным. Продолжительность обработки заданий на  разных ЭВМ характеризуется
интервалами времени: Т1= 7 ± 4 мин, T2= 3 ± 1 мин, T3=5
± 2 мин. Смоделируйте процесс обработки 200 заданий. Определите максимальную
длину каждой очереди и коэффициенты загрузки ЭВМ.
Результаты
работы.
Отчет
формируется по мере выполнения задания и состоит из скриншотов результатов
запуска модели, соответствующих пояснений и ответов на вопросы. Для защиты
практической работы студент должен продемонстрировать работу двух моделей:
модель банковского отделения и модель, построенную для индивидуального задания,
и предоставить отчет.
Практическая работа №5
Тема:
Дискретно-событийное
моделирование
Цель:
-
получить практические навыки по дискретно-событийному моделированию на примере
модели банковского отделения.
Вид
работы:
фронтальный
Время
выполнения:
2 часа
Теоретические сведения
Библиотека Моделирования Процессов
AnyLogic поддерживает дискретно-событийный, или, если быть более точным, «процессный»
подход моделирования. С помощью объектов Библиотеки Моделирования Процессов Вы
можете моделировать системы реального мира, динамика которых представляется как
последовательность операций (прибытие, задержка, захват ресурса, разделение,
...) над некими сущностями (entities, по-русски - транзакты, заявки),
представляющими клиентов, документы, звонки, пакеты данных, транспортные
средства и т.п. Эти сущности пассивны, они сами не контролируют свою динамику,
но могут обладать определёнными атрибутами, влияющими на процесс их обработки
(например, тип звонка, сложность работы) или накапливающими статистику (общее
время ожидания, стоимость).
Потоковые диаграммы AnyLogic иерархичны,
масштабируемы, расширяемы и объектно-ориентированы, что позволяет пользователю
моделировать сложные системы любого уровня детальности. Другой важной
особенностью Основной библиотеки является возможность создания достаточно
сложных анимаций процессных моделей.
Создадим модель простой системы
обслуживания, а именно модель банковского отделения. В банковском отделении
находятся банкомат и стойки банковских кассиров, что позволяет быстро и
эффективно обслуживать посетителей банка. Операции с наличностью клиенты банка
производят с помощью банкомата, а более сложные операции, такие как оплата
счетов – с помощью кассиров.
Задания к практической работе
1.
Выполняя
последовательно шаги проектирования создать модель банковского отделения.
2.
Провести
вычислительный эксперимент и сделать выводы.
Ход работы
1.
Создание
простой модели
Вначале мы создадим простейшую модель, в
которой будем рассматривать обслуживание людей банкоматом.
Задание 1. Создайте новую
модель

Щелкните мышью по кнопке панели
     инструментов Создать . Появится диалоговое окно Новая
     модель.
Задайте имя новой модели. В поле Имя
     модели введите Bank.

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

4.
Выберите минуты в качестве Единиц модельного
времени.
5.
Щелкните мышью по кнопке Готово, чтобы завершить процесс.
Вы создали новую
модель. В ней уже имеется один тип агента Main и
эксперимент Simulation.
Агенты - это главные строительные блоки модели AnyLogic. В нашем случае агент Main послужит местом, где мы зададим всю логику
модели: здесь мы расположим чертеж банковского отделения и зададим диаграмму
процесса потока клиентов.
В центре рабочей области
находится графический редактор диаграммы типа агента Main.

В левой части
рабочей области находятся панель Проекты и панель Палитра.
Панель Проекты обеспечивает легкую навигацию по элементам
моделей, открытых в текущий момент времени. Поскольку модель организована
иерархически, то она отображается в виде дерева. Панель Палитра содержит разделенные по палитрам элементы,
которые могут быть добавлены на диаграмму типа агента или эксперимента.
В правой рабочей
области будет отображаться панель Свойства.
Панель Свойства используется для просмотра и изменения свойств
выбранного в данный момент элемента (или элементов) модели. Когда вы выделяете
какой-либо элемент, например, в панели Проекты или графическом редакторе, панель Свойства показывает свойства выбранного
элемента.
Теперь мы можем
настроить нашу модель, созданную с помощью Мастера создания модели.
Задание 2. Создание диаграммы
процесса
Теперь мы зададим
динамику процесса, создав диаграмму из блоков Библиотеки моделирования
процессов.
Каждый блок задает
определенную операцию, которая будет производиться над проходящими по диаграмме
процесса агентами.
Диаграмма процесса в AnyLogic
создается путем добавления объектов библиотеки из палитры на диаграмму агента,
соединения их портов и изменения значений свойств блоков в соответствии с
требованиями Вашей модели.
1.
По умолчанию при создании новой модели в панели Палитра
открывается Библиотека моделирования процессов. Вы можете открывать
палитры щелчком по соответствующей иконке на вертикальной панели слева от
палитры:

2.
Добавьте блоки Библиотеки моделирования процессов на диаграмму
и соедините их, как показано на рисунке. Чтобы добавить объект на диаграмму,
перетащите требуемый элемент из палитры в графический редактор.

3.
Когда Вы перетаскиваете блоки и располагаете их рядом друг с
другом, Вы можете видеть, как появляются соединительные линии между блоками.
Будьте внимательны, эти линии должны соединять только порты, находящиеся с
правой или левой стороны иконок.
Данная схема
моделирует простейшую систему очереди, состоящую из источника агентов, задержки
(и очереди перед задержкой) и финального уничтожения агентов.
Скажем пару слов
об этих объектах диаграммы.
Объект Source
генерирует агентов определенного типа. Обычно он используется в качестве
начальной точки диаграммы процесса, формализующей поток агентов. В нашем
примере агентами будут посетители банка, а объект Source будет моделировать их приход в банковское
отделение.
Объект Queue моделирует
очередь агентов, ожидающих приема объектами, следующими за данным в диаграмме
процесса. В нашем случае он будет моделировать очередь клиентов, ждущих
освобождения банкомата.
Объект Delay
задерживает агентов на заданный период времени, представляя в нашей модели
банкомат, у которого посетитель банковского отделения тратит свое время на
проведение необходимой ему операции.
Объект Sink уничтожает
поступивших агентов. Обычно он используется в качестве конечной точки потока
агентов (и диаграммы процесса соответственно).
За детальным описанием
объектов Библиотеки моделирования процессов, пожалуйста, обращайтесь к Справочному руководству по Библиотеке
моделирования процессов.
Задание 3. Настройте блоки
диаграммы
1.
Чтобы изменить свойства элемента, выделите
элемент в графическом редакторе или в панели Проекты, щелкнув по нему
мышью. Свойства элемента откроются в панели Свойства.
2.
Выделите блок source. В панели Свойства укажите, как
часто должны прибывать клиенты. Введите 0.3 и выберите в минуту в
поле Интенсивность прибытия.

3.
Измените свойства блока queue. Введите в поле Вместимость 15. В очереди
будут находиться не более 15 человек.

4.
Измените свойства блока delay. Назовите объект ATM.
Задайте время обслуживания в поле Время задержки, распределенное по
треугольному закону со средним значением, равным 1.5, минимальным -
равным 0.8 и максимальным - 3.5 минутам.

Функция triangular() является стандартной функцией генератора
случайных чисел AnyLogic. AnyLogic предоставляет функции и других случайных
распределений, таких как нормальное, равномерное, треугольное, и т.д.
Задание 4. Запуск модели
Мы закончили моделирование
простейшей системы очереди и готовы запустить созданную модель. Сначала
постройте Вашу модель с помощью кнопки панели инструментов Построить модель (при этом в
рабочей области AnyLogic должен быть выбран какой-то элемент именно этой
модели). Если в модели есть какие-нибудь ошибки, то построение не будет
завершено, и в панель Ошибки будет выведена информация об ошибках,
обнаруженных в модели. Двойным щелчком мыши по ошибке в этом списке Вы можете
перейти к месту ошибки, чтобы исправить ее.
После того, как Вы исправите
все ошибки и успешно построите Вашу модель, Вы можете ее запустить. Запуская
модель, вы автоматически обновляете ее.
1.     Щелкните мышью по
кнопке панели инструментов Запустить
 и выберите из открывшегося списка
эксперимент, который Вы хотите запустить. Эксперимент этой модели будет
называться Bank/Simulation.

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

Щелкните по кнопке Запустить.
Тем самым, Вы запустите модель и перейдете к презентации агента верхнего уровня
запущенного эксперимента. Для каждой модели, созданной с помощью объектов
Библиотеки моделирования процессов, автоматически создается блок-схема с
наглядной визуализацией процесса, с помощью которой Вы можете изучить текущее
состояние модели, например, длину очереди, количество обслуженных человек и так
далее.

Вы можете изменить скорость
выполнения модели с помощью кнопок панели инструментов Замедлить и Ускорить.
Вы можете следить
за состоянием любого блока диаграммы процесса во время выполнения модели с
помощью окна инспекта этого объекта. Чтобы открыть окно инспекта, щелкните
мышью по значку блока. В окне инспекта будет отображена базовая инормация по
выделенному блоку: например, для блока Queue будет отображена вместимость очереди,
количество агентов, прошедших через каждый порт объекта, и т.д.
Строка Содержит
отображает количество агентов, находящихся в данный момент на объекте вместе с
ID этих агентов.

Создание
анимации модели
Хотя мы и могли анализировать
работу запущенной нами только что модели с помощью диаграммы процесса, но куда
удобнее было бы иметь более наглядную анимацию моделируемого нами с
помощью анимации. В этом примере мы хотим создать визуализированный план
банковского отделения.
Поскольку в нашем случае нас
не интересует конкретное расположение объектов в пространстве, то мы можем
просто добавить чисто схематическую анимацию интересующих нас объектов - в
нашем случае мы хотим видеть на анимации банкомат и ведущую к нему очередь
клиентов.
Анимация модели рисуется в той
же диаграмме (в графическом редакторе), в которой задается и диаграмма
моделируемого процесса.
Задание 5. Добавление фигур
разметки пространства
Задайте
фигуру анимации банкомата
1.
Нарисуем
точечный узел, обозначающий банкомат. Вначале
откройте палитру Разметка пространства панели Палитра.
2.
Перетащите
элемент Точечный узел из палитры Разметка пространства в
графический редактор и поместите его под блок-схемой процесса.

3.     Выделите щелчком
точечный узел в графическом редакторе, чтобы открыть для него панель Свойства.
Мы с Вами хотим, чтобы во время моделирования менялся цвет нашей фигуры, поэтому
введите выражение, которое будет постоянно вычисляться заново при выполнении
модели, в поле Цвет:
ATM.size() > 0 ? red : green
Здесь ATM – это имя нашего объекта Delay.
Функция size() возвращает число человек, обслуживаемых в данный момент времени.
Если банкомат занят, то цвет кружка будет красным, в противном случае - зеленым.
4.
Выделите
щелчком блок delay, названный нами ATM в диаграмме процесса, чтобы
открыть его свойства.
5.
Выберите
точечный узел point, который мы только нарисовали в параметре Место
агентов. Вы можете выбрать его из выпадающего списка подходящих объектов,
щелкнув стрелку «вниз», или выбрать фигуру из графического редактора,
предварительно щелкнув кнопку справа от параметра (в таком случае все
неподходящие объекты в графическом редакторе будут обесцвечены).

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

4.
Выделите
щелчком блок queue в диаграмме процесса, чтобы открыть для него панель Свойства.

5.
Выберите
путь path, который мы только нарисовали в параметре Место агентов.
Вы можете выбрать его из выпадающего списка подходящих объектов, щелкнув
стрелку «вниз», или выбрать фигуру из графического редактора, предварительно
щелкнув кнопку справа от параметра (в таком случае все неподходящие объекты в
графическом редакторе будут обесцвечены).

Теперь Вы можете запустить
модель и изучить ее поведение. Для ускорения работы модели, переключитесь в
режим виртуального времени, щелкнув мышью по кнопке панели инструментов Реальное/виртуальное
время. В режиме виртуального времени модель будет выполняться максимально
быстро, без привязки модельного времени к реальному.
Запустите модель. Вы увидите, что у нашей модели теперь есть
простейшая анимация - банкомат и ведущую к нему очередь клиентов. Цвет фигуры
банкомата будет меняться в зависимости от того, обслуживается ли клиент в
данный момент времени.

Добавление 3D анимации
Первым делом нам будет нужно
добавить на диаграмму типа агента 3D Окно.
3D Окно используется для задания на диаграмме агента области, в которой
во время запуска модели будет отображаться трехмерная анимация этой модели.
Задание 7. Добавьте
3D окно
1.
Перетащите элемент 3D Окно  из секции 3D
палитры Презентация в графический редактор
2.
Вы увидите в графическом редакторе закрашенную серым область.
Поместите ее туда, где Вы хотите видеть 3D анимацию во время запуска модели:

Задание 8. Запустите модель и
опробуйте навигацию по сцене трехмерной анимации
Мы создали простейшую трехмерную анимацию
и готовы к тому, чтобы запустить модель и посмотреть на результат нашей работы.

2.
Щелкните
кнопку панели инструментов Показать область... и выберите [window3D].

3.
Попробуйте
«подвигаться» по трехмерной сцене с помощью описанных ниже команд навигации:

Чтобы

Выполните следующие действия

Переместить сцену

1.
  Нажмите левую кнопку мыши в области 3D окна и держите ее нажатой.
2.
  Передвиньте мышь в направлении перемещения.

Повернуть сцену

1.
  Нажмите клавишу Alt и держите ее нажатой.
2.
  Нажмите левую кнопку мыши в области 3D окна и держите ее нажатой.
3.
  Передвиньте мышь в направлении вращения.

Приблизить/отдалить сцену

1.
  Покрутите колесо мыши от/на себя в области 3D окна.

Добавление 3D объектов
Теперь мы хотим задать фигуру клиента
банка. По умолчанию клиенты в нашей модели обозначались цветными точками и
отображались цветными цилиндрами в 3D анимации. Если мы хотим задать
нестандартный тип клиента и выбрать для него красивую фигуру анимации, нам
нужно создать новый тип агента.
Задание 9. Создайте новый тип
агента
1.
Откройте
Библиотеку моделирования процессов в панели Палитра.
2.
Перетащите
элемент Тип агента в графический редактор.

3.
Откроется
диалоговое окно Мастера создания агентов на шаге Создание нового типа агента.
Введите Customer в поле Имя нового типа, оставьте опцию Создать
новый тип агента «с нуля» выбранной. Нажмите Далее.

4.
Выберите
опцию 3D для типа анимации и фигуру анимации Человек из списка 3D
фигур.

5.
Щелкните
Готово. Диаграмма нового агента Customer откроется автоматически. Вы
можете найти 3D фигуру Человек в начале координат.
Задание 10. Настройте
использование нового типа агентов в блок-схеме
1.
На
диаграмме Main, выделите блок source в графическом редакторе.
2.
Выберите
тип агента Customer в выпадающем списке параметра Новый агент.

3.
Запустите
модель, чтобы увидеть анимацию клиентов в очереди.

Задание 11. Добавьте объект
банкомата
3.
Откройте
палитру 3D Объекты в панели Палитра.
4.
Перетащите
3D фигуру Банкомат из секции палитры Супермаркет в графический
редактор и поместите ее на точечный узел.

5.
Если
вы сейчас запустите модель и проверите 3D анимацию в режиме просмотра window3D,
вы заметите, что банкомат стоит не той стороной по направлению к очереди
клиентов, и нам необходимо развернуть его в правильную сторону.
6.
Выделите
3D объект банкомата atm в графическом редакторе и откройте секцию
свойств Расположение.
7.
Выберите
из выпадающего списка параметра Поворот Z 0 градусов.
8.
Запустите
модель, чтобы убедиться, что фигура банкомата стоит «лицом» к клиентам.

Добавление клерков
Теперь мы усложним нашу модель, добавив в
нее служащих – банковских кассиров. Мы могли бы промоделировать кассиров, как и
банкомат, с помощью объекта Delay. Но куда более удобным представляется
моделирование кассиров с помощью ресурсов. Ресурс – это специальный объект
Библиотеки моделирования процессов, который может потребоваться агенту для
выполнения какой-то задачи. В каждый момент времени ресурс может быть занят
только одним агентом. В нашем примере посетителям банковского отделения
(агентам) необходимо получить помощь у банковских служащих (ресурсов).
Изменения в диаграмме процесса
Задание 12. Добавьте
обслуживание
1.
Откройте Библиотеку моделирования процессов в панели Палитра
и перетащите на диаграмму Main блок  Service. Объект Service
захватывает для агента заданное количество ресурсов, задерживает агента, а
затем освобождает захваченные им ресурсы.

2.
Перейдите в панель Свойства блока service.
3.
Измените
параметры объекта следующим образом:
o   Ко всем кассирам
будет вести одна общая очередь. Задайте максимальное количество человек в этой
очереди в поле Вместимость очереди: 20.
o   Мы полагаем, что
время обслуживания имеет треугольное распределение с минимальным значением
равным 2.5, средним - 6, и максимальным - 11 минутам.
Введите в поле Время задержки: triangular( 2.5, 6, 11 )

Задание 13. Смоделируйте выбор
клиентов
1.     Откройте
Библиотеку моделирования процессов в панели Палитра и перетащите
на диаграмму процесса Main блок  SelectOutput в
свободное место между блоками source и queue. Возможно, Вам
понадобится переместить несколько блоков, чтобы увеличить длину соединителя
между ними. Вы можете выделить несколько блоков диаграммы процесса и
переместить их все вместе или перемещать блоки по одному.
SelectOutput является блоком принятия решения. В зависимости от
заданного Вами условия, агент, поступивший в объект, будет поступать на один из
двух выходных портов объекта.

2.
Выделите блок selectOutput в диаграмме процесса. В панели Свойства
этого блока выберите опцию При выполнении условия в параметре Выход
True выбирается. Убедитесь, что в поле Условие стоит выражение
randomTrue( 0.5 ).
В этом случае к кассирам и банкомату будет приходить примерно равное количество
клиентов.
Соедините блоки selectOutput и service с другими
блоками так, как показано на рисунке ниже:

Задание 14. Добавьте ресурсы
для сервиса
1.
Откройте Библиотеку моделирования процессов в панели Палитра
и перетащите блок ResourcePool на
диаграмму агента Main. Объект ResourcePool задает ресурсы определенного
типа (в нашей модели это будут банковские клерки).
2.
Поместите его, например, под блоком service и перейдите в
панель Свойства.

3.
Назовите объект tellers.

4.
Задайте
число кассиров в поле Кол-во ресурсов: 4.

5.
Блок ResourcePool указывается в объектах, использующих
ресурсы, в нашем случае это блок Service. Поэтому нам необходимо
изменить свойства блока service диаграммы процесса.
6.
Выделите блок service и перейдите в панель Свойства.
Выберите опцию Ресурсы одного типа в параметре Захватить ресурсы.
Затем укажите блок tellers, который мы добавили на диаграмму, в параметре
Блок ResourcePool. Вы можете выбрать его из выпадающего списка
подходящих объектов, щелкнув стрелку «вниз», или выбрать фигуру из графического
редактора, предварительно щелкнув кнопку справа от параметра (в таком случае
все неподходящие объекты в графическом редакторе будут обесцвечены).

7.
Поскольку наша модель изменилась, мы должны изменить и ее
анимацию.

Добавление
фигур разметки пространства
Теперь давайте нарисуем область для
ожидания и место обслуживания клиентов кассирами.
Задание 15. Задайте фигуру
разметки для электронной очереди
1.
В
этот раз мы будем рисовать место ожидания клиентами, используя прямоугольный
узел. Вначале откройте палитру Разметка
пространства панели Палитра.
2.
Двойным
щелчком выделите элемент Прямоугольный узел  палитры Разметка пространства,
чтобы перейти в режим рисования.
3.
Щелкните
мышью в графическом редакторе, чтобы задать вершину верхнего левого угла, затем
тащите прямоугольник, не отпуская кнопки мыши. Отпустите, когда прямоугольный
узел имеет нужную форму. Вы можете редактировать фигуру и после того, как ее
рисование завершено
4.
Назовите
эту область waitingArea.

5.
Выделите
щелчком блок service block в диаграмме процесса и перейдите в его
свойства.
6.
Выберите
только что нарисованный нами узел waitingArea в параметре Место
агентов (queue).

Задание 16. Задайте фигуру
разметки места обслуживания клиентов
1.
Клиентам
банка требуется место, на котором они могли бы находиться во время обслуживания
у кассиров. Мы нарисуем такую область, используя прямоугольный узел.
2.
Вначале откройте палитру Разметка пространства панели Палитра.
3.
Двойным
щелчком выделите элемент Прямоугольный узел  палитры Разметка
пространства, чтобы перейти в режим рисования.
4.
Щелкните
мышью в графическом редакторе, чтобы задать вершину верхнего левого угла, затем
тащите прямоугольник, не отпуская кнопки мыши. Отпустите, когда прямоугольный
узел имеет нужную форму. Вы можете редактировать фигуру и после того, как ее
рисование завершено.
5.
Назовите
эту область customerPlaces.

6.
Мы
будем использовать аттракторы, чтобы задать местоположение тех клиентов,
которые будут обслуживаться у кассиров. Выделите узел customerPlaces в
графическом редакторе и щелкните кнопку Аттракторы... в свойствах узла.
В открывшемся окне Аттракторы укажите число аттракторов 4 в
режиме создания Количество аттракторов, затем щелкните OK. Вы
увидите, что четыре аттрактора появились в узле customerPlaces на равном
расстоянии друг от друга.

7.
Теперь
нам необходимо сослаться на эту фигуру в диаграмме процесса. Щелкните блок service
и перейдите в панель Свойства этого блока.
8.
Выберите
нарисованный нами узел customerPlaces в параметре Место агентов
(delay).

Задание 17. Задайте фигуру
разметки для кассиров
1.
Кассирам
банка также требуется место, где они могли бы находиться во время обслуживания
клиентов. Мы нарисуем такую область, используя прямоугольный узел.
2.
Вначале откройте палитру Разметка пространства панели Палитра.
3.
Двойным
щелчком выделите элемент Прямоугольный узел  палитры Разметка
пространства, чтобы перейти в режим рисования.
4.
Щелкните
мышью в графическом редакторе, чтобы задать вершину верхнего левого угла, затем
тащите прямоугольник, не отпуская кнопки мыши. Отпустите, когда прямоугольный
узел имеет нужную форму. Вы можете редактировать фигуру и после того, как ее
рисование завершено.
5.
Назовите
эту область tellerPlaces.

6.
Мы
будем использовать аттракторы, чтобы задать местоположение клерков. Выделите
узел tellerPlaces в графическом редакторе и щелкните кнопку Аттракторы...
в свойствах узла. В открывшемся окне Аттракторы укажите число
аттракторов 4 в режиме создания Количество аттракторов, затем
щелкните OK.
7.
Вы
увидите, что четыре аттрактора появились в узле tellerPlaces на равном
расстоянии друг от друга, но они направлены не в ту сторону. Выделите все
аттракторы, зажав клавишу Shift и щелкнув по ним мышью, и потом выберите +180.0
в параметре Ориентация секции свойств Местоположение и размер.

8.
Щелкните
объект tellers в диаграмме процесса и перейдите в его свойства.
9.
Выберите
нарисованный нами узел tellerPlaces в параметре Базовое
местоположение (узлы).

Вы можете запустить модель и наблюдать,
как клиенты обслуживаются у банкоматов и проходят к кассирам.
Добавление 3D объектов
Давайте добавим 3D фигуры клерков в нашу
модель. Мы создадим новый тип ресурсов для анимации клерков.
Задание 18. Создайте новый тип
ресурсов
1.
Откройте
Библиотеку моделирования процессов в панели Палитра.
2.
Перетащите
элемент Тип ресурса  в графический редактор.

3.
Откроется
диалоговое окно Мастера создания агентов на шаге Создание нового типа агента.
Введите Teller в поле Имя нового
типа, оставьте опцию Создать новый тип агента «с нуля» выбранной.
Нажмите Далее.

4.
Выберите
опцию 3D для типа анимации и фигуру анимации Служащий из списка
3D фигур.

Щелкните Готово. Новая диаграмма Teller
автоматически откроется. Вы можете найти 3D фигуру Служащий в начале
координат. Переключитесь обратно на диаграмму Main.
Задание 19. Настройте
использование нового типа ресурсов в блок-схеме
1.
На
диаграмме Main, выделите блок tellers в графическом редакторе.
2.
Выберите
тип ресурсов Teller в выпадающем списке параметра Новый ресурс.

3.
Запустите модель, чтобы увидеть получившуюся анимацию клерков.
Задание 20. Добавьте столы для
клерков
1.
Откройте
палитру 3D Объекты в панели Палитра.
2.
Перетащите
четыре 3D фигуры Стол из секции палитры Офис в графический
редактор и поместите их в узел tellerPlaces.
3.
Расположите
столы на аттракторах, так как аттракторы обозначают место, где стоят клерки

4.
Вы
заметите, что они стоят не той стороной к клеркам. Выделите все столы методом
Shift-щелчок и перейдите в их свойства.
5.
В
секции Расположение измените параметр Поворот Z: -90.0
градусов.
6.
При
необходимости, выровняйте расположение всех восьми аттракторов и столов.

Теперь Вы можете запустить модель и
увидеть в 3D анимации, как некоторые клиенты идут к банкомату, а другие
обслуживаются у столов клерков.

Добавление статистики модели
AnyLogic предоставляет пользователю
удобные средства для сбора статистики по работе блоков диаграммы процесса.
Объекты Библиотеки моделирования процессов самостоятельно производят сбор
основной статистики. Все, что Вам нужно сделать - это включить сбор статистики
для объекта.
Мы можем, например, просмотреть
интересующую нас статистику (скажем, статистику занятости банкомата и длины
очереди) с помощью диаграмм.
Сбор статистики использования ресурсов
Задание 21. Добавьте диаграмму
для отображения средней занятости банкомата
1.
Откройте
палитру Статистика. Эта палитра содержит элементы сбора данных и
статистики, а также диаграммы для визуализации данных и результатов
моделирования. Перетащите элемент Столбиковая диаграмма из палитры Статистика
на диаграмму:

2.
Перейдите
в секцию Данные свойств столбиковой диаграммы. Щелкните кнопку  Добавить
элемент данных, чтобы задать данные для отображения в диаграмме.
3.
Измените
Заголовок на ATM utilization.
4.
Введите
ATM.statsUtilization.mean() в поле Значение. Здесь ATM - это имя
нашего объекта Delay. У каждого объекта Delay есть встроенный
набор данных statsUtilization, занимающийся сбором статистики использования
этого объекта. Функция mean() возвращает среднее из всех измеренных этим
набором данных значений. Вы можете использовать и другие методы сбора
статистики, такие, как min() или max().

5.
Перейдите
в секцию Легенда панели Свойства. Измените расположение легенды
относительно диаграммы (мы хотим, чтобы она отображалась справа).

6.
И
измените ее размер:

Задание 22. Добавьте диаграмму
для отображения средней длины очереди
1.
Аналогичным
образом добавьте еще одну столбиковую диаграмму. Измените ее размер так, как
показано на рисунке:

2.
Перейдите
в секцию Внешний вид панели Свойства и выберите последнюю опцию
параметра Направление столбцов, чтобы столбцы столбиковой диаграммы
росли влево. Также измените положение легенды в секции Легенда (как
показано на рисунке ниже).

3.
Добавьте
элемент данных, который будет отображаться на диаграмме, в секции Данные.
Задайте Заголовок: Queue length и задайте Значение:
queue.statsSize.mean()
Здесь statsSize - это имя объекта типа «статистика» StatisticsContinuous,
производящего сбор статистики размера очереди объекта Queue.

Запустите модель и пронаблюдайте за
занятостью банкомата и средней длиной очереди с помощью только что созданных
диаграмм.

Сбор статистики по времени обслуживания
Мы хотим знать, сколько времени клиент
проводит в банковском отделении и сколько времени он теряет, ожидая своей
очереди. Мы соберем эту статистику с помощью специальных объектов сбора данных
и отобразим собранную статистику распределения времен обслуживания клиентов с
помощью гистограмм. Для этого мы будем использовать ранее созданный тип агента
Customer.
Вначале нам необходимо добавить два
параметра в нашу модель.
Задание 23. Добавьте параметры
1.
Переключитесь
в панель Проекты. Дважды щелкните по типу агента Customer, чтобы открыть
его диаграмму. Нам необходимо создать параметры на диаграмме агента Customer,
так как мы хотим собирать статистику клиентов по времени их обслуживания.
2.
Откройте
палитру Основная в панели Палитра.
3.
Перетащите
два элемента Параметр на диаграмму Customer.
4.
Назовите
параметры startWaiting и enteredSystem, оставьте тип double,
заданный по умолчанию

5.
Мы
продолжим разрабатывать нашу модель на диаграмме Main.
Добавьте элементы сбора статистики по
времени ожидания клиентов и времени пребывания клиентов в системе. Эти элементы
будут запоминать соответствующие значения времен для каждого клиента и
предоставят пользователю стандартную статистическую информацию: среднее,
минимальное, максимальное из измеренных значений, среднеквадратичное
отклонение, доверительный интервал для среднего и т.д.).
Задание 24. Добавьте элементы
сбора данных
1.
Чтобы
добавить объект сбора данных гистограммы на диаграмму, перетащите элемент Данные
гистограммы с палитры Статистика на диаграмму агента Main.

2.
Задайте
свойства элемента.
o   Измените Имя
на waitTimeDistr.
o   Сделайте Кол-во
интервалов равным 50.
o   Задайте Начальный
размер интервала: 0.01.

3.
Создайте
еще один элемент сбора данных гистограммы. Ctrl+перетащите (Mac OS:
Cmd+перетащите) только что созданный объект данных гистограммы, чтобы создать
его копию. Измените Имя этого элемента на timeInSystemDistr.

Теперь нам нужно изменить свойства блоков
нашей диаграммы процесса.
Задание 25. Измените свойства
блоков диаграммы процесса
1.
Измените свойства объекта source:
o    Убедитесь, что тип
агента Customer указан в поле Новый агент. Этот объект должен продолжать
создавать агентов типа Customer.
o    Введите
agent.enteredSystem = time(); в поле действия При выходе в секции Действия.
Этот код будет сохранять время создания агента-клиента в переменной enteredSystem
нашего типа агента Customer. Функция time() возвращает текущее значение
модельного времени.

2.
Измените
свойства объекта queue:
o    Введите agent.startWaiting
= time(); в поле действия При входе в секции Действия. Этот код
запоминает время начала ожидания клиентом его очереди на обслуживание в
переменной startWaiting нашего типа агента Customer.
o    Введите
waitTimeDistr.add(time() - agent.startWaiting); в поле действия При выходе.
Этот код добавляет время, в течение которого клиент
ожидал обслуживания, в объект сбора данных waitTimeDistr.

3.
Измените свойства объекта sink:
o    Введите
timeInSystemDistr.add(time()-agent.enteredSystem); в поле действия При входе
в секции Действия. Этот код добавляет полное время пребывания клиента в
банковском отделении в объект сбора данных гистограммы timeInSystemDistr.

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

Теперь давайте добавим на диаграмму нашего
типа агента гистограммы, которые будут отображать собранную нами временную
статистику.
Задание 26. Добавьте две
гистограммы для отображения распределений времен ожидания клиента и пребывания
клиента в системе
3.
Чтобы
добавить гистограмму на диаграмму агента, перетащите элемент Гистограмма
из палитры Статистика в то место графического редактора, куда Вы хотите
ее поместить. Измените ее размер при необходимости.

4.
Укажите,
какой элемент сбора данных хранит данные, которые Вы хотите отображать на
гистограмме: в секции Данные свойств гистограммы щелкните мышью по
кнопке  Добавить
данные и измените Заголовок отображаемых данных на Waiting time
distribution.
Введите в поле Данные имя соответствующего элемента: waitTimeDistr

5.
Добавьте
еще одну гистограмму и расположите ее под ранее добавленной.
Измените Заголовок отображаемых данных на Time in system distribution.
В поле Данные введите имя элемента, хранящего данные, которые будут
отображаться на гистограмме: timeInSystemDistr.

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

Самостоятельно, изменяя параметры модели,
сделайте выводы и оформите отчет о практической работе.
Практическая работа №6
Тема:
Построение
системно-динамической модели в Anylogic
Цель:
- изучить
интерфейс и возможности пакета AnyLogic для построения моделей системной
динамики.
Вид
работы:
фронтальный
Время
выполнения:
2 часа
Теоретические сведения
Динамические системы – это сложные
объекты, поведение которых описывается системами алгебраических и
дифференциальных уравнений, а также событиями, меняющими либо среду, либо
модель, либо даже саму структуру системы. К этому классу относятся системы
управления, системы обработки сигналов, а также физические объекты, объекты
химической технологии и т. п.
Системная динамика – парадигма моделирования,
где для исследуемой системы строятся графические диаграммы причинных связей и
глобальных влияний одних параметров на другие во времени, а затем созданная на
основе этих диаграмм модель имитируется на компьютере. Такой вид моделирования
помогает понять суть происходящего выявления причинно- следственных связей
между объектами и явлениями. Системная динамика применяется для решения
производственных, организационных и социально- экономических задач.
Системная динамика как метод имитационного
моделирования включает в себя:
- структуризацию
объекта;
- построение
системной диаграммы объекта, где указываются связи между элементами;
- определение
переменных для каждого элемента и темпов их роста;
- принятие гипотез о
зависимости каждого темпа роста от переменных и формальное описание этих
гипотез;
- процесс оценки
введенных параметров с помощью имеющейся статистики.
Модель жизненного цикла продукта
Модель представляет собой динамику
процесса превращения потенциальных покупателей нового продукта
(Potential_Adopters) во владельцев продукта (Adopters). Изначально продукт
никому не известен, и для того, чтобы люди начали его приобретать, он
рекламируется. В итоге люди покупают продукт либо под воздействием рекламы,
либо узнав о нем от знакомых, по «сарафанному радио». Эффективность рекламы
пропорциональна числу людей, на которых она действует, т.е. числу потенциальных
покупателей. В свою очередь, эффективность «сарафанного радио» зависит от числа
людей, уже купивших продукт. Иными словами, в данной модели должна быть отражена
структура взаимных зависимостей характеристик и параметров системы.
Для описания модели в терминах системной
динамики необходимо определить ключевые переменные модели и их влияние друг на
друга, а затем создать потоковую диаграмму модели. При создании потоковой
диаграммы нужно учесть, какие переменные должны быть представлены накопителями,
какие потоками, а какие – вспомогательными переменными.
Накопители (также называемые
уровнями или фондами) представляют собой такие объекты реального мира, в которых
сосредотачиваются некоторые ресурсы; их значения изменяются непрерывно.
Потоки – это активные
компоненты системы, они изменяют значения накопителей. В свою очередь,
накопители системы определяют значения потоков.
Вспомогательные переменные помогают преобразовывать
одни числовые значения в другие; они могут произвольно изменять свои значения
или быть константами.
При создании потоковой диаграммы
выявляются переменные, которые накапливают значения с течением времени. В
данной модели численности потребителей и потенциальных потребителей продукта
являются накопителями, а процесс приобретения продукта – потоком.
Системно-динамическое представление данной
модели показано на рис. 1. Накопители обозначаются прямоугольниками, поток –
вентилем, а вспомогательные переменные – кружками. Стрелки обозначают
причинно-следственные зависимости в модели.

Рисунок 1 - Системно-динамическое представление
Ход работы
Задание
0. Анализ
модели
Вначале мы должны проанализировать нашу
модель, чтобы решить, как ее можно описать в терминах системной динамики. Мы
должны определить ключевые переменные модели и то, как они влияют друг на
друга, а затем создать потоковую диаграмму модели. При создании потоковой
диаграммы мы должны учесть, какие переменные должны быть представлены накопителями,
какие потоками, а какие – динамическими переменными.
Накопители (также называемые
уровнями или фондами) представляют собой такие объекты реального мира, в
которых сосредотачиваются некоторые ресурсы; их значения изменяются непрерывно.
Потоки – это активные компоненты системы, они изменяют значения
накопителей. В свою очередь, накопители системы определяют значения потоков. Динамические
переменные помогают преобразовывать одни числовые значения в другие; они
могут произвольно изменять свои значения или быть константами.
При создании потоковой диаграммы выявите
переменные, которые накапливают значения с течением времени. В нашей модели
численности потребителей и потенциальных потребителей продукта являются
накопителями, а процесс приобретения продукта – потоком.
Системно-динамическое представление нашей
модели показано на рисунке ниже. Накопители обозначаются прямоугольниками,
поток—вентилем, а динамические переменные—кружками. Стрелки обозначают
причинно-следственные зависимости в модели.

Задание
1. Создание
новой модели
Вначале
мы создадим новую модель.
 Создайте
новую модель
1.     Щелкните мышью по
кнопке панели инструментов Создать . Появится диалоговое окно Новая модель.

2.     Задайте имя новой
модели. В поле Имя модели введите Bass Diffusion.

3.     Выберите каталог,
в котором будут сохранены файлы модели. Если Вы хотите сменить предложенный по
умолчанию каталог на какой-то другой, Вы можете ввести путь к нему в поле Местоположение
или выбрать этот каталог с помощью диалога навигации по файловой системе,
открывающегося по нажатию на кнопку Выбрать.
4.     Выберите годы
в качестве Единиц модельного времени.
5.     Щелкните мышью по
кнопке Готово.
Вы создали новую модель. Если Вы еще не
знакомы с пользовательским интерфейсом AnyLogic, то давайте уделим пару минут
основным его компонентам:
Пользовательский
интерфейс AnyLogic
В левой части рабочей области находятся панель
Проекты и панель Палитра. Панель Проекты обеспечивает
легкую навигацию по элементам моделей, открытым в текущий момент времени.
Поскольку модель организована иерархически, то она отображается в виде дерева:
сама модель образует верхний уровень дерева; эксперименты, типы агентов и Java
классы образуют следующий уровень; элементы, входящие в состав агентов, вложены
в соответствующую подветвь типа агента и т.д. Панель Палитра содержит
разделенные по категориям элементы, которые могут быть добавлены на графическую
диаграмму типа агентов или эксперимента.
В правой части рабочей области
отображается панель Свойства. Панель Свойства используется для
просмотра и изменения свойств выбранного в данный момент элемента (или
элементов) модели.
В центре рабочей области AnyLogic Вы
увидите графический редактор диаграммы типа агентов Main.
Задание
2. Создание
накопителей
Давайте начнем создание
диаграммы накопителей и потоков. И начнем мы с создания накопителей. В нашей
модели их два – они моделируют численности потребителей и потенциальных
потребителей продукта. Накопитель в AnyLogic задается с помощью одноименной
переменной.
 Создайте накопитель для моделирования
численности потенциальных потребителей
1.
Вначале откройте палитру Системная динамика в панели Палитра.
Чтобы открыть какую-либо палитру, нужно щелкнуть мышью по соответствующей
иконке на вертикальной панели слева от палитры. Пока Вы привыкаете к иконкам
палитры, Вы можете навести указатель мыши на панель и подождать, пока появится
всплывающее окно, в котором Вы увидите названия палитр.

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

4.
Когда Вы добавите элемент на диаграмму, он будет выделен, и его
свойства будут отображены в панели Свойства. Здесь Вы можете изменить
свойства элемента в соответствии с Вашими требованиями. Обратите внимание, что панель
Свойства является контекстно-зависимой - она отображает свойства
выделенного в текущий момент элемента. Поэтому позднее для изменения свойств
элемента нужно будет предварительно щелчком мыши выделить его в графическом
редакторе или в панели Проекты.
Чтобы у Вас всегда была
уверенность в том, что в текущий момент в рабочем пространстве выбран именно
нужный Вам элемент, и именно его свойства Вы редактируете в панели Свойства,
обращайте внимание на первую строку, показываемую в панели Свойства - в
ней отображается имя выбранного в текущий момент времени элемента и его тип - в
приведенном на рисунке примере это stock и Накопитель соответственно

Панель Свойства. На данном
рисунке в панели отображаются свойства выделенного накопителя.
5.
В поле Имя введите новое имя накопителя: PotentialAdopters.

6.
Немного увеличьте размер значка накопителя. Для этого выделите его
щелчком мыши в графическом редакторе и перетащите в сторону появившийся в
нижнем правом углу значка маркер.

 Создайте накопитель для моделирования
численности потребителей
1.
Аналогично создайте еще один накопитель.
Чтобы
создать накопитель такого же размера, проще всего склонировать существующий
накопитель, перетащив его мышью с нажатой клавишей Ctrl (Mac OS: Cmd) (при этом
свойства нового элемента будут теми же, что и у склонированного, но в данном
случае это не важно, поскольку мы изменили только одно свойство накопителя -
его имя).
2.
Поместите новый накопитель справа от накопителя PotentialAdopters,
как показано на приведенном ниже рисунке.
3.
Назовите его Adopters.

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

При работе с моделью не забывайте
сохранять производимые Вами изменения с помощью кнопки панели инструментов Сохранить
.
Задание
3. Добавление
потока продаж продукта
Мы уже создали в нашей модели два
накопителя, моделирующие численности потенциальных потребителей и потребителей
продукта. Теперь пришло время задать потоки. В нашей простейшей модели есть
только один поток - поток продаж продукта, увеличивающий число потребителей
продукта и уменьшающий численность потенциальных потребителей.
В AnyLogic поток задается переменной поток.
Значение потока вычисляется в соответствии с заданной формулой.
 Добавьте
поток, ведущий из накопителя PotentialAdopters в накопитель Adopters
1.
Сделайте
двойной щелчок мышью по накопителю, из которого поток вытекает
(PotentialAdopters), а затем щелкните по тому накопителю, в который он втекает
(Adopters).
2.
AnyLogic
создаст новый поток и сделает его исходящим потоком для накопителя PotentialAdopters
и входящим - для Adopters. Поток отображается в виде стрелки со значком вентиля
посередине. Стрелка показывает направление потока - в данном случае поток будет
уменьшать значение накопителя PotentialAdopters и увеличивать значение
Adopters.

3.
Выделите
стрелку созданного потока в графическом редакторе и измените имя потока на AdoptionRate.

В результате диаграмма потоков и
накопителей должна будет выглядеть следующим образом:

Можете теперь взглянуть на свойства
накопителей. Формулы накопителей должны выглядеть следующим образом:

Эти формулы были автоматически заданы при
добавлении потока. Значения входящих потоков, то есть потоков, которые
увеличивают значение накопителя, прибавляются, а значения исходящих потоков,
уменьшающих значение накопителя, вычитаются из текущего значения накопителя.
Формулу, согласно которой будет
вычисляться значение потока, мы зададим чуть позднее.
Задание
4. Задание
констант
Теперь мы зададим константы нашей модели с
помощью параметров.
 Создайте
константу, задающую общую численность населения
1.
Перетащите
элемент Параметр  из палитры Системная динамика на
диаграмму типа агентов.
2.
В
панели Свойства задайте свойства этого параметра.
3.
Измените
имя параметра. Введите TotalPopulation в поле Имя.
4.
В
поле Значение по умолчанию введите 100000. Пусть общая численность
населения в нашей модели будет именно такой.

Вы можете задать краткое описание
параметра в секции свойств Описание. Введите текст, который поможет
объяснить смысл константы тем, кто в дальнейшем будет работать с этой моделью.
Частота, с которой потенциальные потребители
общаются с потребителями, в нашей модели будет постоянной величиной. Поэтому мы
зададим частоту контактов константой.
 Создайте
константу ContactRate
1.
Аналогично
создайте еще одну константу. Задайте Имя ContactRate.
2.
Предположим,
что каждый человек в среднем встречается со 100 людьми в год. Введите в поле Значение
по умолчанию 100.

В этой модели интенсивность рекламы и
вероятность того, что продукт будет приобретен под ее влиянием, полагаются
постоянными. Поэтому мы зададим эффективность рекламы константой. Эффективность
рекламы определяет, какая доля людей купит продукт вследствие ее влияния.
Создайте
константу AdEffectiveness, задающую эффективность рекламы
1.     Создайте еще одну
константу и назовите ее AdEffectiveness.
2.     Задайте значение
по умолчанию 0.011.

Задайте константой силу убеждения
владельцев продукта, определяющую ту долю контактов, которая приводит к
продажам продукта.
 Создайте
константу AdoptionFraction
1.     Создайте еще одну
константу и назовите ее AdoptionFraction.
2.     Задайте значение
по умолчанию 0.015.

Задание
5.
Задание
начальных значений накопителей
Теперь мы можем задать начальные значения
накопителей.
Мы хотим задать общую численность людей в
нашей модели (заданную параметром TotalPopulation) в качестве начального
значения накопителя PotentialAdopters.
Когда Вы указываете какой-либо элемент в
выражении начального значения накопителя, Вы должны вначале соединить этот
элемент с накопителем с помощью связи. Связь позволяет явно задавать
существующие зависимости между элементами диаграммы потоков и накопителей.
 Чтобы
задать связь
1.
Сделайте
двойной щелчок по элементу Связь палитры Системная динамика. Значок
элемента при этом должен измениться на следующий: .
2.
Сразу
после этого, щелкните в графическом редакторе по элементу, который упоминается
в выражении начального значения (TotalPopulation).
3.
Затем
щелкните по накопителю PotentialAdopters, к которому должна следовать
создаваемая связь зависимости.
Обратите внимание, что нужно всегда
рисовать связи именно в таком направлении - от независимой переменной к
зависимой.

Теперь,
когда мы создали связь, можно задать начальное значение накопителя, сославшись
в нем на параметр TotalPopulation.
 Задайте
начальное количество потенциальных потребителей продукта
1.
В
графическом редакторе или в панели Проекты выделите накопитель
PotentialAdopters щелчком мыши.
2.
В
панели Свойста введите TotalPopulation в поле Начальное значение.
Чтобы не печатать полностью имена функций и переменных в формулах, можете
воспользоваться Мастером подстановки кода. Чтобы открыть Мастер,
щелкните мышью в том месте поля (в нашем случае – поля Начальное значение,
куда Вы хотите поместить имя, а затем нажмите Ctrl+пробел (Mac OS: Alt+пробел).
3.
Появится
окно Мастера подстановки кода, перечисляющего переменные модели и
функции, доступные в текущем контексте. Прокрутите список к имени, которое Вы
хотите вставить, или введите первые буквы имени, пока оно не будет выделено в
списке. Двойным щелчком мыши по имени добавьте его в поле формулы.

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

Начальное значение накопителя Adopters,
моделирующего потребителей продукта, задавать не нужно, поскольку изначально
число потребителей равно нулю, а накопитель по умолчанию и так инициализируется
нулем.
Теперь мы закончили задание накопителей.
Нам осталось добавить на диаграмму потоков и накопителей динамические
переменные - и модель будет готова.
Задание
6.
Создание
динамических переменных
Нам нужно создать две динамические
переменные, которые будут соответствовать двум составляющим потока приобретения
продукта:
1.
Приобретениям,
совершенным под влиянием рекламы.
2.
Приобретениям,
совершенным под влиянием общения потребителей продукта с потенциальными
потребителями.
 Создайте
динамическую переменную AdoptionFromAd
1.
Перетащите
элемент Динамическая переменная  из палитры Системная динамика на
диаграмму типа агентов.
2.
В
панели Свойства введите новое Имя переменной: AdoptionFromAd.

Теперь мы хотим задать формулу для этой динамической
переменной. Влияние рекламы моделируется следующим образом: некий постоянный
процент потенциальных клиентов AdEffectiveness всё время становятся клиентами.
Их доля в AdoptionRate равна, соответственно,
PotentialAdopters*AdEffectiveness.
Опять, как и в
случае составления выражения начального значения накопителя, когда какая-либо
переменная задействована в формуле динамической переменной или потока, между
этими переменными должна существовать связь.
 Добавьте связи
от двух переменных к зависимой от них AdoptionFromAd
1.
Добавьте связи, ведущие от
AdEffectiveness и
PotentialAdopters к
AdoptionFromAd.

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

Вы могли заметить, что эта связь выглядит
немного иначе, чем та, что ведет от TotalPopulation к PotentialAdopters. Связи
с переменными, упоминающимися в начальных значениях накопителей, рисуются
пунктирными линиями, в то время как все остальные - сплошными.
3.
Добавьте
еще одну связь, ведущую от AdEffectiveness к AdoptionFromAd.

4.
Задайте
формулу, согласно которой будет вычисляться значение переменной. В свойствах
переменной AdoptionFromAd, в поле AdoptionFromAd = введите:
AdEffectiveness*PotentialAdopters (Вы можете воспользоваться Мастером
подстановки кода).

Для тех, кто не знаком с классической
моделью Диффузии по Бассу, давайте попробуем самостоятельно составить формулу
интенсивности продаж продукта под влиянием устного общения потребителей
продукта с теми, кто данный продукт еще не приобрел.
Мы делаем предположение, что в нашей
модели человек может общаться с любым другим человеком.
Количество контактов человека в единицу
времени (а под единицей времени в нашей модели подразумевается год) задается
параметром ContactRate. Запишем ContactRate в качестве первого сомножителя
нашей формулы.
Количество людей, которые владеют
продуктом, и могут убеждать остальных приобрести его, в нашей модели в каждый
момент времени будет определяться значением накопителя Adopters, и поскольку каждый
потребитель будет общаться в единицу времени с ContactRate людей, то количество
контактов в единицу времени у всех потребителей продукта будет равно Adopters*ContactRate.
Теперь нужно учесть тот факт, что в
результате общения не все те, кто еще не купил этот продукт, сразу побегут его
покупать - если кого-то доводы своего знакомого, успешно пользующегося
изучаемым нами продуктом, могут убедить, то кто-то может остаться к ним
равнодушным, и своего решения не покупать продукт не изменить. Поэтому мы
добавим в нашу формулу еще один сомножитель AdoptionFraction, задающий силу
убеждения владельцев продукта, определяющую ту долю контактов, которая приводит
к продажам продукта. Таким образом, наша формула приобретает вид
Adopters*ContactRate*AdoptionFraction.
И наконец, нам нужно учесть, что на данный
момент наша формула не учитывает того, что владельцы продукта будут общаться
как с потенциальными потребителями, так и с теми, кто уже владеет продуктом. И
общение с последними ни к каким новым продажам продукта не приведет. Поэтому
нам нужно учесть в нашей формуле и вероятность того, что тот, с кем общался
потребитель, ещё не владеет интересующим нас продуктом. Эта вероятность
задается так: PotentialAdopters/TotalPopulation.
В итоге наша формула будет выглядеть следующим образом:
Adopters*ContactRate*AdoptionFraction*PotentialAdopters/TotalPopulation
Именно столько потенциальных потребителей
будут приобретать продукт в единицу модельного времени под воздействием общения
с владельцами этого продукта.
 Создайте
динамическую переменную AdoptionFromWOM
1.
Аналогично
создайте еще одну динамическую переменную.
2.
Назовите
ее AdoptionFromWOM.
3.
Задайте для этой переменной следующую формулу:
ContactRate * AdoptionFraction *
PotentialAdopters * Adopters / TotalPopulation
4.
Вам
может показаться утомительным рисовать связи для задействованных в формулах
переменных и параметров. Чтобы облегчить этот процесс, AnyLogic предлагает
пользователям механизм быстрого исправления ошибок, связанных с отсутствующими
или избыточными связями. Когда Вы зададите указанную формулу, то щелкнув в этом
поле Вы увидите индикатор ошибки:

5.
Щелкните
мышью по индикатору. Вы увидите контекстное меню, состоящее из пунктов Добавить
отсутствующую связь для: .... Поочередно щелкнув по всем этим пунктам, Вы
добавите на диаграмму все недостающие связи.
В итоге у Вас должна будет получиться диаграмма
следующего вида:

Теперь мы можем задать формулу для потока
приобретения продукта. Значение потока определяется суммой двух его независимых
составляющих – продаж в результате рекламного влияния и продаж под влиянием
общения с потребителями продукта.
Задайте
формулу потока
1.
Выделите
поток AdoptionRate щелчком мыши.
2.
Перейдите
в панель Свойства.
3.
Введите
правую часть формулы, по которой будет вычисляться значение потока, в поле AdoptionRate=
: AdoptionFromAd + AdoptionFromWOM
4.
Добавьте
соответствующие связи от этих переменных к потоку AdoptionRate.

Теперь мы закончили создание нашей модели.
Диаграмма накопителей и потоков должна выглядеть как на приведенном ниже
рисунке:

Связи имеют полярность, положительную или
отрицательную:
·
Положительная
связь
означает, что два элемента системной динамики изменяют свои значения в одном
направлении, т.e. если значение элемента, из которого направлена связь,
уменьшается, значение другого элемента уменьшается тоже. Аналогично, если
увеличивается значение одного элемента, то и значение зависимого от него
элемента увеличивается тоже.
·
Отрицательная
связь
означает, что два элемента системной динамики изменяют свои значения в
противоположных направлениях, т.e. если значение элемента, из которого
направлена связь, уменьшается, то значение другого элемента увеличивается, и
наоборот.
Вы можете добавить рядом со связями метки,
которые будут обозначать полярность этих связей. Обычно полярность обозначается
с помощью символов +/- рядом со стрелкой связи. Таким образом, Вы можете
показать, как зависимая переменная изменяет свое значение при изменении
значения независимой переменной.
 Проставьте
полярности у связей
1.
Чтобы
отобразить у связи значок полярности, выделите связь и выберите нужный символ (+
или -) из группы кнопок Полярность в панели свойств связи:
2.
Здесь
же при желании можно изменить и цвет линии связи, а также ее толщину.

В нашей модели все связи, за исключеинем
той, что ведет от TotalPopulation к AdoptionFromWOM, имеют положительную
полярность.
Можно увидеть, что наша модель содержит
два цикла с обратной связью: один компенсирующий и один усиливающий.
·
Компенсирующий
цикл с обратной связью воздействует на поток приобретения продукта, вызванный
рекламой. Поток приобретения продукта сокращает число потенциальных
потребителей, что в свою очередь приводит к снижению интенсивности приобретения
продукта.

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

 Добавьте
идентификатор цикла, вызывающего насыщение рынка
1.
Перетащите
элемент Цикл  из палитры Системная динамика на
графическую диаграмму, как показано на рисунке ниже:

2.
Перейдите
в панель Свойства, чтобы изменить свойства цикла.
3.
Задайте
Направление цикла - этот цикл направлен Против часовой стрелки.
4.
В
поле Текст введите краткое описание этого цикла, объясняющее его смысл: Market
Saturation (или Насыщение рынка). Этот текст будет показан на
презентации.
5.
Из
группы кнопок Тип выберите символ, который будет отображаться для
данного цикла. Выберите символ B (обозначающий Balancing, то
есть компенсирующий цикл).
Чтобы определить, является ли цикл
усиливающим или уравновешивающим, Вы можете начать с предположения, что,
например значение переменной А увеличивается, и проследить за изменением значений
входящих в цикл переменных.
Цикл
является:
·
усиливающим, если после
прохождения по циклу Вы видите тот же результат, что был допущен при начальном
предположении (в нашем случае - увеличение значения).
·
уравновешивающим или
компенсирующим, если результат противоречит начальному предположению.
 Добавьте
идентификатор для цикла, задающего общение людей друг с другом
1.
Добавьте
еще один идентификатор цикла, как показано на рисунке ниже:

2.
Этот
цикл соответствует общению людей друг с другом. Он является усиливающим,
поэтому выберите для него символ R (обозначающий усиливающий, Reinforcing
цикл)
3.
Задайте
Word of Mouth (или Устное общение) в качестве текста.
4.
Задайте
Направление цикла - этот цикл направлен По часовой стрелке.
В итоге Ваша диаграмма должна выглядеть
следующим образом:

Задание
7.
Настройка
запуска модели
Вы можете сконфигурировать выполнение
модели в соответствии с Вашими требованиями. Модель выполняется в соответствии
с набором установок, задаваемым специальным элементом модели - экспериментом.
Вы можете создать несколько экспериментов с различными установками и изменять
рабочую конфигурацию модели, просто запуская тот или иной эксперимент
модели.
В панели Проекты эксперименты
отображаются в нижней части дерева модели. Один эксперимент, названный Simulation,
создается по умолчанию. Это простой эксперимент, позволяющий запускать модель с
заданными значениями параметров, поддерживающий режимы виртуального и реального
времени, анимацию и отладку модели.

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

Перед тем, как запустить модель, давайте
выберем режим ее выполнения. Модель AnyLogic может выполняться либо в режиме
виртуального, либо в режиме реального времени.
В режиме виртуального времени
модель выполняется без привязки к физическому времени – она просто выполняется
настолько быстро, насколько это возможно. Этот режим лучше всего подходит в том
случае, когда требуется моделировать работу системы в течение достаточно
длительного периода времени.
В режиме реального времени задается
связь модельного времени с физическим, то есть задается количество единиц
модельного времени, выполняемых в одну секунду. Это часто требуется, когда Вы
хотите, чтобы анимация модели отображалась с той же скоростью, что и в реальной
жизни.
 Задайте
выполнение модели в режиме реального времени
1.
В
панели Проекты, выделите эксперимент Simulation:Main щелчком мыши.
2.
Перейдите
в секцию Модельное время и выберите опцию Реальное время со скоростью.

3.
Задайте
скорость выполнения модели, т.e., сколько единиц модельного времени будет
соответствовать одной секунде реального времени. Выберите в выпадающем списке справа,
скажем, 2.

И давайте теперь изменим еще одно
свойство, но уже не эксперимента, а модели.
Во время моделирования мы будем изучать
значения наших переменных, и просматривать графики, демонстрирующие, как
менялись их значения по ходу моделирования.
Для этого нам даже не понадобится
добавлять и конфигурировать диаграммы - мы воспользуемся специальной
возможностью AnyLogic - окнами инспекта. Дело в том, что AnyLogic
автоматически запоминает значения, принимаемые динамическими переменными по
ходу моделирования, в специально создаваемых для этого наборах данных. И
значения этих наборов данных можно легко просмотреть в окнах инспекта, которые
доступны в режиме запуска модели.
Все, что мы хотим изменить - это увеличить
частоту сбора таких данных. По умолчанию новые значения переменных добавляются
в наборы данных каждую единицу модельного времени. Мы же хотим, чтобы данные
собирались, скажем, в 10 раз чаще.
 Увеличьте
частоту сбора данных для динамических переменных
1.
В
панели Проекты, сделайте двойной щелчок по элементу Main.
2.
Перейдите
в секцию Специфические панели Свойства и введите 0.1 в
поле Период.

Задание
8.
Запуск
модели
Постройте Вашу модель с помощью кнопки
панели инструментов Построить модель (при этом в рабочей области AnyLogic
должен быть выбран какой-то элемент именно этой модели). Если в модели есть
какие-нибудь ошибки, то построение не будет завершено, и в панель Ошибки
будет выведена информация об ошибках, обнаруженных в модели. Двойным щелчком
мыши по ошибке в этом списке Вы можете перейти к предполагаемому месту ошибки,
чтобы исправить ее.

Панель Ошибки
После того, как Вы исправите все ошибки и
успешно построите Вашу модель, Вы можете ее запустить.
 Запустите
модель
1.
Щелкните
мышью по кнопке панели инструментов Запустить и выберите из открывшегося
списка эксперимент, который Вы хотите запустить. Эксперимент этой модели будет
называться Bass Diffusion/Simulation.

В дальнейшем по нажатию на кнопку Запустить
(или по
нажатию F5) будет запускаться тот эксперимент, который запускался Вами в
последний раз. Чтобы выбрать какой-то другой эксперимент, Вам будет нужно
щелкнуть мышью по стрелке, находящейся в правой части кнопки Запустить и выбрать
нужный Вам эксперимент из открывшегося списка (или щелкнуть правой кнопкой мыши
по этому эксперименту в панели Проекты и выбрать Запустить из
контекстного меню).
Запустив модель, Вы увидите окно
презентации этой модели. В нем будет отображена презентация запущенного
эксперимента. AnyLogic автоматически помещает на презентацию каждого простого
эксперимента заголовок и кнопку, позволяющую запустить модель и перейти на
презентацию, нарисованную Вами для главного типа агентов этого эксперимента
(Main).

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

При желании Вы можете изменить скорость
выполнения модели с помощью кнопок панели управления окна презентации Замедлить
и Ускорить .
AnyLogic
поддерживает различные инструменты для сбора, отображения и анализа данных во
время выполнения модели. Простейшим способом просмотра текущего значения и
истории изменения значений переменной или параметра во время выполнения модели
является использование окна инспекта.
 Исследуйте
динамику обеих составляющих потока продаж
1.
Щелкните
мышью по переменной AdoptionFromAd в окне презентации. Появится желтое окошко -
окно «инспекта». При желании Вы можете передвинуть это окно, перетащив его
мышью за заголовок. Изменить размер можно перетащив мышью нижний правый угол
окна.
2.
По
умолчанию окно инспекта находится в режиме инспекта - оно отображает текущее
значение переменной. Вы можете переключить окно в режим графика, при этом оно
будет отображать временной график изменений значения переменной с течением
модельного времени. Текущее значение переменной также отображается и в этом
режиме (рядом с началом координат графика). Окно инспекта автоматически
масштабируется таким образом, чтобы полностью вместить кривые графиков от
начала до конца периода моделирования.
Обычно окна инспекта используются только
для беглого ознакомления с проистекающими в модели процессами, для более
тщательной визуализации и анализа данных используются диаграммы и объекты сбора
статистики, расположенные на палитре Статистика. С помощью этих
элементов Вы можете добавлять на презентацию любые графики, диаграммы и
гистограммы и вести статистический анализ собранных данных.
3.
Аналогичным
образом откройте окно инспекта переменной AdoptionFromWOM и переключите его в
режим графика.

Теперь мы можем увидеть, что при внедрении
нового продукта на рынок, когда число потребителей равно нулю, реклама будет
являться единственным источником продаж. Наибольший рекламный эффект отмечается
в начале процесса распространения продукта; он неуклонно падает по мере
уменьшения численности потенциальных потребителей.
Задание
9.
Добавление
диаграмм
Как мы уже отмечали ранее, AnyLogic поддерживает
различные инструменты для сбора, отображения и анализа данных во время
выполнения модели. Простейшим способом просмотра истории изменения значений
переменной во время выполнения модели является использование окна инспекта. Для
более тщательной визуализации и анализа данных используются диаграммы и объекты
сбора данных, расположенные на палитре Статистика.

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

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

5.
Задайте
выражение, результат вычисления которого будет отображаться на графике. Мы
хотим отображать численность потенциальных потребителей, поэтому введите в поле
Значение имя соответствующего накопителя: PotentialAdopters.
6.
В
поле Заголовок введите Potential adopters. Эта строка будет отображаться
в легенде диаграммы для этого элемента данных.
7.
Аналогично
добавьте на график еще один элемент данных, который будет отображать значение
накопителя Adopters (если у Вас возникнут вопросы, то Вы можете свериться с
расположенным ниже рисунком):

8.
В
поле Временной диапазон секции свойств Масштаб задайте диапазон
временной оси диаграммы (количество единиц модельного времени (N), для которого
будут отображаться значения переменной): 8. Диаграмма будет отображать график
только для заданного временного интервала (равного в нашем случае длительности
периода моделирования).
9.
Измените
частоту обновления графика новыми данными в секции свойств Обновление данных.
Введите 0.1 в поле Период для опции Обновлять автоматически.

 Добавьте график, отображающий
изменение интенсивности продаж
1.
Добавьте
на диаграмму еще один временной график. Поместите его под добавленным ранее
графиком:

2.
Добавьте
на график новый элемент данных (в качестве Значения в этом случае должно
быть задано имя потока AdoptionRate) и измените, свойства графика, как показано
на приведенном рисунке:

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

Мы закончили создание простейшей модели
системной динамики. Эта модель часто используется в классических учебниках по
системной динамике, и именно поэтому она и была выбрана нами для учебного
пособия. На этом примере мы хотели продемонстрировать Вам, как создаются
типовые модели системной динамики в AnyLogic.
Теперь мы можем несколько
усовершенствовать эту модель, попутно продемонстрировав специализированные
возможности AnyLogic, реализованные в первую очередь именно для приверженцев
системно-динамического метода моделирования.
Задание
10. Моделирование
повторных покупок
Созданная модель не учитывает
того, что со временем продукт может быть израсходован или прийти в негодность,
что вызовет необходимость его повторного приобретения. Мы смоделируем повторные
покупки, полагая, что потребители продукта снова становятся потенциальными
потребителями, когда продукт, который они приобрели, становится непригоден.
Вначале мы определим
константу, задающую среднее время жизни продукта.
Создайте константу ProductLifeTime
1.
Пусть средняя продолжительность использования нашего продукта
равна двум годам. Введите Значение по умолчанию 2.

Потребители продукта снова
становятся потенциальными потребителями тогда, когда продукт, который они
приобрели, расходуется и перестает использоваться. Поэтому поток прекращения
использования продукта является ничем иным, как потоком приобретения,
задержанным на среднее время пригодности продукта.
Создайте поток прекращения
использования продукта, ведущий из Adopters в PotentialAdopters
1.
Если нарисовать новый поток прямой стрелкой, ведущей от Adopters к
PotentialAdopters, то этот поток будет нарисован поверх стрелки существующего
потока AdoptionRate. Поэтому давайте нарисуем поток более сложной формы (см.
рисунок ниже). Для этого используем другой, более подходящий для данного
случая, способ рисования потоков.
2.
Сделайте двойной щелчок по элементу  Поток в палитре Системная
динамика. Значок элемента при этом должен смениться на следующий: .
3.
Сразу после этого щелкните мышью по накопителю Adopters, потом
щелкните в промежуточных точках изгиба стрелки потока, и завершите рисование
потока, сделав двойной щелчок по накопителю PotentialAdopters, в который этот
поток втекает.

4.
Назовите поток DiscardRate. Формулы накопителей после этого должны
будут выглядеть следующим образом:

5.
Задайте следующую формулу для потока DiscardRate: delay(AdoptionRate,
ProductLifeTime)

Функция delay() реализует
временную задержку; она имеет следующую нотацию:
delay(<задерживаемый
поток>, <значение задержки>, <начальное значение>)
В нашем случае функция
представляет собой AdoptionRate с временной задержкой ProductLifeTime. Пока не
истекло время использования первого приобретенного продукта, поток равен нулю.
Как и
во всех других аналогичных случаях, написание такой формулы потребует
добавления ссылок от переменных AdoptionRate и ProductLifeTime к потоку
DiscardRate.
Проверить работу функции
задержки проще всего с помощью диаграммы. Для этого мы добавим на график,
отображающий динамику изменения интенсивности продаж, и другую интенсивность -
интенсивность отказа от продукта, определяемую нашим потоком DiscardRate.
 Добавьте на нижний график
новый элемент данных, отображающий динамику изменения интенсивности DiscardRate

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

Теперь мы закончили
моделирование повторных покупок продукта. Вы можете проверить, как работает
функция задержки. Запустите модель и исследуйте графики переменных AdoptionRate
и DiscardRate. Вы сможете увидеть, что график потока прекращения использования
продукта имеет именно тот вид, который мы и предполагали увидеть—он является
ничем иным, как потоком приобретения продукта, задержанным на 2 года—время
пригодности продукта.
Задание
11. Моделирование
цикличности спроса
В текущей модели доля контактов
потребителей продукта с потенциальными потребителями, которая приводит к
продажам продукта, полагается постоянной. На самом деле она изменяется, поскольку
спрос на наш продукт зависит от текущего времени года. Продукт пользуется
наибольшим спросом летом, в то время как зимой спрос на товар резко падает, за
исключением небольшого предпраздничного периода в декабре. Давайте и
промоделируем теперь сезонную цикличность спроса.
Добавление
экспериментальных данных
Предположим, что у нас есть
экспериментальные данные того, как изменяется средний спрос на продукт в
течение года. Мы добавим эти данные в нашу модель с помощью табличной функции.
Табличная функция – это функция, заданная в табличной форме, которая может быть
сделана непрерывной с помощью интерполяции и экстраполяции.
Задание кривой спроса с помощью
табличной функции
1.
Перетащите
элемент Табличная функция из палитры Системная динамика на
диаграмму класса Main.
2.
Назовите
функцию demand.
3.
Задайте
данные табличной функции в секции Табличные данные панели свойств
функции. Каждая пара "аргумент-значение" задается в отдельной строке
таблицы. Чтобы задать новую пару значений, щелкните мышью в пустой ячейке Аргумент
и введите новый аргумент функции. Затем щелкните в соседней ячейке Значение
справа и введите значение функции, соответствующее этому аргументу. Задайте
следующие данные:

4.
Задайте
тип интерполяции. Выберите Линейная из выпадающего списка Интерполяция.
Интерполяция будет производиться соединением табличных точек прямыми линиями.
5.
Задайте
тип реакции на аргументы, лежащие за пределами области допустимых значений
функции. Выберите Ближайший из выпадающего списка Если аргумент
выходит за пределы. В случае вызова функции с аргументом, лежащим за
пределами интервала заданных значений, будет использоваться ближайший заданный
аргумент функции.
Закончив
задание функции, Вы можете посмотреть, как она выглядит, с помощью графика в
секции предварительного просмотра функции:

Моделирование влияния меняющегося спроса
на интенсивность приобретения продукта
Теперь мы хотим промоделировать то, как
спрос на продукт влияет на количество людей, приобретающих продукт под влиянием
общения с владельцами продукта. Для этого мы создадим специальную функцию и
заменим параметр AdoptionFraction вспомогательной переменной, значение которой
будет вычисляться согласно этой функции.
Задайте
функцию
1.
Перетащите
элемент Функция из палитры Основная на диаграмму
типа Main.
2.
Назовите
функцию adoptFraction.
3.
Функция
будет возвращать вещественное значение, поэтому выберите double из
выпадающего списка Тип возвращаемого значения.
4.
У
функции должен быть один аргумент, с помощью которого ей будет передаваться
текущее значение времени. Добавьте в таблицу Аргументы функции аргумент
с именем time типа double.
5.
В
секции свойств Тело функции замените существующую строку на следующую:
return demand( getMonth() + 1 )/200.0;
Функция getMonth() вычисляет номер
текущего месяца. Этот номер передается табличной функции demand. Табличная
функция возвращает значение спроса на продукт для данного месяца. В заключение,
для получения значения доли людей, покупающих продукт под влиянием общения,
значение спроса делится на коэффициент преобразования.
Ну и наконец, нужно будет заменить
константу вспомогательной переменной, значение которой определяется нашей
функцией.
Замените
параметр AdoptionFraction вспомогательной переменной
1.     Удалите параметр
AdoptionFraction.
2.     Добавьте
вспомогательную переменную AdoptionFraction. Задайте в качестве формулы
переменной adoptFraction(time()). Таким образом, значение переменной будет
вычисляться согласно нашей функции. Функция принимает один аргумент, time().
Функция time()
возвращает текущее значение модельного времени.
Запустите модель. Вы увидите, что теперь
поведение модели колеблется около точки равновесия в силу того, что теперь
колеблются значения и потока приобретения, и потока прекращения использования
продукта.

С помощью диаграммы проследите
динамику изменения численностей потребителей.
Теперь численность
потенциальных потребителей не уменьшается до нуля, а постоянно пополняется по
мере того, как потребители заново покупают продукты взамен непригодных.
Интенсивность приобретения продукта растет, падает, и в итоге принимает
какое-то значение, зависящее от средней жизни продукта и параметров,
определяющих интенсивность этого потока. Наличие в модели прекращения
использования продукта означает, что какая-то доля населения всегда будет
оставаться потенциальными потребителями.
Задание
12. Моделирование
стратегии рекламной кампании
На данный момент эффективность рекламы в
нашей модели полагается постоянной. На самом деле, она зависит от текущих
расходов компании на рекламу. Мы хотим улучшить нашу модель, чтобы иметь
возможность управлять расходами на рекламную кампанию. Изменяя месячные расходы
на рекламу, мы сможем повлиять на текущую эффективность рекламы.
Моделирование месячных расходов
Создайте константу, задающую месячные
расходы компании
1.
Создайте
параметр MonthlyExpenditures.
2.
Задайте
Значение по умолчанию: 1100.
Замените
параметр AdEffectiveness вспомогательной переменной
1.
Удалите
параметр AdEffectiveness.
2.
Создайте
вспомогательную переменную AdEffectiveness с формулой:
MonthlyExpenditures/10000.0. Мы полагаем, что именно так эффективность рекламы
зависит от текущих рекламных расходов компании.
3.
Добавьте
еще одну связь зависимости, ведущую от параметра MonthlyExpenditures к
динамической переменной AdEffectiveness.

Мы хотим вести статистику всех расходов
компании. Это может быть сделано созданием специальной переменной для хранения
информации о том, сколько денег было потрачено на рекламу продукта. Каждый
месяц мы будем обновлять это значение с помощью специального события, добавляя
значение запланированных на предстоящий месяц расходов на рекламную кампанию
продукта.
Добавьте переменную для хранения общих
расходов компании
1.
Перетащите
элемент Переменная из палитры Агент на диаграмму типа
агента Main.
2.
Назовите
переменную TotalExpenditures.
Создайте событие, которое будет обновлять
значение TotalExpenditures
1.
Перетащите
элемент Событие из палитры Агент на диаграмму типа
агента Main.
2.
Назовите
событие monthlyEvent.
3.
Сделайте
так, чтобы таймер срабатывал каждый месяц. Выберите Циклический из
выпадающего списка Режим. Поскольку одна единица модельного времени в
нашей модели соответствует одному году, то одному месяцу будет соответствовать
выражение 1.0/12.0. Введите 1.0/12 в поле Таймаут.
4.
Задайте Действие события: TotalExpenditures
+= MonthlyExpenditures;
Этот код будет выполняться каждый раз по
истечении таймаута события. Он выполняет сбор статистики, а именно добавляет
значение запланированных рекламных расходов на предстоящий месяц к значению
переменной TotalExpenditures.

Моделирование плана рекламной кампании
Поскольку реклама играет значительную роль
только в начальной стадии процесса завоевания рынка, мы хотим в какой-то момент
времени, скажем, через 3 года остановить рекламную кампанию. Этим мы сэкономим деньги,
бесцельно тратящиеся на рекламу тогда, когда насыщение рынка будет определяться
практически исключительно покупками продукта, вызванными общением потребителей
с потенциальными потребителями.
Добавьте константу, задающую время
переключения
1.
Добавьте
параметр SwitchTime.
2.
Задайте
Значение по умолчанию: 3.
Теперь мы визуально зададим поведение
системы с помощью диаграммы состояний.
Создайте диаграмму состояний для
моделирования рекламной стратегии
1.
Начните
задание диаграммы состояний с добавления элемента Начало диаграммы состояний
(перетащите
этот элемент на диаграмму из палитры Диаграмма состояний).

2.
Добавьте
состояние. Перетащите элемент Состояние из палитры Диаграмма
состояний так, чтобы состояние присоединилось к добавленному ранее элементу
(см. рисунок ниже). Измените имя состояния на with_advertising.

3.
Добавьте
еще одно состояние под только что созданным. Назовите его without_advertising.

4.
Нам
нужно остановить рекламную кампанию в тот момент, когда диаграмма состояний
войдет в это состояние. Поэтому напишите в поле свойства Действие при входе
этого состояния MonthlyExpenditures=0.0;

5.
Добавьте
переход, ведущий из состояния with_advertising в состояние without_advertising.
Сделайте двойной щелчок мышью по элементу Переход в палитре Диаграмма
состояний. Затем нарисуйте переход, ведущий из состояния with_advertising в
состояние without_advertising, щелкнув по границе верхнего состояния, а затем
по границе нижнего состояния.

6.
Укажите,
что этот переход произойдет по истечении времени SwitchTime. Для этого выберите
По таймауту из выпадающего списка Происходит и введите SwitchTime
в поле Таймаут.

Теперь, когда диаграмма состояний
находится в начальном состоянии with_advertising, рекламные расходы кампании
определяются переменной MonthlyExpenditures. Как только диаграмма состояний
покидает это состояние в момент времени SwitchTime, компания перестает
рекламировать продукт.
Запустите модель и убедитесь, что
рекламная кампания длится теперь только три года.
Задание 13. Оптимизация
рекламной стратегии
Рыночная стратегия в данной модели
предельно проста: в определенный момент времени компания прекращает
рекламировать продукт.
Мы же хотим найти оптимальную рыночную
стратегию для достижения требуемого количества потребителей к определенному
моменту времени при минимальных затратах на рекламу.
Мы можем решить эту проблему, используя
оптимизацию, при которой выбранные параметры модели будут систематически
изменяться для минимизации или максимизации значения целевого функционала.
Создайте оптимизационный эксперимент
1.
В
панели Проекты щелкните правой кнопкой мыши по элементу модели и
выберите Создать > Эксперимент из контекстного меню. Откроется диалоговое
окно Новый эксперимент.
2.
Выберите
Оптимизация из списка Тип эксперимента и нажмите Готово.

Вы увидите, что в модели будет создан еще
один эксперимент, а в графическом редакторе будет открыта его диаграмма.
Мы будем оптимизировать значения
параметров MonthlyExpenditures и SwitchTime. Во время оптимизации, значения
параметров модели будут систематически изменяться, чтобы найти наименьшее
значение переменной TotalExpenditures, выбранной в качестве целевого
функционала, при котором достигается насыщение рынка к заданному моменту
времени.
Задайте оптимизационные параметры
1.
Выделите
оптимизационный эксперимент в панели Проекты и перейдите в панель Свойства.

2.
Все
параметры агента верхнего уровня эксперимента перечислены в таблице Параметры,
расположенной в соответствующей секции свойств эксперимента. По умолчанию все
они сделаны фиксированными, т.e. они не участвуют в оптимизационном
процессе (их значения не меняются). Чтобы включить параметр в процесс
оптимизации (то есть, разрешить варьирование его значения для поиска наилучшего
значения функционала), Вам нужно выбрать в ячейке Тип соответствующих
нужным параметрам строках таблицы другую опцию вместо фиксированный.
3.
Давайте
вначале сконфигурируем параметр MonthlyExpenditures. Выберите непрерывный
в ячейке Тип строки MonthlyExpenditures. Задайте максимально
возможное значение параметра в ячейке Макс. равным 10000, а Начальное
значение равным 1000. Таким образом мы говорим оптимизатору, что параметр может
принимать любые вещественные значения в интервале от 0 до 10000, а начнет
оптимизатор процесс оптимизации со значения 1000.
4.
Теперь
сделаем то же для параметра SwitchTime. Выберите дискретный в ячейке Тип,
поскольку мы хотим, чтобы этот параметр принимал только значения,
соответствующие определенным временным промежуткам: один месяц, два месяца и
т.д. Задайте 0.0833 в ячейке Шаг. Это значение соответствует одному
месяцу в нашей модели, так как 1 соответствует одному году, то один месяц равен
1.0/12.0 = 0.0833. В ячейке Макс. выберите 1.5, а в ячейке Начальное
1.

Создайте интерфейс эксперимента
1.
Щелкните
по кнопке Создать интерфейс в панели свойств эксперимента.

2.
Тем
самым мы создадим заданный по умолчанию интерфейс для эксперимента (см. рисунок
ниже) - набор элементов управления для отображения результатов процесса
оптимизации по ходу его выполнения.

Обратите внимание,
что создание интерфейса удаляет все содержимое диаграммы оптимизационного
эксперимента, поэтому мы рекомендуем вначале создать предлагаемый по умолчанию
интерфейс, а уже потом изменять его.
Задайте функционал оптимизации
1.
Мы
хотим минимизировать деньги, затраченные на рекламу продукта. В панели свойств
эксперимента введите root.TotalExpenditures в поле Целевая функция.
Здесь мы обращаемся к агенту верхнего уровня эксперимента как к переменной
root.
2.
Оставьте
выбранной опцию минимизировать.
Сконфигурируйте оптимизацию
1.
В
панели свойств эксперимента задайте максимальное количество «прогонов» модели,
которое будет произведено оптимизатором. Введите 500 в поле Количество
итераций.
2.
Чтобы
процесс оптимизации успешно выполнялся, нужно убедиться в том, что он будет
заканчиваться. По умолчанию моделирование не заканчивается, поэтому оптимизатор
не получит результат, который должен бы был получить по окончании выполнения
каждого отдельного «прогона» модели. Поэтому нужно явно задать условие останова
«прогона». Перейдите в секцию свойств эксперимента Модельное время и
выберите опцию В заданное время из выпадающего списка Остановить.
В поле Конечное время введите 1.5. Теперь «прогоны» модели будут
завершаться по прошествии полутора единиц модельного времени (то есть, лет).
Задание
дополнительного требования (проверка насыщения рынка)
Теперь давайте зададим дополнительное
требование к результатам оптимизации, которое будет проверяться после
выполнения каждого «прогона» модели. Мы хотим, чтобы по прошествии полутора лет
модельного времени продукт приобрели 80000 человек.
Задайте the requirement
for the optimization experiment
1.
Выделите
оптимизационный эксперимент в панели Проекты и перейдите в секцию
свойств Ограничения. Задайте требование к результатам оптимизации в
верхней строке таблицы Требования (проверяются после «прогона» для
определения того, допустимо ли найденное решение).
2.
Введите
root.Adopters в ячейке Выражение. Корневой агент эксперимента доступен
здесь по имени root.
3.
Выберите
>= в ячейке Тип.
4.
Введите
80000 в ячейке Граница.
5.
Наконец,
установите флажок в самом левом столбце таблицы, чтобы активировать это
ограничение.

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

3.
AnyLogic
запустит модель 500 раз, изменяя значения параметров MonthlyExpenditures и
SwitchTime. Итоговая информация о результатах будет отображаться в специальных
элементах управления на диаграмме эксперимента в окне презентации.

Когда процесс оптимизации модели
завершится, Вы увидите, что Лучшее значение функционала равно четырем с лишним
тысячам. Эксперимент в итоге выдаст оптимальные значения параметров SwitchTime
и MonthlyExpenditures, при которых было достигнуто это значение функционала.
Теперь можно обновить модель этими
значениями параметров SwitchTime и MonthlyExpenditures. Сохраните полученные
значения параметров в эксперименте Simulation, чтобы использовать в
нашей модели найденную оптимальную стратегию.
Примените результаты оптимизации
1.
После
завершения оптимизации, щелкните по кнопке copy на холсте диаграммы
эксперимента в окне презентации. Таким образом Вы скопируете найденные
(оптимальные) значения параметров в Буфер обмена.
2.
Закройте
окно презентации и выделите эксперимент Simulation в панели Проекты.
3.
Вставьте
скопированные значения параметров из Буфера обмена, щелкнув по кнопке Вставить
из буфера в панели свойств эксперимента.
Запустите эксперимент Simulation. Теперь
модель будет запущена с оптимальными значениями параметров, при которых в
процессе оптимизации было получено наилучшее значение функционала. Можете
проверить, что к заданному времени (1,5 года) достигается требуемое количество
пользователей продукта.
Теперь мы спланировали стратегию
завоевания рынка таким образом, чтобы рекламная кампания была наиболее
рациональной и эффективной.
Контрольные вопросы
1.     Перечислите
основные этапы построения динамических моделей в среде AnyLogic.
2.     Для чего
используются фазовые графики при представлении результатов моделирования?
3.     Перечислите
типовые звенья, используемые при моделировании линейных динамических систем.
4.     Что представляет
собой переходный процесс в динамических системах?
5.     Дайте
характеристику типовым звеньям динамических систем с точки зрения протекания в
них переходных процессов.
6.     Как строится
интерфейс эксперимента AnyLogic для связи с параметрами модели?
7.     Как выполняется
соединение подсистем при построении динамической модели в AnyLogic?
8.     В чем заключается
принцип работы динамической системы с отрицательной обратной связью?
Практическая работа №7
Тема:
Разработка
многоагентной модели в AnyLogic
Цель:
- изучить
методологию агентного моделирования. Приобрести практические навыки работы c
системой AnyLogic при построении агентных моделей.
Вид
работы:
фронтальный
Время
выполнения:
2 часа
Теоретические сведения
В данной практической работе предлагается
изучить агентный подход моделирования сложных систем. В ходе работы создается
классическая модель распространения инноваций Басса и те ее расширения, которые
демонстрируют  возможности AnyLogic для создания агентных моделей.
Агенты в AnyLogic
Агент – это некоторая сущность, которая
обладает активностью, автономным поведением, может принимать решения в соответствии
с некоторым набором правил, может взаимодействовать с окружением и другими
агентами, а также может изменяться (эволюционировать). Многоагентные (или
просто агентные) модели используются для исследования децентрализованных
систем, динамика функционирования которых определяется не глобальными правилами
и законами, а, наоборот, эти глобальные правила и законы являются результатом
индивидуальной деятельности членов группы. Цель агентных моделей – получить
представление, об общем поведении системы исходя из знаний о поведении ее
отдельных активных объектов и взаимодействии этих объектов в системе. Агентная
модель может содержать десятки и даже сотни тысяч активных агентов.
При помощи агентов моделируют рынки (агент
– потенциальный покупатель), конкуренцию и цепочки поставок (агент – компания),
население (агент – семья, житель города или избиратель) и мн. др.
В среде AnyLogic можно легко и быстро
создавать модели с агентами. Агент естественно реализовывать с помощью базового
элемента AnyLogic – активного объекта. В модели можно создавать классы активных
объектов и далее использовать в модели любое число экземпляров этих классов.
Активный объект имеет параметры, которые можно изменять извне, переменные,
которые можно считать памятью агента, а также поведение (рис. 1).

Рисунок 1
Параметры могут указывать пол агента, дату
рождения и т.д. Переменными можно, например, выразить возраст агента, его
координаты в пространстве, социальные свойства.
Стейтчарты и таймеры могут выражать
поведение: состояния агента и изменение состояний под воздействием событий и
условий. Например, переходы в разные возрастные или социальные группы,
изменения образования или дохода и т.д.
Кроме
того, агент может иметь интерфейс для взаимодействия с окружением, который
реализуется с помощью интерфейсных объектов: портов и интерфейсных переменных.
Ход работы
Создайте новый проект для будущей модели и
сохраните его в своей папке.
Первым шагом при создании агентной модели
является создание агентов. Для каждого агента задается набор правил, согласно
которым он взаимодействует с другими агентами; это взаимодействие и определяет
общее поведение системы. В нашей модели агентами будут люди. Создадим агентную
модель с помощью Мастера создания модели.
Создание агентной модел
Шаг 1. Щелкните мышью по кнопке панели инструментов
Создать. Появится диалоговое окно Новая модель. Задайте имя новой
модели. Щелкните мышью по кнопке Далее.
Шаг 2. Выберите шаблон модели (рис. 2). В
связи с тем, что мы хотим создать новую агентную модель, то нужно установить
флажок Использовать шаблон модели и выбрать Агентная модель в
расположенном ниже списке Выберите метод моделирования. Щелкните мышью
по кнопке Далее.

Рисунок 2
Шаг 3. Создайте агентов, т.е. задайте имя
класса агента и количество агентов, которое будет изначально создано в нашей
модели. Задайте в качестве имени класса Person и введите в поле Начальное
количество агентов 1000. Щелкните мышью по кнопке Далее.
Шаг 4. Задайте свойства пространства, в
котором будут обитать агенты и выберите фигуру анимации агента. Установите
флажок Добавить пространство и выберите ниже тип этого пространства – Непрерывное.
Задайте размерности данного пространства: введите в поле Ширина – 600, а
в поле Высота – 350. В результате наши агенты будут располагаться
каким-то образом в пределах непрерывного пространства, отображаемого на
презентации модели областью размером 600×350 пикселей. Не меняйте
значения, выбранные в выпадающих списках Начальное расположение и Анимация;
пусть агенты изначально расставляются по пространству случайным образом, а
анимируются с помощью фигурки человечка. Щелкните мышью по кнопке Далее.
Шаг 5. Задайте сеть взаимосвязей агентов
(рис. 3). Установите флажок Использовать сеть и оставьте выбранной опцию
Случайное. Ниже можно установите флажок Показывать связи, чтобы
отображать на презентации связи между знакомыми (или потенциально могущими
встретиться и пообщаться) агентами с помощью линий. Щелкните мышью по кнопке Далее.

Рисунок 3
Шаг 6. Установите флажок Добавить
простое поведение. В результате у агента будет создана диаграмма состояний.
Задание характеристик агента
Характеристики агента задаются с помощью
параметров класса. Все агенты обладают общей структурой, поскольку все они
задаются объектами одного класса. Параметры же позволяют задавать
характеристики индивидуально для каждого агента. Создадим параметр, который
задает подверженность человека влиянию рекламы.
Откройте структурную диаграмму класса Person.
Перетащите элемент Параметр  из палитры Основная на диаграмму
класса, в окне свойств параметра задайте имя AdEffectiveness, значение
по умолчанию – 0.011.
Задание поведения агента
Поведение агента обычно описывается в
классе этого агента (в нашей модели это класс Person) с помощью диаграммы
состояний (стейтчарт).
Мастер создания моделей уже создал
простейшую диаграмму состояний из двух состояний, между которыми существует два
разнонаправленных перехода. Изменим данный стейтчарт.
1. Откройте структурную диаграмму класса Person.
На диаграмме класса вы увидите следующую диаграмму состояний (рис. 4).

Рисунок 4
2. Откройте свойства верхнего состояния,
переименуйте верхнее состояние в PotentialAdopter. Это начальное
состояние. Нахождение стейтчарта в данном состоянии означает, что человек еще
не купил продукт.
3. Нижнее состояние назовите Adopter
(т.е. человек уже купил продукт).
4. Измените свойства перехода из состояния
PotentialAdopter в состояние Adopter. Этот переход будет
моделировать покупку продукта.
В окне свойств перехода выберите С
заданной интенсивностью из выпадающего списка Происходит и введите AdEffectiveness
в расположенном ниже поле Интенсивность. Время, через которое человек
купит продукт, экспоненциально зависит от эффективности рекламы продукта.
5. Удалите переход, ведущий из нижнего
состояния в верхнее, поскольку мы пока создаем простейшую модель, в которой человек,
однажды приобревший продукт, навсегда остается его потребителем, и
соответственно перехода из состояния Adopter в состояние PotentialAdopter
пока что быть не должно (рис. 5). Чтобы удалить переход, выделите его на
диаграмме и нажмите Del.

Рисунок 5
6. Настройте выполнение модели (рис. 6). В
окне свойств эксперимента перейдите на вкладку Модельное время и задайте
останов модели после 8 единиц модельного времени.

Рисунок 6
7. Постройте проект с помощью кнопки
панели инструментов Построить (клавиша F7). Если ошибок в проекте
нет, то запустите модель. Вы увидите, как число потенциальных покупателей
(синих) переходит в разряд покупателей (красных).
Подсчет потребителей продукта
Главная задача модели распространения
продукта – изучение того, как быстро люди покупают новый продукт. Для этого
будем подсчитывать число потребителей и потенциальных потребителей продукта,
что можно сделать с помощью функций сбора статистики.
Создадим функции сбора статистики для
подсчета потенциальных потребителей продукта.
1. Откройте диаграмму класса Main.
Выделите на диаграмме вложенный объект people.
2. Перейдите на вкладку Статистика
панели свойств объекта people. Щелкните мышью по кнопке Добавить
функцию сбора статистики. Откроется секция свойств для задания свойств новой
функции сбора статистики по элементам этого реплицированного объекта (people).
3. Задайте имя функции – potentialAdopters.
Оставьте выбранный по умолчанию Тип функции – кол-во.
Задайте Условие:
item.statechart.isStateActive(item.PotentialAdopter)
Эта функция будет вести подсчет количества
агентов, для которых выполняется заданное условие, т.e. тех агентов,
которые находятся в текущий момент времени в состоянии PotentialAdopter (являются
потенциальными потребителями продукта). Здесь item – это агент (элемент
реплицированного объекта people).
4. Создайте еще одну функцию сбора
статистики (рис. 7). Назовите ее adopters. Тип функции – кол-во.
Условие:
item.statechart.isStateActive(item.Adopter)
Данная функция будет вести подсчет
количества агентов, которые находятся в состоянии Adopter (т.е. уже
приобрели продукт).

Рисунок 7
5. Добавьте временной график, отображающий
динамику изменения численностей потребителей и потенциальных потребителей
продукта. Расположите его, как показано на рис. 8.

Рисунок 8
Настройте свойства графика (рис. 9).

Рисунок 9
6. Запустите модель. На графике (рис. 10)
просмотрите динамику моделируемого процесса.
Вы увидите, что под влиянием рекламы
каждую единицу времени постоянная доля от общей численности потенциальных
потребителей продукта приобретает изучаемый нами продукт.

Рисунок 10
Учет влияния общения людей
В текущей модели люди приобретают продукт
только под влиянием рекламы. На самом деле рекламный эффект играет значительную
роль только в момент выпуска продукта на рынок. В дальнейшем все большую роль
будет играть общение людей со своими знакомыми, которые этот продукт уже
приобрели. В основном люди приобретают новые продукты именно под влиянием
убеждения своих знакомых; данный процесс чем-то схож с распространением
эпидемии.
Чтобы учесть влияние общения людей, внесем
в нашу модель небольшие изменения.
Откройте диаграмму класса Person и
создайте два новых параметра:
1) параметр ContactRate –
среднегодовое количество встреч человека. Значение по умолчанию – 100. Тип – int.
Предположим, что человек в среднем встречается со 100 людьми в год.
2) параметр AdoptionFraction – сила
убеждения человека, влияющая на то, сколько людей он сможет убедить в
необходимости купить продукт. Значение по умолчанию – 0.015. Тип – double.
Измените стейтчарт агента:
1) откройте диаграмму стейтчарта adoption.
2) добавьте в состояние Adopter
внутренний переход (рис. 11). Для этого щелкните мышью по кнопке панели
инструментов Переход, затем поочередно щелкните по любым двум сторонам
состояния Adopter.

Рисунок 11
3) задайте интенсивность, по которому
происходит переход, – ContactRate.
Данный переход будет моделировать покупку
продукта знакомым этого человека. От того, насколько быстро владелец продукта
сумеет убедить своего знакомого в необходимости покупки, будет зависеть от силы
убеждения этого человека и от того, сколько знакомых он встречает за год.
4) задайте Действие перехода:
send("Buy!", RANDOM);
Такой переход посылает сообщение случайно
выбранному человеку. Метод send() отсылает сообщение другому агенту.
Первый аргумент задает сообщение, которое будет послано, а второй задает
агента, которому сообщение будет адресовано. В нашем случае мы посылаем
сообщение какому-то случайно выбранному агенту, поэтому в качестве значения
аргумента мы используем специальную константу RANDOM (рис. 12).

Рисунок 12
Данный переход генерирует сигнал для
стейтчарта какого-то знакомого. Затем срабатывает переход стейтчарта,
моделирующий покупку продукта этим знакомым.
5) добавьте еще один переход из состояния PotentialAdopter
в состояние Adopter (рис. 13). Он будет срабатывать по сигналу, который
будет генерироваться внутренним переходом состояния Adopter.

Рисунок 13
6) измените свойства этого перехода.
Вероятность принятия решения о покупке
продукта будет зависеть от силы убеждения человека. В нашей модели данная
характеристика задается параметром AdoptionFraction.
Введите randomTrue(AdoptionFraction) в поле Доп.
условие. В результате введения дополнительного условия продукт будет
приобретаться с вероятностью, задаваемой параметром AdoptionFraction.
Переход будет срабатывать, когда диаграмма
состояний этого агента получит сообщение "Buy!" («Купи!») от другого
агента – своего знакомого. Чтобы этот переход срабатывал при получении
сообщения, на странице свойств данного перехода выберите из выпадающего списка Происходит
При получении сообщения (рис. 14). Укажите, что переход будет
срабатывать только при получении сообщения соответствующего содержания. Для
этого выберите из группы Тип сообщения опцию String, далее –
опцию Если сообщение равно и введите "Buy!" в расположенном
ниже поле.

Рисунок 14
Измените свойства агента.
Откройте свойства класса Person
(рис. 15). В поле Действие при получении сообщения введите statechart.receiveMessage(msg);

Рисунок 15
Запустите модель. Изучите динамику
изменения числа потребителей и потенциальных потребителей продукта. Графики
переменных должны представлять собой S-образные кривые.
Создание пространственной модели
Сделаем нашу модель более реалистичной,
допустив возможность общения только тех людей, которые находятся друг от друга
на расстоянии, не превышающем 25 километров.
Свойства формирования сетей контактов
агентов, как и многие другие свойства агентной модели, задаются в объекте среда.
1. Откройте диаграмму класса Main.
Выделите на диаграмме объект environment , задающий настройки среды, в
которой обитают агенты.
2. На странице свойств Дополнительные
измените тип сети контактов (рис. 16). Выберите Согласно расстоянию из
выпадающего списка Тип сети и введите 25 в расположенном ниже поле Радиус
соединения.

Рисунок 16
Люди будут общаться не с любыми своими
знакомыми, вне зависимости от места их проживания, а только с теми, кто живет
поблизости.
3. Измените диаграмму состояний агента.
Откройте диаграмму класса Person. Измените свойства внутреннего перехода
состояния Adopter (рис. 17). Здесь в качестве значения последнего
аргумента метода send используется специальная константа
RANDOM_CONNECTED. Теперь этот переход посылает сообщение случайно выбранному
знакомому этого человека.

Рисунок 17
4. Запустите модель и посмотрите, как
изменилась динамика приобретения продукта. Убедитесь, что теперь агенты
соединены только с теми, которые находятся от них на расстоянии, не превышающем
25 единиц, а сам процесс распространения продукта происходит медленнее.
Моделирование повторных покупок
Промоделируем повторные покупки, полагая,
что потребители продукта снова становятся потенциальными потребителями, когда
продукт, который они приобрели, становится непригоден.
1. Задайте средний срок службы продукта. Откройте
структурную диаграмму класса Main и создайте параметр DiscardTime
(рис. 18). Пусть средний срок службы продукта равен одному году.

Рисунок 18
2. Измените стейтчарт агента. Добавьте
переход из состояния Adopter в состояние PotentialAdopter (рис. 19).

Рисунок 19
Задайте свойства перехода как показано на
рис. 20.

Рисунок 20
3. Удалите условие остановки модели по
времени и запустите модель. С помощью диаграммы проследите динамику изменения
числа потребителей продукта. На диаграмме видно, что насыщение рынка в модели с
повторными покупками не достигается.
Создание анимации
AnyLogic позволяет создавать интерактивную
анимацию с возможностью изменения параметров системы по ходу моделирования
процесса.
Для создания анимации добавим в модель
необходимые переменные.
1. Откройте структурную диаграмму класса Person.
Cоздайте вспомогательную переменную isAdopter; тип переменной – boolean;
начальное значение – false. С помощью данной переменной будем
определять, является ли данный человек владельцем продукта или нет.
2. Откройте структурную диаграмму класса Main
и создайте две переменные: переменную adopters с начальным значением 0 и
переменную potadopters с начальным значением 0. Эти переменные будем
использовать для подсчета численности покупателей и потенциальных покупателей.
3. Откройте диаграмму стейтчарта и внесите
изменения. Щелкните мышкой по состоянию. В окне свойств состояния PotentialAdopter
задайте Действие при входе
Main.potadopters++;
isAdopter=false;
и Действие при выходе из этого
состояния:
Main.potadopters--;
При входе в состояние увеличивается на
единицу значение переменной, подсчитывающей количество потенциальных
потребителей продукта. При выходе из состояния уменьшается значение этой
переменной. Кроме того, изменяется значение переменной isAdopter, чтобы
показать, купил ли этот человек наш продукт (если да, то значение переменной
равно true, если нет, то false).
4. Задайте свойства состояния Adopter
(рис. 21).

Рисунок 21
5. Нарисуйте анимацию, как показано на
рис. 22. Для этого добавьте Столбцовый индикатор числа потенциальных
потребителей продукта (координаты: (350, 80), ширина – 30, высота – 200;
переменная, которую будет отображать этот индикатор – potadopters;
максимальное отображаемое значение – 1000, цвет индикации – желтый; сбросьте флажок
Отображать шкалу).
Аналогичным образом добавьте Столбцовый
индикатор числа потребителей (можно использовать копирование). Расположите
его правее выше описанного индикатора, измените соответствующие свойства:
переменную для отображения, цвет индикации.

Рисунок 22
Добавьте подписи к индикаторам Potential
Adopters и Adopters, установите шрифт Times New Roman размером 8.
Добавьте элемент управления Бегунок,
с помощью которого будем изменять срок службы продукта (координаты: (330, 10),
ширина – 150, высота – 30; переменная, значение которой будет изменяться с
помощью этого элемента управления, – DiscardTime; минимальные и
максимальные значения бегунка – 0.5 и 2).
Поместите под бегунком три метки: Discard
Time – под бегунком, 0.5 – у левого края бегунка и 2 – у правого.
6. Запустите модель.
7. Проанализируйте характеристики модели
по своему варианту. Сделайте выводы.

Вариант

Эффективность рекламы

Сила убеждения

Длительность процесса

1.

0,010

0,01

6

2.

0,010

0,02

7

3.

0,010

0,03

8

4.

0,005

0,04

9

5.

0,005

0,05

10

6.

0,005

0,01

11

7.

0,015

0,02

10

8.

0,015

0,03

9

9.

0,015

0,04

8

10.

0,010

0,05

7

11.

0,010

0,01

6

12.

0,010

0,02

7

13.

0,005

0,03

8

14.

0,005

0,04

9

15.

0,005

0,05

10

16.

0,015

0,01

11

17.

0,015

0,02

10

18.

0,015

0,03

9

19.

0,020

0,04

8

Расширение модели жизненного цикла продукта
1. Моделирование рекламных кампаний
1) Откройте диаграмму класса Main.
2) Создайте новые переменные: adX, adY,
тип double; adTime, тип double, начальное значение -1; adRange,
тип double, начальное значение 50.
3) Создайте новое событие. Назовите таймер
adTimer. Событие должно быть циклическим. Задайте Таймаут – uniform(0.5,1). Задайте Действие
при срабатывании:
adX=uniform(adRange,300-adRange);
adY=uniform(adRange,300-adRange);
adTime=time();
for (AgentContinuous2D people:
environment.getAgentCollection() )
if (people.distanceTo(adX,adY) <
adRange)
         people.send("buy!",
people);
Данный код производит циклический перебор
всех агентов модели. У агентов, попавших в область проведения кампании (в круг
с радиусом adRange), генерируется событие стейтчарта, в результате чего
срабатывает переход стейтчарта, моделирующий покупку продукта.
В связи с тем, что теперь покупки
моделируются с помощью таймера, то нужно удалить переход стейтчарта, который
моделирует покупку продукта под влиянием рекламы.
4) Откройте диаграмму стейтчарта. Удалите
переход из состояния PotentialAdopter в состояние Adopter
(переход с таймаутом AdEffectiveness).
Необходимо также внести изменения в
анимацию: будем подсвечивать области проведения рекламных кампаний на анимации
сиреневыми кругами.
5) Откройте анимационную диаграмму.
Нарисуйте круг (кнопка панели инструментов Овал) со свойствами,
показанными на рис. 23-24.

Рисунок 23

Рисунок 24
Местоположение круга на диаграмме
определяется переменными adX и adY, хранящими координаты центра
области проведения текущей кампании. Круг будет виден в течение 0.2 единиц
модельного времени после момента проведения кампании.
6) Запустите модель и изучите ее
поведение.
2. Изучение распространения нескольких
продуктов
Созданная модель изучает динамику распространения
только одного продукта. Расширим модель, чтобы иметь возможность изучать
распространение сразу нескольких различных продуктов.
1) Создайте вспомогательную переменную,
которая будет определять тип рекламируемого продукта. Откройте структурную диаграмму
класса Main и создайте переменную adColor класса Color.
Будем различать продукты по цвету:
владельцев одного продукта отобразим на анимации синим цветом, а владельцев
другого – красным. Области проведения рекламных кампаний также будут
отображаться различными цветами в зависимости от рекламируемого продукта.
2) Измените анимацию – измените, свойства
сиреневого круга: выберите переменную adColor в качестве Цвета
заливки фигуры.
Пусть потенциальные покупатели продукта
будут отображаться серым цветом, владельцы – красным или синим в зависимости от
того, какой продукт они приобрели.
3) Измените код, который выполняется при
срабатывании события adTimer, моделирующего проведение рекламных
кампаний.
Откройте свойства события и измените Действие
при срабатывании. Добавьте выделенные строки:
adX=uniform(adRange,400-adRange);
adY=uniform(adRange,400-adRange);
adTime=time();
adColor = uniform() > 0.5 ?
Color.blue : Color.red;
for( Agent
people: environment.getAgentCollection()
         if
(people.distanceTo(adX,adY) < adRange)
         people.send(adColor,people);
Теперь с равной вероятностью будут
рекламироваться разные продукты.
4) Откройте диаграмму стейтчарта adoption
и измените стейтчарт следующим образом (рис. 25).

Рисунок 25
Добавьте сложное состояние, включающее в
себя оба состояния стейтчарта. Сделайте это состояние начальным: добавьте
указатель начального состояния, направленный в него.
Удалите переход из состояния PotentialAdopter
в состояние Adopter.
Измените Действие внутреннего
перехода состояния Adopter. Замените на строку send(color,RANDOM_CONNECTED);.
Добавьте переход из сложного состояния в
состояние Adopter. В окне Свойства задайте свойства перехода: переход
должен срабатывать По сигналу Color и выполнять Действие color=msg;. Для этого тип
сигнала ставим другой и пишем Color, а в поле Действие пишем Main.adColor=msg;.
Выделите щелчком мыши состояние PotentialAdopter.
Добавьте в Действия при входе строки:
Main.adColor = Color.lightGray;
person.setFillColor(Main.adColor);
Выделите щелчком мыши состояние Adopter. Добавьте в Действия
при входе строку person.setFillColor(Main.adColor); .
5) Запустите модель. Изучите
распространение сразу двух продуктов (рис. 26).

Рисунок 26
3. Моделирование передвижения людей
В модели на данный момент люди неподвижно
находятся в определенных местах. Чтобы сделать модель более реалистичной,
смоделируем передвижение людей по рассматриваемой области.
1) Откройте структурную диаграмму класса Person.
2) Создайте вспомогательные переменные oldx
и oldy типа double. Для обеих переменных задайте Начальное
значение uniform(300). Создайте
переменную tmoved типа double. Задайте Начальное значение
-10.
3) Создайте новое Событие. Назовите
его moveTimer. Событие должно быть циклическим. Задайте Таймаут uniform(5,10). Задайте Действие
при срабатывании таймера:
oldx=person.x;
oldy=person.y;
tmoved=time();
person.x=triangular(0,150,300);
person.y=triangular(0,150,300);
При срабатывании таймера текущее модельное
время, возвращаемое функцией time(), запоминается
переменной tmoved. Переменные oldx и oldy запоминают текущие
координаты агента x и y. Новые координаты
генерируются по треугольному закону распределения с минимальным значением,
равным 0, средним – 150 и максимальным – 300.
4) Создайте две алгоритмические функции,
которые помогут более плавно рисовать движение людей на анимации.
Для этого перетащите соответствующий
элемент с палитры Основные на структурную диаграмму. Назовите функцию animationX.
Задайте Тело функции:
if (time() >
tmoved+0.5)
         return
person.x;
return oldx +
(person.x-oldx)*(time()-tmoved)/0.5;
Аналогично создайте алгоритмическую
функцию animationY:
if (time() > tmoved+0.5)
         return person.y;
return oldy +
(person.y-oldy)*(time()-tmoved)/0.5;
5) Откройте свойство Person (рис. 27)
и на вкладке Агент укажите:
animationX();
animationY();

Рисунок 27
6) Запустите модель и проследите за
перемещением людей с помощью анимации.
В созданной модели число людей,
проживающих в изучаемой нами области, является постоянным. На самом деле всегда
происходит миграция людей – они переезжают из одной области в другую, и это
тоже необходимо учесть в модели. Смоделируем миграцию людей с помощью таймеров.
7) Откройте структурную диаграмму класса Main
и создайте новое Событие. Назовите его inMigration. Событие
должно быть циклическим.
Задайте Таймаут exponential(20). В среднем в нашу
область будут приезжать 20 человек в год (в качестве аргумента функции exponential()
задается частота происхождения события). Задайте Действие add_people();.
8) Для моделирования того, как люди
уезжают из области, создайте еще одно событие.
Откройте структурную диаграмму класса Person
и создайте новое Событие. Назовите его outMigration. Событие
должно срабатывать только один раз, поэтому установите флажок Срабатывает
один раз. Задайте Таймаут exponential(0.02). Задайте Действие:
get_Main().remove_people( this );
if (isAdopter)
         get_Main().adopters--;
else
         get_Main().potadopters--;
9) Добавьте на анимацию метку,
отображающую число жителей области.
Для этого в области просмотра анимации
добавьте текстовую метку, отображающую следующий текст:
people.size()+” people”.
10) Запустите модель и изучите ее
поведение. Окно просмотра анимации показано на рис. 28.

Рисунок 28
Контрольные вопросы
1.
Каким образом описываются агенты в среде AnyLogic?
2.
Как происходит взаимодействие агентов со средой в системе AnyLogic?
3.
Как происходит взаимодействие агентов с другими агентами в системе AnyLogic?
4.
В каких случаях нужно строить агентные модели?
5.
Какими средствами строится интерфейс агентов в системе AnyLogic?
Практическая работа №8
Тема:
Разработка
многоагентной модели в AnyLogic
Цель:
- изучить
методологию агентного моделирования. Приобрести практические навыки работы c
системой AnyLogic при построении агентных моделей.
Вид
работы:
фронтальный
Время
выполнения:
2 часа
Ход работы
Задание
1. Создание различных типов агентов
Под агентом в агентном моделировании
понимается элемент модели, который может иметь поведение, память (историю),
контакты и т.д. Агенты могут моделировать людей, компании, проекты, автомобили,
города, животных, корабли, товары и т.д.
Вы можете создавать внутри агента
переменные, диаграммы состояний, задавать события, потоковые диаграммы
системной динамики, а также добавлять внутрь агента объекты библиотек AnyLogic.
Вы можете создать в одной модели столько типов агентов, сколько разных типов
агентов Вам нужно промоделировать.
Создание агента обычно начинается с
определения его интерфейса для связи с внешним миром. В случае систем с большим
количеством агентов с динамическими связями (например, в моделях социальных
сетей) агенты могут взаимодействовать друг с другом путем вызова методов друг у
друга.
Начальное состояние и поведение агента
могут быть реализованы различными способами. Состояние (накопленная история)
агента может быть представлено с помощью переменных, либо состояния диаграммы
состояний. Поведение может быть либо пассивным (агенты реагируют только на
прибытие сообщений или на вызов методов и не имеют собственных событий,
запланированных на будущее) или активным, когда внутренняя динамика агента
(события, запланированные через заданные таймауты или процессы системной
динамики) является причиной действий, совершаемых агентом. В последнем случае
внутри агентов, скорее всего должны быть заданы события и/или диаграммы
состояний.
В нашей модели мы будем использовать параметры,
переменные, коллекции, функции, события, списки вариантов, а также диаграммы
действий и диаграммы состояний.
Создание
модели
Создайте
новую модель
1.   Щелкните по кнопке
Создать на
панели управления. Откроется диалоговое окно Новая модель.
2.   Задайте имя модели.
Введите Maintenance в поле Имя модели.

3.   Укажите
местоположение, где Вы хотите хранить файлы модели. Используйте кнопку Выбрать...,
чтобы выбрать нужную папку, или введите путь к папке в поле Местоположение.

4.   В качестве Единиц
модельного времени выберите часы.
5.   Щелкните Готово.

Будет создана новая модель. AnyLogic
автоматически создаст тип агента  Main
и простой эксперимент  Simulation.
В центре рабочего пространства Вы увидите
графический редактор. Он отображает диаграмму типа агента  Main.
Рамка синего цвета показывает границы окна презентации (настройки окна
презентации Вы можете найти в свойствах эксперимента Simulation,
в секции Окно).

Слева от графического редактора Вы можете
видеть панель Проекты, объединенную с панелью Палитра. Панель Проекты
обеспечивает доступ к моделям AnyLogic, открытым в данный момент в рабочем
пространстве. Дерево элементов модели позволяет легко ориентироваться в ее
структуре. Панель Палитра содержит все графические элементы, которые Вы
можете добавлять на диаграмму типа агента, просто перетаскивая их в графический
редактор. Элементы сгруппированы в отдельные палитры.
Справа Вы можете найти панель Свойства.
Панель Свойства отображает и позволяет изменять свойства выбранного в
данный момент элемента (группы элементов) модели. Когда Вы выделяете какой-либо
элемент, например, в панели Проекты или в графическом редакторе, панель Свойства
отображает свойства выделенного элемента.
Вы можете открывать и закрывать конкретные
панели с помощью меню Вид.
Теперь начнем разрабатывать нашу модель.
Создание
агентов
Вначале, создадим одного агента -
сервисный центр, затем пустую популяцию для обслуживающего транспорта, три
популяции для моделирования турбин, грузовиков и вертолетов, а также тип
агента, представляющего запросы на обслуживание. Далее мы сможем задать
процессы внутри типов агентов - на их диаграммах.
Добавьте
сервисный центр
1.
В
панели Палитра, наведите мышь на вертикальную полосу навигации и
выберите палитру Агент.

2.
Перетащите
элемент Агент  из
палитры на диаграмму типа агента  Main.
Окно мастера Создание агентов откроется автоматически.

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

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

5.
Выберите
тип анимации 3D, затем фигуру анимации Ангар из секции Здания
и щелкните Далее.

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

8.   Щелкните Готово.

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

Фигура анимации агента отображается как на
диаграмме его типа, так и на  Main.
Нам необходимо изменить масштаб фигуры. Мы зададим нужный масштаб для
каждого агента в модели.
1.
Сделайте
двойной щелчок мышью по типу агента MC
в дереве элементов модели, чтобы открыть его диаграмму. Затем передвиньте
диаграмму вниз, чтобы видеть элементы, находящиеся над осью X.
2.
Здесь
Вы найдете объект Масштаб. Выделите его, чтобы открыть его свойства.
3.
Установите
Масштаб: Задан явно. Затем задайте сам масштаб в поле ниже: 4
пикселя в метре.

Добавьте
ветряные турбины
1.
Перетащите
элемент Агент  из
палитры Агент на диаграмму типа агента  Main.

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

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

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

5.
Вы
можете щелкнуть Готово уже на шаге 6. Настойки шага 7, Конфигурация
создаваемой среды, будут автоматически заполнены, так как мы добавляем
популяцию агентов в тип агента  Main,
где мы уже задавали среду при создании агента сервисного центра.
6.
Откройте
диаграмму типа агента Turbine, которого мы сейчас создали, и так же
измените Масштаб (1 м = 4 пикс.), как мы делали ранее для агента MC.

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

2.
Снова
выберите опцию Популяция агентов. Щелкните Далее на шаге 2 (Я
хочу создать новый тип агента). На следующей странице мастера (шаг 3)
введите в поле Имя нового типа:Truck, пусть имя популяции
автоматически заполнится как trucks. Щелкните Далее.
3.
Выберите
фигуру 3D анимации Грузовик из секции Автодорожный транспорт
на следующем шаге. Нам не нужно добавлять сейчас параметры в мастере. Всего в
популяции будет 5 агентов, а настройки среды уже будут заполнены.
4.
После
того, как создадите тип агента Truck,
выделите Truck
в дереве элементов модели и перейдите в панель Свойства. Сначала
откройте секцию свойств Движение. Мы считаем, что грузовики в среднем
движутся со скоростью 55 миль в час.

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

6.
Теперь
тип агента Truck
полностью задан. Нам необходимо добавить еще одну популяцию для вертолетов.
Вернитесь на
Main и снова перетащите элемент Агент  из
палитры Агент и выберите Популяция агентов на первом шаге.
7.
Введите
имя нового типа Helicopter, оставьте имя популяции helicopters.
Вы можете найти фигуру 3D анимации Вертолет в секции Военного
назначения. Мы хотим использовать 2 вертолета для обслуживания
турбин. Эта популяция живет в той же среде, что и все остальные.
8.
Helicopter также Расширяет
тип агента: Transport.
Мы предполагаем, что вертолеты движутся со скоростью, равной 160 миль в час.

9.
Мы
не будем менять масштаб агентов Truck и Helicopter. Вы можете
проверить объект Масштаб этих агентов: его свойства тоже наследуются от
типа агента Transport.
Добавьте
запросы на обслуживание
1.
Перетащите
элемент Агент  из
палитры Агент на диаграмму типа агента  Main.
2.
Выберите
опцию Просто создать тип агента. Нам нужен тип агента, чтобы задать
логику модели специальными параметрами, которые мы создадим на его
диаграмме.

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

5.
Щелкните
Готово. Список вариантов не имеет отдельного значка, который можно
выбрать щелчком в графическом редакторе. Вы можете найти секцию Список
вариантов в дереве модели:

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

Все агенты появятся на диаграмме  Main.
Вы можете заметить, что популяции отмечены [..]. Переместите агентов за
рамку окна презентации, а центры всех фигур анимации поместите в начало
координат.

Вы можете найти настройки среды в секции
Пространство и сеть свойств типа агента Main:

Последнее, что нам необходимо сделать на
этом шаге разработки модели: задать масштаб типа агента Main:

Запустите
модель
1.
Постройте
свой проект, щелкнув кнопку Построить Модель  на
панели управления. Если в модели есть какие-либо ошибки, то построение будет
неудачным, и Вы увидите панель Ошибки, в которой будут перечислены все
ошибки в модели. Вы можете открыть место ошибки двойным щелчком по ее описанию
в списке, чтобы исправить ее. После того, как модель будет успешно построена,
Вы можете запустить ее. Запуская эксперимент, Вы автоматически обновляете
модель.
2.
Выберите
эксперимент, который хотите запустить, открыв выпадающий список рядом с кнопкой
запуска модели Запуск  на
панели управления. Ваш эксперимент называется  Maintenance/Simulation.
Потом Вы сможете запускать этот эксперимент, просто щелкая кнопку Запуск
,
поскольку она будет запускать последний запущенный эксперимент.
3.
Запустив
модель, Вы увидите окно презентации. На ней отображается презентация, созданная
для этого эксперимента. AnyLogic автоматически создает заголовок и кнопку
запуска модели.
4.
Щелкните
кнопку Запустить.

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

Далее давайте зададим местоположение
транспорта, грузовиков и вертолетов, в сервисном центре.
Задание
2. Задание транспортной базы
Разрабатывая дальше модель, мы будем
задавать логику и процессы модели на диаграммах каждого агента в отдельности.
Начнем с конфигурации типа агента  Main,
которая задает начальную позицию грузовиков и вертолетов в пространстве.
Сложное имитационное моделирование не
может существовать без возможности задания алгоритмов, обычно выполняющих
определенную обработку данных или вычисления. AnyLogic поддерживает диаграммы
действий - структурированные блок-схемы, позволяющие задавать алгоритмы
графически в стиле структурированного программирования. Мы используем широко
известное расширение подхода, предложенного в свое время Дейкстра. Суть подхода
состоит в том, что алгоритмы разбиваются в подразделы с одной точкой входа.
Утверждается, что трех способов объединения программ — упорядочения, повторения
и выбора — достаточно для задания алгоритма любой сложности. Такой стиль сводит
понимание целого алгоритма к пониманию составляющих его частностей.
Диаграммы действий облегчают задание
алгоритмов, делая необязательным знание синтаксиса Java операторов.
По сути диаграммы действий используются
для визуального задания функций, и Вы можете использовать для этого обычные
функции. Но использование диаграмм действий дает еще одно преимущество: с их
помощью Вы можете визуализировать алгоритмы, делая их более понятными для
других пользователей модели.
Поместите
транспорт в сервисный центр
1.
Перейдите
на диаграмму  Main
и откройте палитру Диаграмма действий в панели Палитра.
2.
Перетащите
элемент Диаграмма действийв
графический редактор Main.

3.
Назовите
диаграмму setTransportBase. Эта диаграмма действий ничего не возвращает,
то есть, ее тип - Действие. Далее, добавьте в диаграмму элемент Цикл
For .
Работая с элементами диаграммы действий, проверяйте, что вставляете элементы в
нужное место:

4.
Этот
цикл for является Итератором по коллекции, где Коллекция -
helicopters. Определите Элемент как Helicopter h.

5.
Далее,
вставьте элемент Код в
этот цикл for.

6.
Мы
хотим, чтобы вертолеты изначально находились в сервисном центре, то есть, имели
те же координаты, что и он:

7.
Добавьте
еще один блок, состоящий из Цикла For  с
элементом Код  внутри
в эту диаграмму действий и сконфигурируйте его размещать грузовики, так же как
и вертолеты, в сервисном центре.
8.
Вы
можете изменить размер блоков диаграммы действий, чтобы содержащийся в них код
был полностью виден:

Итак,
мы создали диаграмму действий под названием setTransportBase, которая
представляет функцию, размещающую транспортные средства в сервисном центре. Там
мы хотим разместить транспорт при старте модели.
Выделите
Main
в дереве модели (или сделайте щелчок мышью в пустое место в графическом
редакторе этого типа агента) и перейдите в панель Свойства. Разверните
секцию свойств Действия агента и задайте запуск нашей функции При
запуске модели:

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

Задание
3. Настройка логических процессов транспорта
На этом этапе мы зададим начальную
конфигурацию типа агента Transport.
Если у агента можно выделить несколько
состояний, выполняющих различные действия при происхождении каких-то событий,
или если у агента есть несколько качественно различных поведений,
последовательно сменяющих друг друга при происхождении определенных событий, то
поведение такого объекта может быть описано в терминах диаграммы состояний.
Диаграмма состояний позволяет графически задать пространство состояний
алгоритма поведения объекта, а также события, которые являются причинами
срабатывания переходов из одних состояний в другие, и действия, происходящие
при смене состояний.
С помощью диаграмм состояний можно
графически задать дискретные поведения объектов любой сложности, куда более
разнообразные, чем элементарные состояния свободен/занят (idle/busy),
открыт/закрыт (open/closed), исправен/неисправен (up/down) и т.п., предлагаемые
большинством блочных инструментов моделирования.
Диаграмма состояний представляет собой
состояния, соединенные переходами. Переходы могут сработать в результате
заданного в качестве условия перехода события - это может быть истечение
заданного таймаута, получение диаграммой состояний сообщения, выполнение
заданного логического условия и т.д. Срабатывание перехода приводит к переходу
управления диаграммы состояний в то состояние, в которое ведет этот переход.
Состояния могут быть иерархическими, т.e. содержать другие состояния и
переходы.
Добавьте
необходимые переменные
1.
Перейдите
в панель Проекты и откройте двойным щелчком тип агента Transport.
Добавьте два элемента Переменная из
палитры Агент.
2.
Как
Вы помните, мы хотим использовать два вида транспорта: грузовики и вертолеты,
для обслуживания турбин. Мы используем переменную type, чтобы различать
эти два вида транспорта. Переменная type должна быть типа TransportType,
чтобы мы могли использовать варианты AUTO и AVIA.
3.
Переменная
request является переменной типа ServiceRequest:

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

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

4.
Внутренние
настройки и условия некоторых состояний и переходов ссылаются на элементы
модели, которые мы еще не создали. С другой стороны, нам необходима эта
диаграмма, поскольку на нее ссылаются некоторые из тех элементов, которые мы
зададим позднее. Поэтому сейчас мы продолжим разрабатывать другие типы агентов
и закончим логику типа Transport
в самом конце разработки модели.
Задание
4. Настройка поведения сервисного центра
Мы создадим диаграмму действий, с помощью
которой сервисный центр определяет, какой тип транспорта необходимо отправить
на обслуживание, грузовик или вертолет, и проверяет, есть ли свободное
транспортное средство в сервисном центре.
Задайте
запросы на транспорт для сервисного центра
Агент может содержать переменные.
Переменные обычно используются для моделирования изменяющихся характеристик
объекта или для хранения результатов работы модели. AnyLogic поддерживает два
типа переменных – простые переменные и коллекции.
Коллекция представляет
собой группу объектов, известных как ее элементы. Некоторые коллекции позволяют
хранение нескольких одинаковых элементов, некоторые - нет. Некоторые коллекции
упорядочены, некоторые - нет. Коллекция используется для задания объекта
данных, объединяющего в себе сразу несколько однотипных элементов. С помощью
коллекций Вы можете хранить, извлекать и управлять агрегированными данными.
Обычно коллекции представляют элементы данных, которые образуют группу,
например, очередь (в этом случае элементы представляют собой людей, ожидающих в
очереди) или автопарк (элементы задают автомобили), или телефонный справочник
(коллекция хранит соответствие имен и телефонных номеров).
1.
Откройте
диаграмму MC.
Добавьте два элемента Коллекция из
палитры Агент.
2.
Коллекции
называются aviaRequests и autoRequests и обе имеют Класс
коллекции LinkedList и Тип элементов ServiceRequest.

Задайте
логику управления транспортным парком
1.
Откройте
диаграмму MC.
Мы зададим нужные нам процессы с помощью элементов палитры Диаграммы
действий.
2.
Вначале
перетащите элемент Диаграмма действий  из
палитры в графический редактор.

3.
Назовите
диаграмму findTransport. Эта диаграмма действий Возвращает значение,
и Типом возвращаемого значения является Transport. Аргументы
диаграммы действий задаются ниже в таблице Аргументы: аргумент request Типа
ServiceRequest:

4.
Далее,
вставьте элемент Цикл For в
нашу диаграмму действий findTransport. Работая с элементами диаграммы
действий, убедитесь, что вставляете элементы в правильное место:

5.
Тип этого цикла
for: Итератор по коллекции. Укажите поля Элемент и Коллекция
как показано на рисунке ниже: необходимость в грузовике или вертолете
определяется типом запроса на обслуживание. Вы можете изменить размер элемента
для лучшего отображения содержимого.

6.
Нам
необходимо добавить Решение (If ... Else) ,
которое будет проверять, имеется ли требуемый транспорт в наличии. Условие
заявляет, что транспортное средство должно быть в состоянии AtCenter (в
сервисном центре) той самой диаграммы состояний, которую мы создали на типе
агента  Transport.
Обратите внимание, что в графическом редакторе отображается содержимое
параметра Метка:

7.
Вставьте
элемент Вернуть значение в
ветку true, выходящую из решения. Пусть этот элемент возвращает t. В качестве
последнего шага, выделите элемент диаграммы Вернуть значение, который возвращает
значение и для всей диаграммы, и для ветки false и укажите Возвращаемое
значение: null.

8.
Эта
диаграмма действий будет проверять, есть ли в наличии в сервисном центре
запрашиваемый вид транспорта: грузовик или вертолет.
В AnyLogic иногда Вам необходимо вводить
код в параметрах различных элементов модели. Важно понимать, где именно Вы «находитесь»,
вписывая код (какому типу агента принадлежит этот элемент), и как получить
доступ к другим элементам из этого поля.
Элементы модели, принадлежащие тому же
типу агента, доступны просто по именам.
Чтобы получить доступ к полю вложенного
объекта, Вы должны поставить точку «.» после имени объекта и затем написать имя
этого поля. Например, мы ссылались на функцию getX() сервисного центра  center
при создании диаграммы действий на  Main:
center.getX(). Если объект является реплицированным, то его имя является именем
коллекции объектов, и Вам нужно указать, какой именно объект из этой коллекции
Вам нужен.
Чтобы получить доступ к «равному по
иерархии» агенту (который вложен в тот же контейнер, что и текущий агент),
нужно вначале перейти на уровень выше к агенту верхнего уровня, а затем
спуститься по иерархии модели вниз, к нужному вложенному агенту.
Чтобы получить доступ к контейнеру
текущего объекта (того агента, куда вложен текущий), укажите его имя. Обратите
внимание на специальный элемент,  Ссылка
на агента верхнего уровня, который присутствует на диаграмме каждого типа,
чьи агенты живут в среде этого агента верхнего уровня (в нашей модели это тип
агента Main).
Ссылка называется по имени этого агента верхнего уровня и позволяет обращаться
к нему по этому имени, чтобы получить доступ к элементам, находящимся на его
диаграмме. Например, чтобы получить доступ к элементу trucks[..],
который находится на диаграмме Main,
из агента MC,
мы пишем main.trucks, находясь на диаграмме MC.

Задание
5. Настройка поведения турбин
На этом этапе мы зададим поведение турбин
с помощью диаграммы состояний: когда и как турбины выходят из строя или требуют
планового техобслуживания. Также мы настроим анимацию турбин: пусть лопасти
турбины перестают крутиться при экстренной поломке, к тому же, мы хотели бы
видеть цветовую индикацию состояния турбины.
Задайте временные
интервалы работы турбин
1.
Двойным
щелчком откройте тип агента Turbine
из дерева элементов модели. Начните с добавления двух элементов Параметр
из
палитры Агент в графический редактор.
2.
Параметр
с именем MTTF (среднее время до аварии) имеет тип Время и его Значение
по умолчанию равняется 250 дням. Дни Вы можете выбрать в
свойстве Единица измерения. Второй параметр, serviceTimeout,
также имеет тип Время; его Значение по умолчанию равняется 2
неделям.

Добавьте
переменные состояний турбин
1.
Теперь
нам необходимо добавить два элемента Переменная ,
которые мы будем далее использовать при задании состояний в диаграмме.
Переменные operating (работает) и waitingForService (ожидает
техобслуживания) обе имеют тип boolean. Переменная operating, к
тому же, имеет Начальное значение: true, потому что мы хотим, чтобы
изначально при старте модели все турбины исправно работали.

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

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

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

2.
Добавьте
три состояния и
несколько переходов  между
состояниями, как показано на рисунке:

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

Состояние

Действие
  при входе

Operating

Failure

scheduledService

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

5.
Иногда
работающая турбина получает сообщение  «scheduled»
(запланировано), и это означает, что ей требуется плановое обслуживание;
запускается соответствующее состояние scheduledService. Когда турбина
получает сообщение  «repaired»,
обслуживание завершено, и она снова может вернуться в рабочее состояние Operating.

6.
Последний
переход, который нам необходимо задать, идет из состояния scheduledService
в состояние Failure. Этот переход происходит С заданной
интенсивностью ,
1 раз в неделю.

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

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

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

Добавьте индикацию
состояния турбины
1.
Откройте
палитру Презентация и сделайте двойной щелчок по элементу Овал ,
чтобы перейти в режим рисования для этого элемента.
2.
Нарисуйте
круг вокруг фигуры турбины радиусом около 10.
3.
Щелкните
по фигуре круга правой кнопкой мыши и выберите Порядок > На задний план в
контекстном меню.
4.
Перейдите
в секцию Внешний вид свойств круга. Введите выражение, которое будет
вычисляться во время прогона модели в поле свойства Цвет заливки, чтобы
цвет менялся в зависимости от состояния турбины.
5.
Чтобы
иметь возможность задать динамическое значение в поле свойства, щелкните его
значок

6.
Если
турбина ожидает запланированного обслуживания, круг станет отображать желтый
цвет, иначе - зеленый, когда турбина в рабочем состоянии; в случае, когда
турбина выходит из строя, мы получим красный цвет фигуры.
Дополнительно,
Вы можете изменить размер элементов диаграммы состояний и изменить цвет
состояний по умолчанию на более подходящий.

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

Задание
6. Завершение настройки логики транспорта
На этом шаге мы добавим необходимые
настройки в диаграмму состояний типа агента  Transport.
Мы зададим движение транспорта между сервисным центром и турбинами.
Настройте
диаграмму состояний
1.
Откройте
диаграмму агента Transport
двойным щелчком из дерева модели. На ней Вы найдете диаграмму состояний,
которую мы создали ранее. Теперь давайте зададим логику ее работы.
2.
Выделите
состояние AtCenter. Нам необходимо задать его Действие при входе:

3.
Остальные
три состояния (MovingToMC, Servicing, MovingToTurbine) не
имеют дополнительных настроек. Мы настроим логику движения транспорта с помощью
переходов различных типов.
4.
Переход
из состояния AtCenter в состояние MovingToTurbine происходит При
получении сообщения  типа
ServiceRequest. Так как переход осуществляется Безусловно, Вам
необходимо только указать Действие, которое следует выполнить
транспорту: двигаться в точку координат турбины.

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

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

7.
На
рисунке выше Вы видите, что последний переход, из MovingToMC в AtCenter,
происходит По прибытию агента .
Когда он происходит, транспортное средство отправляется обратно в сервисный
центр и остается там, пока снова не понадобится для обслуживания очередной
турбины.
Теперь, если Вы откроете тип агента Truck
или Helicopter,
Вы увидите там проекцию элементов типа агента
Transport, который они расширяют. Эти элементы отображаются на их диаграммах
для удобства, но чтобы изменять их свойства, вернитесь обратно на диаграмму
самого агента:

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

Задание
7. Запуск модели и исследование ее элементов
Это
последний шаг нашего учебного пособия по разработке агентной модели
обслуживания турбин.
Добавьте
элементы презентации
1.
Вы можете добавить фон для анимации агентов - турбин и
транспортных средств - на диаграмме типа агента  Main
с помощью элемента Прямоугольник. Выделите элемент Прямоугольник  в
палитре Презентация, чтобы перейти в режим рисования. Затем щелкните в
графический редактор и тащите прямоугольник, не отпуская кнопки мыши, пока не
получите нужную форму прямоугольника.
2.
Перейдите в секцию свойств фигуры Внешний вид и выберите
текстуру Grass в качестве Цвета заливки и опцию Нет цвета
для Цвета линии. Обратите внимание на свойства Z и Z-Высота в
секции Местоположение и размер. Например, если Z-Высота равняется
10, Вы можете установить Z на -10, иначе другие фигуры
анимации «утонут» в этом фоне, ведь они по умолчанию перемещаются на нулевом
уровне.
3.
Так как прямоугольник - это последняя добавленная нами фигура, он
отображается поверх всех остальных. Щелкните прямоугольник правой кнопкой мыши
и выберите Порядок > На задний план.

4.
Вы также можете щелкнуть фигуру анимации агента  MC
hangar и выбрать Порядок > На передний план, чтобы «спрятать»
транспорт за ней.
5.
Чтобы задействовать 3D анимацию, откройте палитру Презентация
и перетащите элемент 3D
Окно  в
графический редактор. Затем Вы можете изменить его Свойства: размер или
цвет.
Запустите модель
1.
Щелкните
кнопку панели управления Запуск и
запустите модель.

2.
Затем
щелкните кнопку Показать
область... и выберите [window3d].

3.
Вы
можете перемещаться по 3D сцене с помощью мыши и следующих клавиш:

Чтобы

Выполните
  следующие действия

Переместить
  сцену

1.
  Нажмите левую кнопку мыши в области 3D окна и держите ее нажатой.
  2. Передвиньте мышь в направлении перемещения.

Повернуть
  сцену

1.
  Нажмите клавишу Alt и держите ее нажатой.
  2. Нажмите левую кнопку мыши в области 3D окна и держите ее нажатой.
  3. Передвиньте мышь в направлении вращения.

Приблизить/отдалить
  сцену

1.
  Покрутите колесо мыши от/на себя в области 3D окна.

4.
Вы
можете управлять запуском модели с помощью кнопок панели управления: Приостановить
 и
Прекратить выполнение  запуска,
Ускорить  или
Замедлить модель.
Кроме того, Вы можете следить за разными типами агентов с помощью кнопок
навигации по структуре модели.

5.
Щелкните
стрелку вниз в навигации по модели, чтобы открыть список агентов. Рядом с
именами популяций агентов Вы увидите их количество в квадратных скобках [..].
Выберите, например, turbines [0..9]. Нумерация начинается с 0 - у нас
десять турбин в модели.

6.
Вы
увидите тип агента  Turbine
и процессы, происходящие на нем. Вы можете проверять состояние разных турбин
соответственно их порядковому номеру. Тогда турбина появится в пространстве,
будет выделено ее текущее состояние, а все элементы типа агента будут
отображать релевантные для нее показатели.

7.
Таким
образом, Вы можете исследовать поведение любого типа агента или конкретного
агента в модели.
Установите отображение
3D анимации по умолчанию
1.
Создайте
область просмотра в 3D окне. Для этого перетащите элемент Область просмотра
из
палитры Презентация и поместите его в верхний левый угол 3D окна.
2.
Назовите
область просмотра view3D. Нам не нужно изменять еще какие-либо ее
свойства.
3.
Для
того, чтобы 3D анимация автоматически загружалась при запуске модели, измените
свойство типа агента  Main
При запуске. Добавьте функцию перехода в нужную нам область просмотра:

4.
Если
Вы теперь запустите модель, то сразу же увидите 3D анимацию.
5.
Также,
Вы можете добавить элемент Камера к 3D окну, чтобы зафиксировать определенное
положение вида.
6.
Перетащите
объект Камера  из
палитры Презентация, затем выберите эту камеру в свойстве 3D окна Камера
и запустите модель. Перемещайтесь и вращайте сцену, пока не получите желаемый
угол обзора. Тогда щелкните полотно анимации правой кнопкой мыши и выберите Копировать
положение камеры в контекстном меню.

7.
Вернитесь
обратно к разработке модели и щелкните кнопку Вставить координаты из Буфера
обмена в свойствах камеры.

8.
Снова
запустите модель. Вы увидите, что теперь автоматически загружается выбранный
Вами вид 3D.
Практическая работа №9
Тема: Модель перекрестка (Дорожное движение)
Цель:
- разработать
имитационную модель дорожного движения.
Вид
работы:
фронтальный
Время
выполнения:
2 часа
Ход работы
Задание
1. Создание дороги
Вначале мы создадим простейшую модель, которая будет
моделировать движение автомобилей по Tapiolavagen в северном направлении.
 Создайте
новую модель
1.
Щелкните мышью по кнопке панели инструментов Создать . Появится
диалоговое окно Новая модель.
2.
Задайте имя новой модели. В поле Имя модели введите Road Traffic Tutorial.

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

4.
Выберите секунды в качестве Единиц модельного времени.

5.
Щелкните мышью по кнопке Готово, чтобы завершить процесс.
Вы создали новую
модель. В ней уже имеется один тип агента Main и
эксперимент Simulation.
Агенты - это главные строительные блоки модели AnyLogic. В нашем случае агент Main послужит местом, в котором мы зададим всю
логику модели: здесь мы создадим дорожную сеть и зададим движение транспорта на
диаграмме процесса.
В центре рабочей области
находится графический редактор диаграммы типа агента Main.

В левой части
рабочей области находятся панель Проекты и панель Палитра.
Панель Проекты обеспечивает легкую навигацию по элементам
моделей, открытых в текущий момент времени. Поскольку модель организована
иерархически, то она отображается в виде дерева. Панель Палитра содержит разделенные по палитрам элементы,
которые могут быть добавлены на диаграмму типа агента или эксперимента.
В правой рабочей
области будет отображаться панель Свойства.
Панель Свойства используется для просмотра и изменения свойств
выбранного в данный момент элемента (или элементов) модели. Когда вы выделяете
какой-либо элемент, например, в панели Проекты или графическом редакторе, панель Свойства показывает свойства выбранного
элемента.
Теперь мы можем
настроить нашу модель.
Стандартный
сценарий создания модели:
1. Добавьте
спутниковый снимок местности, в которой находится интересующий нас перекресток.
2. Нарисуйте
дороги поверх спутникового снимка.
3. Задайте
движение автомобилей с помощью блоков Библиотеки дорожного движения.
Давайте создадим
модель по вышеописанному сценарию.
Добавление
спутникового снимка
Мы будем
использовать следующий спутниковый снимок:

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

2.     Выберите палитру Презентация,
чтобы открыть ее:

3.     Перетащите элемент
Изображение  из палитры Презентация на
графическую диаграмму Main.

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

Создание
дороги
Сейчас мы нарисуем
дорогу (Tapiolavagen), разместив ее строго поверх той, что на снимке. Дорожные
сети в AnyLogic задаются следующим образом: вы рисуете дороги, перекрестки и
при необходимости добавляете другие элементы разметки пространства (автобусную
остановку, стоп-линию и парковку).
Создайте
дорогу
1.
Прежде чем нарисовать дорогу, следует отключить сетку в
графическом редакторе. Щелкните по кнопке панели инструментов Включить/Отключить
сетку .
Она должна принять вид не нажатой кнопки: .
2.
В панели Палитра выберите палитру  Библиотека дорожного
движения:

3.
Сделайте двойной щелчок по элементу Дорога  в секции Разметка
пространства палитры Библиотека дорожного движения. Иконка элемента
изменится на . Это означает, что активирован режим
рисования, и теперь вы можете рисовать дорогу в графическом редакторе.

4.
Щелкните мышью в графическом редакторе, чтобы поставить первую
точку дороги.

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

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

7.
Чтобы завершить рисование, добавьте последнюю точку дороги двойным
щелчком мыши.

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

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

Давайте сделаем
дорогу полупрозрачной, чтобы можно было убедиться, что она точно накладывается
на дорогу на карте. Настройки прозрачности (как и настройки направления
движения, ширины полосы) находятся не в свойствах дороги, а в свойствах
дорожной сети, которой принадлежит эта дорога.
10.
Выделите дорожную сеть, сделав два последовательных щелчка по
дороге (первый щелчок выделит саму дорогу, а уже второй - дорожную сеть). После
этого откройте секцию свойств дорожной сети Внешний вид. Щелкните по
элементу управления Цвет дороги, выберите Другие цвета... из
списка и задайте для свойства Прозрачность значение 150, к примеру.
11.
Теперь можно увидеть, как созданная дорога накладывается на дорогу
на карте. Если она шире или уже, нужно настроить масштаб модели. При
необходимости можете перетащить холст немного ниже, чтобы над осью Х появился
элемент Масштаб, в свойствах которого можно будет указать масштаб.

12.
В
этом примере линейка масштаба соответствует 35 метрам.

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

Создание
диаграммы процесса
Теперь мы зададим
процесс движения транспорта, создав диаграмму из блоков Библиотеки дорожного
движения.
Каждый блок задает
определенную операцию, которая будет совершаться над проходящими по диаграмме
процесса автомобилями.
Диаграмма процесса
в AnyLogic создается путем добавления объектов библиотеки из палитры на
графическую диаграмму, соединения их портов и изменения значений свойств блоков
в соответствии с требованиями вашей модели.
Создайте
диаграмму процесса
1.
Откройте палитру  Библиотека дорожного движения и
добавьте блоки из этой палитры на диаграмму, соединив их, как показано на
рисунке ниже. Чтобы добавить объект на диаграмму, перетащите требуемый элемент
из палитры в графический редактор:

2.
Когда блоки располагаются рядом друг с другом, между ними
появляются соединительные линии. Будьте внимательны, эти линии должны соединять
только порты, находящиеся с правой или левой стороны блоков.
Скажем пару слов
об этих блоках.
 CarSource создает
автомобили. Обычно используется как начальная точка автомобильной диаграммы
процесса.
 CarMoveTo моделирует
движение автомобиля к цели движения.
 CarDispose удаляет поступающие
на вход этого блока автомобили из модели. Обычно используется как конечная
точка автомобильной диаграммы процесса.
За детальным
описанием объектов Библиотеки дорожного движения, пожалуйста,
обращайтесь к Справочному
руководству по Библиотеке дорожного движения.
 Настройте
блоки диаграммы
1.
Чтобы изменить свойства элемента модели, выделите элемент в
графическом редакторе, щелкнув по нему мышью. Откроется панель Свойства
с настройками элемента.
2.
Выделите блок сarSource. В панели Свойства укажите,
как часто должны прибывать автомобили. В раскрывающемся списке Дорога
выберите road, это дорога, которую мы только что создали. Таким образом
мы указываем блоку сarSource дорогу, на которую стоит поместить
создаваемые автомобили.

3.
Внесите
изменения в свойства блока carMoveTo. Оставьте заданную по умолчанию
опцию Цель движения: дорога и выберите имя нашей дороги road в
раскрывающемся списке Дорога. Этот блок будет моделировать движение
автомобилей по указанной дороге до конца полосы основного движения (задается
параметром Доехать до конца полосы).

4.
В блоке carDispose оставьте настройки по умолчанию.
Запуск
модели
Мы готовы запустить созданную
модель. Сначала постройте вашу модель с помощью кнопки панели инструментов Построить
модель .
Построение не будет завершено, если в модели присутствуют ошибки, информация о
которых будет выведена в панель Ошибки.
Чтобы перейти к месту ошибки и исправить ее, совершите двойной щелчок мышью по
ошибке в этом списке.
После того, как все ошибки устранены, и
модель успешно построена, вы можете запустить
её. Запуская модель, вы автоматически обновляете её.
Запустите
модель
1.
Щелкните
мышью по кнопке панели инструментов Запустить
 и выберите из открывшегося списка
эксперимент, который вы хотите запустить. Эксперимент этой модели будет
называться Road Traffic Tutorial/Simulation.

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

Щелкните по кнопке
Запустить (см. рисунок выше), чтобы запустить модель и перейти к
презентации запущенного эксперимента, на которой вы увидите движение
автомобилей в 2D анимации поверх добавленного снимка.
При необходимости,
измените скорость выполнения модели, используя кнопки панели инструментов Замедлить
и Ускорить.
Для каждой модели,
созданной с помощью объектов Библиотеки дорожного движения,
автоматически создается блок-схема с наглядной визуализацией процесса. Она
отображает количество автомобилей, которые прошли через блок или находятся в
блоке в данный момент.

Обратите внимание,
для каждого шага моделирования имеются контрольные модели. Вы можете
использовать их, чтобы сравнить свою модель с аналогичной моделью, созданной
нами. Ниже приведена ссылка на контрольную модель для этого шага.
Задание
2. Создание 3D анимации
В этом примере мы создадим 3D
анимацию для нашей модели.
Сначала необходимо добавить на
графическую диаграмму 3D
окно. 3D окно используется для задания на диаграмме
агента области, в которой во время запуска модели будет отображаться трехмерная
анимация этой модели.
Добавьте 3D
окно
1.
Перетащите элемент 3D Окно из секции 3D
палитры Презентация в графический редактор.
2.
В графическом редакторе появится закрашенная серым цветом область.
Поместите эту область туда, где вы хотите видеть 3D анимацию во время запуска
модели. В нашей модели спутниковый снимок занимает большую часть пространства
окна модели (прямоугольная рамка синего цвета в графическом редакторе
обозначает границы окна модели), поэтому мы расположим 3D окно под снимком. Перейти
к 3D анимации во время выполнения модели можно с помощью встроенных
инструментов навигации AnyLogic.

Теперь вы можете запустить модель и
наблюдать простую 3D анимацию.
Запустите
модель и опробуйте навигацию по сцене трехмерной анимации
1.
Запустите
модель.
2.
Щелкните
кнопку панели инструментов Показать область... и выберите [window3D].

3.
Вы
увидите 3D анимацию. По умолчанию автомобили в 3D анимации отображаются
разноцветными параллелепипедами.

4.
Попробуйте
перемещаться по трехмерной сцене с помощью описанных ниже команд навигации:

Чтобы

Выполните
  следующие действия

Переместить
  сцену

1.
  Нажмите левую кнопку мыши в области 3D окна и держите ее нажатой.
2.
  Передвиньте мышь в направлении перемещения.

Повернуть
  сцену

1.
  Нажмите клавишу Alt и держите ее нажатой.
2.
  Нажмите левую кнопку мыши в области 3D окна и держите ее нажатой.
3.
  Передвиньте мышь в направлении вращения.

Приблизить/отдалить
  сцену

1.
  Покрутите колесо мыши от/на себя в области 3D окна.

Теперь мы зададим автомобилям определенную
фигуру анимации вместо используемого по умолчанию параллелепипеда. Это
потребует создания нового типа автомобиля.
Создайте новый
тип агента
1.
Откройте
палитру Библиотека
дорожного движения.
2.
Перетащите
элемент Тип автомобиля в графический редактор.

3.
Откроется
диалоговое окно Мастера создания агентов на шаге Создание нового типа агента.
Оставьте заданное по умолчанию имя нового типа Car в поле Имя нового
типа. Нажмите Далее.

4.
Вы
увидите следующую страницу Мастера создания типа агента, на которой
предлагается выбрать фигуру анимации для этого агента. Поскольку мы хотим
выбрать 3D фигуру, оставьте опцию 3D выбранной. В списке ниже, выберите
фигуру анимации Автомобиль.

5.
Щелкните
по кнопке Готово. Автоматически откроется диаграмма нового агента Car. В
начале координат этой диаграммы вы увидите выбранную нами 3D фигуру автомобиля.
Переключитесь обратно на диаграмму Main.

Настройте
диаграмму процесса, чтобы использовать новый тип автомобиля
1.
На
диаграмме Main, выделите блок сarSource в графическом редакторе.
2.
Раскройте
секцию Автомобиль в панели Свойства и выберите Car из
раскрывающегося списка Новый автомобиль.

3.
Запустите
модель и переключитесь в режим 3D, чтобы увидеть 3D анимацию автомобилей,
движущихся по дороге.

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

2.
Откройте секцию свойств дорожной сети Внешний вид. Щелкните
по элементу управления Цвет дороги и выберите Текстуры... из
раскрывшегося списка.

3.
В открывшемся диалоговом окне Текстуры выберите текстуру
асфальта (см. рисунок ниже).

В графическом редакторе
нарисованная дорога станет отличаться по цвету от дороги на спутниковом снимке:

Теперь надо решить проблему с
чересполосицей в трехмерной анимации. Причина проблемы в том, что и дорожная
сеть, и спутниковый снимок отображаются на одном Z-уровне (0), и поэтому в
какие-то моменты на верхний уровень вылезает рисунок, а в какие-то - дорога.
 Измените
Z-уровень рисунка
1.
В
графическом редакторе, щелкните по спутниковому снимку моделируемой местности.
2.
Откройте секцию свойств изображения Местоположение и размер
и
введите - 1 в поле Z. Тем самым, мы поместим рисунок в трехмерной
анимации чуть ниже, чем нашу дорожную сеть.
3.
И
напоследок, выберите в свойствах изображения флажок Блокировать. Теперь
изображение будет считаться заблокированным и не будет реагировать на щелчки
мыши. Таким образом, вы не сможете выбрать это изображение в графическом
редакторе до тех пор, пока не снимете с него блокировку. С помощью блокировки
мы можем избежать случайного редактирования изображения во время рисования
элементов поверх него.

Поздравляем с окончанием второй фазы. В
следующей фазе мы нарисуем еще одну дорогу и промоделируем движение автомобилей
по образовавшемуся перекрестку.
Задание
3. Моделирование перекрестка
Сейчас машины
движутся в модели по дороге Tapiolavagen, причем только в одном направлении, с
юга на север.
В этой фазе мы
создадим перекресток, нарисовав улицу Menninkaisentie, примыкающую к улице
Tapiolavagen с востока. После этого мы добавим новые блоки в диаграмму
процесса, которые будут моделировать движение машин по обоим дорогам во всех
направлениях.
 Нарисуйте
перекресток
Перекрестки в
AnyLogic создаются автоматически при соединении дорог. Нарисуйте улицу
Menninkaisentie, примыкающую к Tapiolavagen с востока.
1.
Как и раньше, начните рисование дороги с двойного щелчка по
элементу  Дорога
в палитре Библиотека дорожного движения.
2.
Добавьте начальную точку дороги, щелкнув по разделительной полосе Menninkaisentie
в правой части рисунка.

3.
Добавьте конечную точку дороги. Чтобы правильно соединить дороги в
Т-образный перекресток, сделайте двойной щелчок мыши, когда увидите зеленую
точку на разделительной полосе улицы Tapiolavagen, как показано на рисунке
ниже.

4.
Будет создан трехсторонний перекресток.

5.
У нарисованной нами дороги по две полосы в каждом направлении, у
реальной же улицы Menninkaisentie одна полоса основного движения и одна полоса
встречного движения, поэтому нам нужно изменить настройки этой дороги. Откройте
свойства только что нарисованной дороги, щелкнув по ней мышью, и сделайте Кол-во
полос основного движения и Кол-во полос основного движения этой
дороги равным 1.
6.
Чтобы в дальнейшем нам было легче ссылаться на эту дорогу в
параметрах блоков диаграммы процесса, измените Имя этой дороги на roadEast.

7.
После внесенных изменений дорожная сеть должна будет выглядеть
следующим образом:

Если вы сейчас
запустите модель, то увидите, что теперь машины едут не до конца улицы
Tapiolavagen, а лишь доезжают до перекрестка и исчезают. Это вызвано тем, что
при присоединении новой дороги к уже существующей дороге создается новый
элемент разметки пространства AnyLogic - перекресток, который делит
существующую дорогу на две отдельные дороги.
В нашей диаграмме
процесса блок carSource создает машины в начале дороги road,
после чего блок carMoveTo моделирует движение машины до конца той же
самой дороги, которая теперь заканчивается у перекрестка (после перекрестка
следует уже другая дорога, названная road2).
Давайте
переименуем обе эти дороги, чтобы в дальнейшем нам было проще ссылаться на них
в блоках диаграммы процесса.
 Переименуйте
дороги
1.
Поочередно выделите дороги и измените их имена в свойствах. Пусть
дороги теперь называются roadNorth, roadSouth, roadEast
(см. рисунок ниже).

Поскольку блоки
диаграммы процесса carSource и carMoveTo все еще ссылаются на
старое название дороги, нужно внести соответствующие изменения и в параметры
этих блоков.
Измените
параметры блоков диаграммы процесса
1.
Выделите блок carSource. Измените его Имя на carSourceS
(чтобы подчеркнуть, что этот блок генерирует машины, появляющиеся с юга).
2.
В поле Дорога этого блока вы увидите старое название
дороги. Чтобы заменить его на новое, лучше переключиться из режима задания
динамического значения в статический режим выбора элемента, щелкнув по кнопке  слева от поля
Дорога. Затем выберите имя дороги roadSouth из раскрывающегося
списка (см.рисунок ниже).

3.
Аналогичным образом измените свойства блока carMoveTo.
Назовите его carMoveToN (он будет моделировать движение машин до конца
уходящей на север дороги) и выберите в поле Дорога roadNorth.
Если вы сейчас
запустите модель, то увидите, что машины снова движутся по дороге Tapiolavagen
с юга на север.
Но мы не для того
создавали перекресток, чтобы довольствоваться движением машин лишь по одной
дороге. Следующим нашим шагом будет добавление новых блоков в диаграмму
процесса, чтобы машины начали ездить по всем дорогам, причем в каждом
разрешенном направлении.
 Добавьте
новые блоки в диаграмму процесса
1.
Вначале давайте переместим существующую диаграмму процесса ниже,
под синюю рамку окна модели, поскольку наша диаграмма процесса станет больше, и
уже не поместится в ту область под спутниковым снимком, которая отображается в
окне модели при ее запуске.
2.
Теперь давайте добавим блоки, моделирующие движение по той же
дороге, но с севера на юг (по полосе встречного движения улицы Tapiolavagen).
Добавьте еще один блок  CarSource и блок  CarMoveTo.
Соедините их, как показано на рисунке ниже:

Как вы видите на
рисунке, соединители блоков имеют сложную форму. Чтобы соединить порты двух
блоков соединителем нестандартной формы, нужно начать рисование с двойного
щелчка мышью по первому соединяемому порту, затем (если нужно) добавить точки
изгиба соединителя, щелкнув в соответствующих местах холста, и завершить
рисование, сделав щелчок внутри второго соединяемого порта.
Измените
параметры добавленных блоков диаграммы процесса
1.
Переименуйте блок carSource в carSourceN (этот блок
генерирует машины, появляющиеся с севера).
2.
В поле Дорога, выберите дорогу, на которой будут появляться
создаваемые этим блоком автомобили: roadNorth.
3.
Поскольку нам нужно, чтобы автомобили появлялись в начале полосы
встречного движения этой дороги (у ее северного конца), выберите в параметре Помещается
на полосу: встречного движения.
4.
Разверните секцию свойств Автомобиль и выберите в свойстве Новый
автомобиль Car. Теперь блок carSourceN будет
генерировать машины созданного нами типа Car, и они
будут отображаться в трехмерной анимации не параллелепипедами, а выбранными
нами ранее фигурками зеленых автомобилей.

5.
Аналогичным образом измените свойства блока carMoveTo.
Назовите его carMoveToS (он будет моделировать движение машин на юг), выберите
в поле Дорога roadSouth, а также выберите опцию Доехать до
конца полосы: встречного движения.

Если вы запустите
модель, то увидите, что теперь машины движутся по Tapiolavagen в обоих
направлениях.
Теперь давайте
промоделируем движение машин, едущих по Menninkaisentie с востока. На перекрестке
часть этих машин (примерно половина) будет следовать на юг, а оставшаяся часть
- на север.
 Добавьте
новые блоки в диаграмму процесса
1.
Добавьте еще один блок  CarSource (он будет генерировать
машины у начала дороги Menninkaisentie).
2.
Назовите этот блок carSourceE, а в поле Дорога
выберите roadEast. Разверните секцию свойств Автомобиль и
выберите в свойстве Новый автомобиль Car.
3.
Теперь нам нужно добавить блок, который будет направлять часть
машин по дороге Tapiolavagen на север, а часть – на юг. Для этого нам
понадобится блок  SelectOutput Библиотеки
моделирования процессов. Переключитесь на палитру Библиотека моделирования
процессов и перетащите блок  SelectOutput на диаграмму так,
чтобы он соединился с только что созданным блоком carSourceE.
4.
Назовите этот блок selectNS.
5.
Два выходных порта блока SelectOutput соедините с входными
портами блоков carMoveToN и carMoveToS. Диаграмма процесса должна
в итоге выглядеть следующим образом:

Блок SelectOutput
перенаправляет поступающих на его вход агентов (в нашем случае - автомобили) на
один из двух его выходов согласно заданным вероятностям или в зависимости от
выполнения заданного условия. По умолчанию блок работает согласно вероятностям,
направляя в верхний порт примерно 50 процентов агентов, что нас устраивает,
поэтому менять свойства этого блока нет смысла.
Чаще всего
диаграммы процесса моделей дорожного движения составляются из блоков Библиотеки
дорожного движения  CarSource,  CarMoveTo и  CarDispose,
а также блоков Библиотеки моделирования процессов  SelectOutput или  SelectOutput5
(для маршрутизации машин по разным направлениям) и  Delay (для моделирования
пребывания машин на парковках и автобусов на остановках, мы рассмотрим эти
случаи в данном учебном пособии позже).
Если вы запустите модель, то
увидите, что теперь машины движутся в обоих направлениях по Tapiolavagen, а
также приезжают с востока по Menninkaisentie, после чего направляются либо на
юг, либо на север. Единственное, что осталось неучтенным в текущей модели - это
поворот машин с Tapiolavagen на Menninkaisentie.
Давайте добавим
еще несколько блоков в диаграмму процесса, которые позволят нам промоделировать
и этот последний неучтенный сценарий движения машин.
 Измените
диаграмму процесса
1.
Добавьте еще один блок Библиотеки моделирования процессов  SelectOutput.
Поместите его между блоками carSourceS и carMoveToN (так, чтобы
он автоматически соединился с обоими этими блоками, см. рисунок ниже). Этот
блок нужен нам, чтобы распределить поток автомобилей с юга между восточным и
северным направлениями. Назовите этот блок selectNE.

2.
Откройте свойства этого блока. Настройте маршрутизацию
автомобилей. Предположим, что большинство автомобилей, едущих по главной дороге
(примерно 70%) будут продолжать ехать прямо по ней. В этом случае нам нужно
изменить долю автомобилей, которые будут перенаправляться в первый выходной
порт этого блока SelectOutput. В свойстве блока Вероятность
введите 0.7. Теперь в среднем 70 процентов агентов
будут направляться в верхний порт, а 30 - в нижний (мы соединим нижний порт с
соответствующим блоком позже).
3.
Добавьте еще один блок  SelectOutput. Назовите этот блок selectSE.
Поместите его между блоками carSourceN и carMoveToS (см. рисунок
ниже). Этот блок нужен для выбора пути автомобилей, едущих с севера. Аналогично
измените долю автомобилей, едущих на перекрестке прямо, на 70 процентов, введя
в поле Вероятность 0.7

4.
Теперь добавьте еще один блок Библиотеки дорожного движения  CarMoveTo.
Назовите его carMoveToE (он будет моделировать движение машин по Menninkaisentie
на восток). Соедините входной порт с нижними портами двух (!) блоков, selectNE
и selectSE. Выходной же порт соедините с блоком carDispose, как
показано на рисунке ниже.

5.
Откройте свойства этого блока. Выберите в поле Дорога roadEast,
а также выберите опцию Доехать до конца полосы: встречного движения.
Мы наконец-то
закончили задание логики движения машин на перекрестке. Запустите модель и
пронаблюдайте за тем, как машины движутся по дорогам.
Задание
4. Добавление парковки
В этой фазе мы
добавим парковку на обочине Menninkaisentie (парковка хорошо видна на
спутниковом снимке).
Но вначале давайте
немного улучшим нашу текущую модель. Как вы могли заметить, въезды на главную
дорогу с Menninkaisentie не совсем точно соответствуют реальным дорогам на
местности. Давайте изменим перекресток в модели, чтобы добиться более точного
соответствия.
 Измените
внешний вид перекрестка
1.
Чтобы вам было легче редактировать графические элементы
перекрестка, увеличьте масштаб графической диаграммы (воспользуйтесь для этого
кнопкой панели инструментов Приблизить ).

2.
Чтобы увеличить форму и длину въездов на перекрестке, нужно
увеличить площадь самого перекрестка. Это можно сделать, отдалив конечные точки
примыкающих к перекрестку дорог. Для этого выделите в графическом редакторе
дорогу roadEast. Вы увидите, что конечная точка дороги у перекрестка
выделена зеленым цветом. Аккуратно перетащите примыкающую к перекрестку точку в
сторону от перекрестка. При этом отпустить кнопку мыши нужно только в том
случае, если точка все еще подсвчечиваеся зеленым цветом - это означает наличие
соединения с перекрестком. Если же точка станет белой, то это значит, что вы
перетащили конец дороги слишком далеко от перекрестка. В таком случае отмените
последнее действие, нажав на кнопку панели инструментов  Отменить, и затем
повторите действие.

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

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

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

2.
Поместите курсор у дороги в том месте улицы Menninkaisentie, где
на спутниковом снимке видны припаркованные машины. Парковка прикрепится к
дороге. Если нужно переместить парковку, то это можно сделать, перетащив ее с
помощью мыши.
3.
Перейдите в панель Свойства, и измените Тип парковки
с параллельной на перпендикулярную. В итоге парковка должна выглядеть следующим
образом:

4.
По умолчанию парковка создается с пятью парковочными местами. Количество
парковочных мест можно изменить в свойствах элемента, но в нашем случае нам
нужна парковка именно на пять машин.
5.
Если нужно, то длину парковочного места можно задать, изменив
значение свойства Длина парковочного места. Ширина же определяется
свойством Ширина полосы дорожной сети (которое влияет на все элементы
этой сети: дороги, перекрестки, и т.д.).
Теперь нужно
добавить в нашу диаграмму процесса блоки, которые будут моделировать заезд
автомобилей на парковку и пребывание там, в течение определенного времени.
Чтобы не перегружать диаграмму процесса множеством аналогичных блоков, мы
промоделируем заезд на парковку только для части тех машин, которые движутся по
улице Tapiolavagen с севера, и затем поворачивают на Menninkaisentie.
 Измените
диаграмму процесса
1.
Мы хотим, чтобы теперь часть машин, едущих с севера и поворачивающих
на Menninkaisentie, заезжала на парковку, расположенную на обочине этой дороги.
Первым делом нужно удалить соединитель, ведущий из блока selectNE в блок
carMoveToE, поскольку в этом месте диаграммы нам нужно будет произвести
еще одно деление потока машин - часть машин поедет на парковку, в то время как
остальные - до конца дороги Menninkaisentie.
2.
Для того чтобы произвести это деление потока машин, добавьте еще
один блок Библиотеки моделирования процессов  SelectOutput. Назовите
этот блок selectParking и соедините его порты с портами других блоков,
как это показано на рисунке ниже.

3.
Мы хотим направлять на парковку только небольшую часть потока
машин (скажем, 10 процентов), поэтому введите в поле Вероятность: 0.1. Таким образом, мы задаем долю автомобилей,
направляемую блоком в свой верхний выходной порт.
4.
Добавьте еще один блок  CarMoveTo (в ветвь процесса,
ведущую из верхнего порта блока selectParking, см. рисунок ниже). Назовите
его carMoveToParking. Этот блок будет моделировать движение автомобилей
к парковке.

5.
В свойствах блока выберите Цель движения: парковка,
и затем выберите в поле Парковка имя созданной нами ранее парковки: parkingLot.
6.
Теперь нам нужно промоделировать, как приехавшие на парковку автомобили
пребывают на ней в течение определенного времени. Для этого добавьте блок Библиотеки
моделирования процессов  Delay. Назовите этот блок parking
и соедините его так, как это показано на рисунке ниже.

7.
Данный блок моделирует задержку, связанную с выполнением агентом
определенной операции (в нашем случае - ожидание на парковке). Откройте
свойства этого блока. Измените Время задержки на triangular(
5, 15, 45 ) минут.
8.
Поскольку на парковке могут одновременно находиться до 5 машин,
введите в поле Вместимость: 5. Этот параметр задает максимальное
количество агентов (в нашем случае - автомобилей), которое может одновременно
находиться в данном блоке.
Запустите модель.
Вы увидите, как время от времени автомобили будут заезжать на парковку. Но
попробуйте проиграть выполнение модели в режиме максимально возможной скорости,
щелкнув по кнопке панели инструментов окна модели  Реальное/виртуальное
время.
Тогда вы, скорее всего, увидите сообщение об ошибке. Причина этого в том, что в
какой-то момент автомобиль будет направлен на парковку, а свободных мест на ней
не окажется.
Давайте учтем и
этот случай, внеся минимальные изменения в нашу диаграмму процесса.
 Измените
диаграмму процесса
Как вы могли
заметить, у блока CarMoveTo помимо двух стандартных портов на левой и на
правой границе блока есть и еще один, помещенный на нижнюю границу значка. К
нему ведет красная стрелочка. Этот порт называется outWayNotFound и
представляет собой выходной порт, в который перенаправляются те автомобили, для
которых не удалось построить маршрут к заданной в этом блоке цели движения.
1.
Соедините нижний выходной порт блока carMoveToParking с
входным портом блока carMoveToE. В нашем случае автомобили будут
направляться в этот порт, если на момент поступления автомобиля в блок carMoveToParking
на парковке не окажется свободных мест. Таким образом, если парковка будет
полностью занята, то автомобили будут просто продолжать движение дальше по
дороге.

Запустите модель и
убедитесь в том, что модель работает корректно, и ошибок больше не возникает.
Задание
5. Добавление автобусов
Сейчас в нашей модели присутствуют только
легковые автомобили. Давайте сделаем следующий шаг по усовершенствованию
модели, добавив в нее рейсовые автобусы. Автобусы будут проезжать по
Tapiolavagen с юга на север, и останавливаться на остановке (вы можете увидеть
ее на спутниковом снимке, на обочине за перекрестком).
Добавьте
блок-источник автобусов
1.
Добавьте
еще один блок Библиотеки дорожного движения CarSource. Этот блок будет
моделировать появление автобусов. Назовите блок busSource и соедините
его с блоком carMoveToN.

2.
Измените
свойства только что созданного блока. Автобусы будут появляться в модели
существенно реже, чем легковые автомобили. Для начала давайте зададим Интенсивность
появления равной 20 в час.
3.
В
свойстве Дорога выберите имя дороги roadSouth.
4.
Раскройте
секцию свойств Автомобиль и в поле Длина задайте длину
создаваемого автобуса: 10 метров.
5.
В
поле Начальная скорость введите 40 км/ч.
6.
Мы
хотим, чтобы этот блок создавал не легковые автомобили, как это делают
созданные нами ранее блоки CarSource, а автобусы. Для этого нам
понадобится создать еще один тип агента - автобус. Раскройте секцию свойств Автомобиль
и щелкните по ссылке создать новый тип.
7.
При
этом откроется диалоговое окно Мастера создания типа агента. Введите в поле Имя
нового типа Bus и нажмите Далее.
8.
На
следующей странице Мастера оставьте выбранной опцию 3D и выберите в
списке ниже фигуру анимации Автобус 1. Щелкните по кнопке Готово.
Переключитесь обратно на диаграмму Main и
сверьтесь со следующим рисунком, все ли свойства блока вы правильно задали.

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

На скриншоте cверху автобус как раз
проезжает мимо автобусной остановки. Давайте теперь изменим логику модели, чтобы
автобусы начали заезжать на оставноку.
Вначале нам нужно будет нарисовать
автобусную остановку с помощью одноименного элемента разметки пространства
AnyLogic.
 Нарисуйте
автобусную остановку
1.
Перетащите
элемент Автобусная остановка  из секции Разметка пространства
палитры Библиотека дорожного движения на графическую диаграмму. Поместите
остановку на обочине, как это сделано на рисунке ниже.

2.
Удлините
остановку. Для этого выделите ее щелчком мыши и затем перетащите квадратный
маркер на ее краю.

Теперь
давайте добавим новые блоки в диаграмму процесса.
Измените
диаграмму процесса
1.
Добавьте
еще один блок  CarMoveTo (в ветвь процесса,
ведущую из блока busSource, см. рисунок ниже). Назовите этот блок busMoveToStop.
Он будет моделировать движение автобусов к остановке.

2.
В
свойствах блока busMoveToStop выберите Цель движения: автобусная
остановка и затем выберите в поле Автобусная остановка имя созданной
нами ранее остановки: busStop.
3.
Теперь
нам нужно промоделировать, как приехавшие на остановку автобусы пребывают на
ней в течение определенного времени. Для этого добавьте блок Библиотеки моделирования
процессов  Delay. Назовите этот блок stop
и соедините его так, как это показано на рисунке ниже.

4.
Откройте
свойства этого блока и задайте там Время задержки: triangular( 15, 30,
90 ) секунд.
Запустите модель. Вы увидите, как автобусы
заезжают на остановку и ждут там, пока пешеходы не выйдут и не зайдут в
автобус, после чего продолжают свое движение.

Задание
6. Добавление светофоров
В этой фазе мы сделаем перекресток регулируемым,
добавив светофоры.
Для этого нам понадобится блок Библиотеки
дорожного движения Traffic Light. Блок Traffic Light задает
логику работы одного или нескольких светофоров, регулирующих движение машин на
перекрестке или на пешеходном переходе.
Задайте логику
работы светофоров
1.
Добавьте
на диаграмму блок Traffic Light  из секции Блоки палитры Библиотека
дорожного движения. У этого блока нет портов, и его не нужно соединять ни с
какими другими блоками диаграммы процесса. Его можно добавить в абсолютно любое
место графического холста.

2.
Откройте
свойства блока. Обратите внимание на ключевой параметр блока: Задает режим
работы для. У этого параметра три альтернативные опции.
Опция Стоп-линий перекрестка
(выбрана по умолчанию). В нашем случае мы оставим выбранную по умолчанию опцию,
поскольку задаваемые этим блоком светофоры будут регулировать движение на
перекрестке, причем каждая фаза светофора будет разрешать / останавливать
движение сразу на всех полосах примыкающей к перекрестку дороги.
Опция Соединителей полос перекрестка
используется, если на регулируемом перекрестке разрешенные направления движения
машин во время одной и той же фазы светофора может различаться для разных
полос одной дороги.
Опция Заданных стоп-линий
используется, если моделируемые данным блоком светофоры регулируют движение
машин на одном или нескольких пешеходных переходах, заданных стоп-линиями
AnyLogic.
3.
В
свойстве Перекресток выберите имя нарисованного нами перекрестка: intersection.

4.
После
того, как вы укажете перекресток в свойствах блока Traffic Light, все
стоп-линии этого перекрестка появятся ниже в таблице Фазы. Здесь вы можете
задать режим работы светофора - как будут меняться красная, зеленая (а
опционально и желтая) фазы для входящих в выбранный перекресток стоп-линий.
5.
Давайте
настроим фазы светофора. Пусть 30-секундная зеленая фаза светофора для движения
по главной дороге Tapiolavagen (на время которой въезд на перекресток с улицы
Menninkaisentie приостанавливается) сменяется 20-секундной красной фазой
(зеленой для въезда с Menninkaisentie), и эти фазы бесконечно сменяют друг
друга. По умолчанию таблица содержит два столбца, по одному для каждой фазы.
Необходимо настроить зеленую и красную фазы для каждой стоп-линии. Начнем с
первой фазы. Щелкните по заголовку столбца первой фазы и укажите длительность
фазы равной 30 секундам.

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

7.
Щелкните
по стоп-линии в графическом редакторе, как показано на рисунке выше. Вы
увидите, что цвет стоп-линии изменится с красного на зеленый. Аналогичным
образом изменится и цвет соответствующей ячейки в таблице Фазы.
8.
Таким
же образом сделайте первую фазу светофора зеленой и для другой стоп-линии, расположенной
на той же дороге.

9.
Теперь
настроим вторую фазу. Щелкните по заголовку столбца второй фазы и укажите ее
длительность равной 20 секундам, после чего щелкните по стоп-линии,
расположенной на въезде с улицы Menninkaisentie.
10.
В
итоге таблица Фазы должна выглядеть следующим образом:

Запустите модель. Вы сможете увидеть, как
поочередно меняются фазы светофоров, разрешающие движение то по главной дороге
Tapiolavagen, то на въезде на перекресток с улицы Menninkaisentie.

Чтобы
лучше понимать, как загружены дороги при заданном режиме работы светофоров,
можно включить отображение пробок.
Включите
отображение пробок
1.
Добавьте
на диаграмму блок Road Network Descriptor  из секции Блоки палитры Библиотека
дорожного движения. Этот блок также не нужно соединять ни с какими другими
блоками диаграммы процесса.

2.
Измените
свойства блока. Выберите имя нарисованной вами сети дорог roadNetwork в
раскрывающемся списке Дорожная сеть.
3.
Откройте
секцию свойств Карта пробок на дороге и установите флажок Показывать
пробки.
Запустите
модель и изучите ситуацию на перекрестке.

Теперь вы можете попробовать изменить
режим работы светофоров (например, задать фазы длительностью 30 / 20 или 30 /
30 секунд) и изучить, при каком режиме достигается наилучший для водителей
результат.
Это
один из примеров практического применения Библиотеки дорожного движения. Обычно
модели дорожного трафика создаются для анализа и сравнения различных вариантов
организации движения (как в нашем случае с регулировкой светофоров), моделирования
проектируемых развязок и дорог с целью выявления узких мест, проверки
целесообразности увеличения или уменьшения количества полос на определенном
отрезке существующей дорожной сети и т.д. Кроме того, с помощью Библиотеки
дорожного движения вы можете добавить (трехмерную) анимацию движения
автотранспорта в ваших моделях (автобусы-шаттлы и такси в аэропорту, фуры в
логистических центрах и т.д.), тем самым выведя анимацию вашего проекта на
качественно иной уровень.
Практическая работа №10
Тема: Модель павильона метро (Пешеходы)
Цель:
- разработать
имитационную модель павильона метро.
Вид
работы:
фронтальный
Время
выполнения:
2 часа
Ход работы
Задание 1.
Моделирование простого потока пассажиров
Вначале мы
создадим простую модель потока людей, двигающихся внутри нашего здания.
Создание новой
модели
Создайте новую модель
1.
Щелкните
мышью по кнопке панели инструментов Создать . Появится окно Мастера
создания модели.

2.
Задайте
имя новой модели. В поле Имя модели введите Subway
Entrance Hall.

3.
Укажите
каталог, в котором будут сохранены файлы модели. Выберите каталог с помощью
диалога навигации по файловой системе, открывающегося по нажатию на кнопку Выбрать,
или введите путь к каталогу в поле Местоположение.
4.
Выберите
минуты в качестве Единиц модельного времени.
5.
Щелкните
Готово, чтобы закончить создание модели.
Вы создали новую
модель. В ней уже имеется один тип агента Main и эксперимент Simulation.
Агенты - это главные строительные блоки модели AnyLogic. В нашем случае агент Main
послужит местом, где мы зададим всю логику модели: здесь мы расположим чертеж
павильона и зададим диаграмму процесса пассажиропотока.
В центре рабочей
области находится графический редактор диаграммы типа агента Main.

В левой части
рабочей области находятся панель Проекты и панель Палитра. Панель
Проекты обеспечивает легкую навигацию по элементам моделей, открытых в
текущий момент времени. Поскольку модель организована иерархически, то она
отображается в виде дерева. Панель Палитра содержит разделенные по
палитрам элементы, которые могут быть добавлены на диаграмму типа агента или
эксперимента.
В правой рабочей
области будет отображаться панель Свойства. Панель Свойства используется
для просмотра и изменения свойств выбранного в данный момент элемента (или
элементов) модели. Когда вы выделяете какой-либо элемент, например, в панели Проекты
или графическом редакторе, панель Свойства показывает свойства
выбранного элемента.
Добавление чертежа
моделируемого здания
При создании
пешеходной модели вначале обычно добавляется рисунок - план моделируемого
пространства (помещения, здания). Затем поверх стен на этом плане рисуются
стены (с помощью специальных элементов разметки пространства AnyLogic), и затем
создается диаграмма процесса: как пешеходы перемещаются внутри здания.
В этой модели мы будем использовать
следующий рисунок - план павильона метро:

Сохраните рисунок
- план на ваш компьютер
1.     Щелкните правой
кнопкой мыши по рисунку выше и выберите Сохранить изображение как... из
контекстного меню. В открывшемся диалоговом окне выберите, куда вы хотите сохранить
файл изображения.
 Добавьте рисунок с
изображением плана павильона в модель
1.     Вначале откройте
палитру Презентация. Эта палитра содержит элементы, которые вы можете
использовать для рисования анимации модели.
2.     Чтобы открыть
какую-либо закладку панели Палитра (именуюмую в дальнейшем палитрой),
нужно щелкнуть мышью по соответствующей иконке на вертикальной панели слева от
палитры. Пока Вы привыкаете к иконкам палитры, вы можете навести указатель
мыши на панель и подождать, пока появится всплывающее окно, в котором Вы
увидите названия палитр.

3.
Итак,
вы открыли палитру Презентация. Перетащите элемент Изображение  из палитры Презентация
на графическую диаграмму Main:

4.
Теперь
нам необходимо выбрать рисунок для отображения. Диалог для выбора файла
появится автоматически. Откройте папку, в которую вы только что сохранили файл
изображения, и выберите его.
5.
Изображение
будет выглядеть в графическом редакторе следующим образом:

6.
Заблокируйте
изображение, установив флажок Блокировать в панели Свойства. Вы не
сможете выбрать заблокированную фигуру в графическом редакторе до тех пор, пока
Вы не снимете с нее блокировку. Мы делаем так потому, что мы будем рисовать
другие фигуры поверх этого изображения, и поэтому мы хотим исключить возможность
случайного редактирования изображения при рисовании этих фигур.

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

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

4.
Последовательно
щелкайте мышью в тех точках диаграммы, куда Вы хотите поместить углы стены.
Каждый щелчок добавляет часть линии той стены, которую вы рисуете.
5.
Чтобы
добавить кривую линию, щелкните левой кнопкой мыши в точку конца кривой линии и
двигайте указатель мыши, удерживая кнопку. Пока Вы ведете указатель мыши, Вы
заметите, как изменяется радиус кривизны. Чтобы нарисовать окружность, двигайте
указателем ровно вдоль сетки координат. Отпустите левую кнопку мыши, когда
рисунок готов.
6.
Чтобы
завершить рисование, добавьте последнюю точку стены двойным щелчком мыши.
Рисование входа и
цели движения для потока пешеходов
Теперь нужно задать области входа и выхода
пешеходов.
Вначале мы
нарисуем область входа – линию, в которой пешеходы будут появляться. Линия
входа для пешеходного потока может быть задана специальным элементом разметки Целевая
линия.
Мы хотим
нарисовать линию входа точно там, где на рисунке вход обозначен текстом -
ENTRANCE:
Нарисуйте линию, где
появляются пассажиры
1.     Перетащите элемент
Целевая линия из секции Разметка палитры Пешеходная
библиотека в графический редактор.
2.     Измените, ее
размер и расположите точно так, как показано на рисунке:

3.     Назовите линию entryLine.

Теперь давайте
добавим еще одну целевую линию, которая определяет место, куда движутся
пассажиры после того, как они зашли в павильон метро.
Мы хотим, чтобы
они шли к поездам метро, поэтому давайте расположим эту целевую линию у прохода
к поездам - над текстом TO TRAINS.
Нарисуйте целевую линию
1.
Нарисуйте
еще одну целевую линию и расположите ее так, как показано на рисунке. Зайдя в
павильон метро, пассажиры будут двигаться сюда, чтобы попасть к поездам метро.

Обратите
внимание на то, что все элементы разметки (целевые линии и др.) должны
находиться внутри стены.
Создание диаграммы,
задающей поток пешеходов
Теперь мы закончим
создание модели, моделирующей простейший пассажиропоток, создав
диаграмму моделируемого нами процесса из блоков Пешеходной библиотеки.
Мы начнем с самого
простого процесса: пассажиры входят на станцию метро (там, где мы нарисовали entryLine)
и затем двигаются в направлении поездов (к нашей targetLine).
Диаграмма процесса
в AnyLogic создается путем добавления объектов библиотеки из палитры на
диаграмму типа агентов, соединения их портов и изменения значений свойств
объектов в соответствии с требованиями Вашей модели.
Создайте диаграмму
процесса
1.
Добавьте
объекты Пешеходной библиотеки на диаграмму и соедините их так, как
показано на рисунке. Чтобы добавить на диаграмму объект Пешеходной библиотеки,
нужно открыть в панели Палитра палитру этой библиотеки, щелкнув мышью по
панели с ее заголовком, а затем перетащить нужный Вам объект из палитры на
диаграмму типа агента.

2.
Пока
вы перетаскиваете блоки и располагаете, их друг рядом с другом, Вы можете
видеть, как появляются соединительные линии между блоками. Будьте внимательны,
эти линии должны соединять только порты, находящиеся с правой или левой стороны
иконок. Это очень важно, потому что, например, присоединение порта блока pedSink
к нижнему порту блока pedGoTo вызовет ошибку.

3.     Переименуйте
блоки. Назовите их inflowSource, goToTrains, inflowSink.
(Вы можете это сделать в свойствах блока.)

Скажем несколько слов об этих блоках
диаграммы.
·
Объект
PedSource создает пешеходов. Обычно он используется в качестве начальной
точки диаграммы процесса, формализующей поток пешеходов. В нашем примере он
моделирует приход пассажиров в павильон.
·
Объект
PedGoTo моделирует перемещение пешеходов из текущего местоположения в
другое (заданное параметром этого объекта). С помощью этого объекта мы будем
моделировать то, как пассажиры перемещаются от входа в павильон к поездам метро.
·
Объект
PedSink удаляет поступивших в объект пешеходов из моделируемой среды.
Обычно объект используется в качестве конечной точки диаграммы процесса.
Детальное описание
объектов Пешеходной библиотеки, их функций и параметров Вы можете найти
в Справочном руководстве по Пешеходной библиотеке.
Измените свойства
блоков диаграммы
1.
Выделите
блок inflowSource. В панели Свойства задайте место, где
появляются пассажиры. Выберите entryLine (название нашей
целевой линии, нарисованной ранее у входа) из выпадающего списка Целевая
линия.
2.
Задайте
4000
в час в
параметре Интенсивность.

3.
Теперь
измените свойства объекта goToTrains. Укажите пункт назначения для
пассажиров. После того, как пассажиры войдут в здание, они будут двигаться к
той цели, которую вы здесь укажете. На данный момент мы хотим, чтобы пассажиры,
вошедшие в павильон, сразу двигались к поездам метро. Укажите targetLine (название целевой
линии, которую мы нарисовали второй) в списке Целевая линия.

4.
Оставьте
все свойства объекта PedSink установленными по умолчанию.
Итак, готово! Давайте запустим нашу
модель.
Запустите модель
1.
Щелкните
мышью по кнопке панели инструментов Запустить  и выберите из открывшегося
списка эксперимент, который Вы хотите запустить. Эксперимент этой модели будет
называться Subway Entrance Hall/Simulation.

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

2.     Щелкните по кнопке
Запустить. Модель запустится, и Вы сможете пронаблюдать за динамикой
моделируемого процесса, с помощью нарисованной Вами презентации на диаграмме
типа агента Main.
Можно увидеть, что
пассажиры входят в павильон и движутся по коридору, ведущему к поездам метро.

Замечательно! В
считанные минуты мы смогли создать простую модель.
Обратите внимание,
что для каждого шага моделирования имеются контрольные модели. Вы можете
использовать их, чтобы сравнить свою модель с контрольной. Далее приведена
ссылка на контрольную модель для этого шага.
Задание 2.
Моделирование турникетов
На начальном этапе
мы промоделировали простой поток пешеходов: пассажиры входят в здание станции
метро и движутся через павильон к поездам.
Теперь же мы
хотим, чтобы пассажиры проходили через турникеты для проверки билетов до того,
как они проходят на платформу отправления поездов. Поэтому давайте добавим
турникеты в конце павильона.
Моделирование
сервисов
Турникеты являются
типичным примером использования сервисов в моделях с пешеходами.
Имеется два типа
элементов разметки пространства, которые вы можете использовать, чтобы добавить
сервисы в Вашу модель:
 Сервис с очередями
- используется для того, чтобы задавать сервисы, в которых пешеходы ждут в
очереди, пока сервис не будет доступен.
 Сервис с областью -
используется для того, чтобы задавать сервисы с электронной очередью. В таком
случае пешеходы не стоят в очереди, а ждут в расположенной рядом области.
Турникеты
обычно моделируются элементом Сервис с очередями.
Нарисуйте турникеты
1.
Перетащите
элемент Сервис с очередями  из раздела Разметка палитры Пешеходная
Библиотека в графический редактор. Вы увидите две точки сервиса и две
очереди, ведущие к этим точкам. Разместите эти элементы, как показано на
рисунке:

2.
Настройте сервисы. Назовите их fareGates.
3.
Очевидно, что двух турникетов недостаточно. Увеличьте значение
параметра Количество сервисов до 6. Соответственно, увеличьте значение
параметра Количество очередей также до 6.
4.
Измените значение свойства Тип сервиса с Точечный на
Линейный.

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

Изменение
диаграммы процесса
Теперь мы внесем
небольшие изменения в диаграмму процесса.
Измените диаграмму
процесса
1.
Освободите
место для нового блока на нашей диаграмме. Сдвиньте блоки goToTrains и inflowSink
вправо, как показано на рисунке:

2.
Теперь
мы можем вставить блок PedService в нашу диаграмму. Блок PedService моделирует
то, как пешеходы движутся к сервисам, заданным графически элементом разметки и
проходят через сервис. Перетащите блок PedService из палитры Пешеходной
библиотеки в графическую диаграмму, поместите сразу за блоком создания
пешеходов. Размещая блок посередине соединителя, мы соединяем порты
автоматически (но помните, что нужно присоединить правый порт блока pedService,
а не нижний).

3.     Объект появится в
диаграмме.

Если Вы выделите
соединитель щелчком мыши, и его конечные точки в портах будут подсвечиваться
светло-зеленым цветом, то это будет означать, что Вы успешно соединили порты.
Иначе же Вам придется проверить, обе ли конечные точки соединителя были
помещены точно в порты, и если нет, то передвиньте их туда.
Измените блоки
диаграммы
1.
Откройте
панель Свойства блока pedService.
2.
Измените
название блока на checkTickets.
3.
Выберите
fareGates (название нашего
элемента разметки Сервис с очередями) в поле Сервисы.
4.
Вы увидите, что заданное Время задержки распределено по
равномерному закону с минимальным значением, равным 2 секундам и максимальным,
равным 3 секундам. Оставьте это значение, поскольку оно является типичным
временем задержки при прохождении турникетов.

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

6 турникетов.
Моментально образуются огромные очереди.
2.
Остановите
модель и снова откройте свойства элемента сервиса. Увеличьте количество
сервисов и очередей до 7.
Снова запустите модель и проследите за
положением вещей сейчас. Вам может показаться, что теперь все проходит
благополучно. Но, на самом деле, моделируемый процесс исполняется медленно, и,
чтобы увидеть всю динамику, мы рекомендуем Вам увеличить скорость исполнения
модели, чтобы понять, будут ли расти очереди.
Вы можете изменить
скорость выполнения модели с помощью кнопок панели инструментов Замедлить и
Ускорить .
На данный момент,
Вам лучше всего переключиться в режим виртуального времени, чтобы модель
выполнялась на максимально возможной скорости, и Вы смогли быстро
промоделировать работу системы за долгий период времени.
Чтобы
переключиться в режим виртуального времени, нужно щелкнуть мышью по кнопке
панели инструментов Реальное/виртуальное время .
Итак, очереди все еще растут, не так
быстро как раньше, но иногда они могут стать довольно значительными. Семи
турникетов до сих пор недостаточно, чтобы обслуживать поток из четырех тысяч
пешеходов в час. (Не забывайте, что наши турникеты имеют время задержки, равное
двум-трем секундам).
Итак, давайте еще
раз увеличим количество турникетов. Измените, количество сервисов и количество
очередей до 8 и снова запустите модель.
Наконец наша
конфигурация приемлема: станция успешно справляется с таким потоком пешеходов.

8 турникетов.
Очереди в пределах разумного.
Итак, мы впервые
извлекли практическую пользу из нашей модели. Данная модель помогла нам найти
требуемое количество точек сервиса. Вы можете изменять интенсивность
пассажиропотока в настройках блока PedSource и наилучшим образом
моделировать средства обслуживания согласно нагрузке.
Сохраните
изменения в модели, щелкнув кнопку панели инструментов Сохранить  (продолжайте в дальнейшем
сохранять изменения время от времени). Теперь мы можем продолжить разрабатывать
нашу модель дальше.
Задание
3. Отображение карты плотности пешеходов
Мы создали модель
динамики пешеходного потока в здании павильона метро. Теперь нам хотелось бы
получить статистические данные этого потока. Самым значительным инструментом в
моделировании пешеходов является Карта плотности пешеходов.
Отобразите
карту плотности пешеходов
1.
Перетащите
элемент Карта плотности пешеходов  из секции Разметка пространства
палитры Пешеходная библиотека в графический редактор. В отличие от
других объектов библиотек, у этого объекта вместо привычного небольшого значка
отображается шкала. На анимации отображается легенда карты. Легенда карты
плотности помогает понять, какие цвета соответствуют каким значениям плотности.

2.
Откройте
панель Свойства этого блока и сбросьте флажок Отображать имя.
3.
Выберите
значение ground из списка Этаж.

Теперь вы можете
запустить модель и наблюдать за динамикой моделируемого процесса.

Карта
плотности
Вы увидите, что по
мере того, как пешеходы двигаются в моделируемом пространстве, план помещений
будет постепенно закрашиваться различными цветами. В каждой точке пространства
цвет будет соответствовать измеренной в этой точке плотности пешеходов. Карта
плотности постоянно перерисовывается в соответствии с актуальными значениями,
при изменении плотности на определенном участке цвет динамически
перерисовывается другим цветом.
Карта плотности
чаще всего используется для обнаружения участков пространства, на которых
значение плотности достигает критических значений. Такие области отображаются
на карте плотности красным цветом. По умолчанию значение критической плотности
задано равным 1,5 пешехода на квадратный метр. Вы можете изменить это значение
в свойстве Критическая плотность (отображается красным), пешеходов/м2
элемента Карта плотности пешеходов. Синий цвет используется для участков
низкой плотности. При нулевой плотности закрашивание соответствующего участка
не производится вообще. Приведенная на рисунке шкала информирует нас о том,
что, например, желтый цвет на карте плотности будет соответствовать плотности
0,75 пешеходов/м2.
По умолчанию
AnyLogic использует логарифмическую цветовую схему. При логарифмической схеме
цвет стремительно приближается к «критическому» (красному) только при
приближении к зоне критических значений плотности, а при малых значениях
остается нейтральным. Вы можете сменить логарифмическую схему на линейную,
выбрав Линейная в свойстве Цветовая схема. В этом случае цвета
будут меняться от синего к красному линейно согласно градиенту спектра цветов. При
желании вы можете задать и свою собственную цветовую схему любой сложности,
выбрав Другая в свойстве Цветовая схема. В расположенном ниже свойстве
Другой цвет вы можете написать выражение, которое, в зависимости от
значения плотности, будет возвращать тот или иной цвет.
Вы можете
заметить, что даже когда в области совсем нет пешеходов, карта плотности все
равно отображается. Это обусловлено там, что карта плотности может либо
запоминать и отображать цвета, соответствующие максимальным историческим
значениям (когда затухание выключено), либо карта будет соответствовать
картине, полученной только за недавнее время (когда затухание включено). Затухание
включено по умолчанию. Если опция выбрана, и карта плотности будет затухать, то
цвет будет постепенно стремиться к текущему значению плотности (не
моментально, а с заданным опозданием). Чтобы включить затухание, установите
флажок Включить затухание в свойствах элемента Карта плотности
пешеходов.
Если Вас не
устраивает плотность карты на чертеже тем, что его практически не видно, Вы
можете увеличить степень прозрачности отображаемой на анимации карты плотности.
С помощью бегунка Прозрачность (0=прозрачный, 1=непрозрачный) на панели
свойств элемент Карты плотности пешеходов выберите значение, лежащее в
интервале [0..1]. Значение 0 соответствует абсолютной прозрачности (карта
плотности не видна), значение 1 - абсолютной непрозрачности (цвет полностью закрашивает
анимацию).
Вы можете отключить отображение карты
плотности, но при этом продолжать собирать соответствующую статистику, без
отображения карты при анимации модели. Для этого сбросьте флажок Показывать
карту плотности на анимации. В таком случае Вы можете увеличить скорость
выполнения модели. Эта статистика может храниться в наборах данных, откуда,
например, по окончании моделирования, записываться в базу данных для
последующего статистического анализа.
Задание
4. Добавление автоматов продажи билетов
На данный момент все пассажиры в нашей
модели входят в павильон метро, затем проходят через турникеты и направляются к
поездам. Таким образом, мы предполагаем, что все пассажиры заранее купили себе
билеты. Но вряд ли это верно на самом деле. Некоторые люди входят в павильон
метро уже с билетами в кармане, но большинство людей покупают билеты, лишь,
когда заходят в станцию метро.
На станции могут находиться различные виды
услуг продажи билетов. Небольшие павильоны метро могут быть оборудованы только
автоматами по продаже билетов, а большие и просторные станции могут также иметь
билетные кассы.
Давайте сначала добавим в нашу модель
автоматы продажи билетов. Создавая такую модель, нам необходимо знать
количество автоматов, требуемое для того, чтобы успешно обслужить такое
количество пассажиров; также, мы сможем найти самое подходящее место
расположения автоматов, чтобы минимизировать пересечения потоков пассажиров и
образование толп.
Как и турникеты, автоматы продажи билетов
логично моделировать элементом Сервис с очередями.
Нарисуйте
автоматы продажи билетов
1.
Перетащите элемент Сервис с очередями  из секции Разметка палитры Пешеходная Библиотека в
графический редактор.
2.
Повращайте
элементы сервиса и разместите их так, как показано на рисунке:

3.
Откройте страницу свойств сервисов и настройте эту группу
сервисов.
4.
В этот раз наши сервисы не линейные, а точечные. Точечные сервисы
используются тогда, когда для того, чтобы быть обслуженным, пешеход должен
просто подойти к любой точке фигуры, задающей соответствующий сервис и провести
там время, заданное как Время задержки для этого сервиса. Так что
оставьте выбор Точечный в свойстве Тип сервиса.
5.
Назовите сервисы ticketMachines.
6.
Увеличьте параметр Количество сервисов до 7.
Соответственно, увеличьте параметр Количество очередей так же до 7.

Теперь мы хотим направить некоторых из
пассажиров сразу к турникетам, а некоторых - на обслуживание у автоматов
продажи билетов.
Измените
диаграмму модели
1.
Добавьте
объект PedSelectOutput, чтобы разделить поток пассажиров. Нам нужен этот
объект, чтобы перенаправлять пассажиров без билетов к
автоматам продажи билетов, а пассажиров с билетами – к турникетам. Объект PedSelectOutput
является блоком принятия решения Пешеходной библиотеки. Пешеход, вошедший в
блок PedSelectOutput, будет перенаправляться в один из пяти выходных
портов в зависимости от заданных для этих портов коэффициентов предпочтения.

2.
Добавьте
еще один объект PedService. Этот блок будет моделировать обслуживание
пассажиров у автоматов продажи билетов. Поместите его между объектом PedSelectOutput
и ранее созданным объектом PedService (checkTickets).
3.
Соедините
блоки, как показано на рисунке.

4.
Измените
свойства объекта PedSelectOutput. Назовите его routePassengers.
Укажите значение 0.7 в поле Коэфф. предпочтения 1 (коэффициент
для потока, направляющегося напрямую к турникетам) и значение 0.3
в поле Коэфф. предпочтения 2 (коэффициент для потока пассажиров,
направляющихся к автоматам продажи билетов соответственно). На этой диаграмме
мы допускаем, что количество пассажиров, которые уже купили билеты, значительно
выше. Укажите в полях Коэфф. предпочтения 3, 4, 5 значение, равное 0.

5.
Настройте
только что добавленный объект PedService. Переименуйте его как atTVM.

6.
Выберите
ticketMachines (название нашего элемента разметки Сервис с очередями)
в свойстве Сервисы.
7.
Измените
параметр Время задержки. Введите в поле: triangular(7, 12, 40) и выберите
секунды в качестве единиц времени. Мы допускаем, что время обслуживания
неравнозначно распределено с минимальным значением 7 секунд, средним 12, и
максимальным 40 секунд.

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

Практическая работа №11
Тема: Сортировочная горка (Моделирование ж/д узла)
Цель:
- разработать
имитационную модель сортировочная горка.
Вид
работы:
фронтальный
Время
выполнения:
2 часа
Ход работы
Задание
1. Создание железнодорожного узла
С помощью нашей модели мы воспроизведем
отправление вагонов на путь, который называют стрелочной горловиной.
Оттуда вагоны отправляются через серию стрелок, называемую стрелочной улицей,
на пути сортировки.
Мы начнем с топологии железнодорожной
сети, как на рисунке ниже:

Создайте новую модель. Назовите ее Hump
Yard и укажите минуты в качестве единиц модельного времени.
Задайте топологию путей. Сначала нарисуйте
ж/д пути.
Начните с прямого пути. На этом пути будут
появляться поезда, поэтому мы назовем его trackEntry. Мы будем давать
осмысленные имена только тем путям, на которые будут ссылаться блоки диаграммы
процесса. Остальные пути могут остаться названными по умолчанию.
Нарисуйте
прямой ж/д путь
1.
Сначала
выделите двойным щелчком элемент Ж/д путь в секции Разметка пространства
палитры Железнодорожная библиотека.
2.
Щелкните
в любой точке графического редактора, чтобы начать рисовать путь.
3.
Чтобы
нарисовать прямой сегмент пути, добавьте щелчком мыши конечную точку сегмента.
4.
Завершите
рисование двойным щелчком.
5.
Назовите
этот ж/д путь trackEntry.

Если это первый ж/д путь в модели, вы увидите сообщение с предложением сменить
масштаб модели на: 2,0 пикселя в 1 метре. Мы советуем согласиться, так как
предлагаемый масштаб часто используется в железнодорожных моделях.
После этого вы увидите
нарисованный прямой
ж/д путь, по которому будет двигаться состав. Теперь давайте нарисуем объездной
путь, по которому локомотив будет подъезжать к составу сзади для его
перемещения на сортировочную горку. Этот путь будет не прямой, а дуговой формы,
и сценарий его рисования будет несколько отличаться.
Нарисуйте ж/д
путь дуговой формы
1.
Совершите
двойной щелчок по элементу Ж/д путь  в палитре Железнодорожная библиотека.
Затем щелкните по ранее нарисованному пути (см. рисунок ниже, пункт 1), чтобы
начать рисовать новый ж/д путь. Круг, обозначающий стрелку, появится
автоматически.
2.
Последовательно
щелкая мышью, нарисуйте несколько сегментов пути, чтобы получился путь, как на
рисунке ниже. Чтобы добавить дуговой элемент, не отпускайте кнопку мыши после
щелчка, а переместите курсор, удерживая кнопку мыши. При этом вы увидите, как меняется
радиус дуги. Отпустите кнопку мыши, когда посчитаете, что сегмент приобрел
нужную форму. Завершите рисование ж/д пути двойным щелчком рядом с фигурой
первого пути (см. пункт 2 на рис. ниже). Сразу поставить конечную точку на тот
же путь, с которого начали рисовать (trackEntry), не получится.

3.     Перетащите
конечную точку (2) на ранее нарисованный путь (trackEntry), чтобы
создать стрелку.

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

Железнодорожные
стрелки
·
Железнодорожная
сеть состоит из путей и стрелок. Железнодорожные стрелки появляются
автоматически в виде круга в точках соединения ж/д веток с существующими
путями. В существующую точку соединения нельзя добавить дополнительные ж/д
пути.
·
Два
из трех образованных стрелкой углов должны быть тупыми. Это необходимо для
определения возможных путей движения на данной стрелке (см. рисунок ниже).

Модифицируйте
железнодорожный узел
Каждый раз при создании железнодорожных
стрелок, ж/д путь разбивается на отдельные пути. В нашем случае мы создали две
железнодорожные стрелки, соединив объездной путь с существующим путем в двух
точках. В результате существующий путь разделился на три пути, каждый со своим
именем и свойствами.
Сейчас мы дадим осмысленное имя сегменту ж/д
пути между железнодорожными стрелками и добавим элементы Точка ж/д пути в наш
железнодорожный узел.
1.
Назовите
этот путь trackArrival, так как он обозначает место прибытия поезда.
2.
Перетащите
элемент Точка ж/д пути из палитры Железнодорожная библиотека и
расположите его, как показано на рисунке ниже. Назовите его stopLineEntry.
Он будет определять место появления поездов.
3.
Добавьте
элемент Точка ж/д пути: stopLineArrival. В этой точке поезд
остановится, чтобы отцепить все вагоны, что позволит локомотиву продолжить путь
уже без вагонов.
4.
Добавьте
элемент Точка ж/д пути: stopLineHump. Здесь будет
производиться сортировка вагонов.

Точка
ж/д пути
Точка
ж/д пути является элементом разметки пространства, который используется, чтобы
задать точную позицию на ж/д пути. Это может понадобиться, когда вы задаете:
·       позицию на пути,
где появляется поезд;
·       позицию на пути,
где поезд должен остановиться.
В этой части учебного пособия мы создали железнодорожный
узел, который будет далее использоваться в нашей модели.
Обратите внимание, для каждого шага
моделирования имеются контрольные модели. Вы можете использовать их, чтобы
сравнить свою модель с аналогичной моделью, созданной нами. Далее приведена
ссылка на контрольную модель для этого шага.
Задание
2. Задаем логику
Задайте
логику процесса с помощью блоков Железнодорожной библиотеки
1.
Добавьте следующие блоки на диаграмму процесса: TrainSource,
TrainMoveTo, TrainDecouple, TrainCouple, TrainDispose.
С
помощью этих блоков мы зададим логику, согласно которой будет передвигаться наш
поезд.
Начните диаграмму с блока TrainSource,
который создает поезда, затем добавьте блок TrainMoveTo, расположив его
рядом с первым блоком таким образом, чтобы они могли автоматически соединиться.
Добавьте оставшиеся блоки на диаграмму процесса, как показано на рисунке ниже.

2.     В свойствах блоков
TrainSource и trainMoveTo укажите следующее:
Сначала мы укажем, чтобы поезда появлялись
у ж/д точки stopLineEntry каждые 15 минут.
TrainSource:
Время между прибытиями: 15 минут
Кол-во вагонов (включая локомотив): 11
Точка ж/д пути: stopLineEntry
После
создания, каждый поезд будет направляться к ж/д точке stopLineArrival, у
которой он будет замедляться, после чего окончательно остановится.
TrainMoveTo:
Маршрут: Вычисляется
автоматически от текущего пути до пути назначения
Цель движения: Заданная точка
пути
Точка ж/д пути: stopLineArrival
При окончании движения: Затормозить и
остановиться
3.
Мы
также добавили блок TrainDecouple, задача которого отцеплять заданное
количество вагонов от поступающего поезда. В свойствах блока можно увидеть, что
по умолчанию он отцепляет один вагон от поезда, а именно первый (в нашем случае
- это локомотив). Локомотив будет покидать блок через нижний порт outDecoupled
(мы добавим это соединение на следующем шаге).
4.
Блок
TrainCouple нужен для сцепления локомотива и вагонов в один состав.
Ниже приведены
описания блоков Железнодорожной библиотеки, которые мы
используем.

Блок Железнодорожной
Библиотеки

Описание

Train
  Source

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

Train
  Dispose

Удаляет
  поезда из модели.

Train
  Move To

Моделирует
  движение поездов. Может рассчитывать маршрут и положение стрелок по ходу
  движения поезда по маршруту. Поддерживает функции ускорения и торможения.

Train
  Couple

Сцепляет
  два поезда, которые «касаются» друг друга, в один.

Train
  Decouple

Расцепляет
  вагоны поступающего в блок поезда и создает из них новый поезд.

Train
  Enter

Помещает
  поступающего в блок агента-поезд на заданный путь ж/д сети.

Train
  Exit

Извлекает
  поступающий в объект поезд из ж/д сети и передает агента-поезд далее в
  обычную диаграмму процесса.

RailSettings

Задает
  специфические настройки для железнодорожной сети.

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

1.
Добавьте
еще один блок TrainMoveTo на диаграмму процесса (trainMoveTo1).
Задайте параметры нового блока, согласно которым локомотив направится к stopLineHump
и остановится там.
Маршрут: Вычисляется
автоматически от текущего пути до пути назначения
Цель движения: Заданная точка пути
Точка ж/д пути: stopLineHump
При окончании движения: Затормозить и остановиться
Создайте еще два блока TrainMoveTo (trainMoveTo2,
trainMoveTo3) путем Ctrl+перетаскивания (Mac OS: Cmd+перетаскивания) блока,
который вы только что редактировали.
2.
Измените
свойства блока trainMoveTo2. В данный момент локомотив отцеплен и
нам нужно, чтобы он затолкал вагоны на горку, т.е. ему нужно вернуться к stopLineEntry
и произвести сцепку с концом поезда. Так как мы не можем его развернуть на
рельсах, локомотив поедет назад мимо пути trackArrival, на котором стоят
вагоны:
Направление
движения:
Назад
Маршрут не должен содержать (...): trackArrival
Точка ж/д пути: stopLineEntry
3.
Обратите
внимание на количество соединений, ведущих от блока trainMoveTo3 к блоку
trainCouple. Нижний порт блока TrainMoveTo, в отличие от порта out,
который находится справа, используется поездами, которые сталкиваются с другими
поездами. В нашем случае, сталкивание является сцеплением локомотива,
прибывающего к точке ж/д пути stopLineArrival, с вагонами, которые мы
предварительно отцепили от этого локомотива.
Теперь
внесите изменения в свойства блока trainMoveTo3, чтобы этот блок
направлял поезд из его текущего местоположения к точке stopLineArrival:
Точка ж/д пути: stopLineArrival

Теперь, когда мы смоделировали
передвижение локомотив к концу состава, нужно добавить еще один блок TrainMoveTo
путем Ctrl+перетаскивания (Mac OS: Cmd+перетаскивания) блока trainMoveTo1.
Он будет моделировать процесс толкания вагонов локомотивом к горке,
представленной в нашей модели элементом Точка ж/д пути stopLineHump.

4.     Измените свойства
блока trainMoveTo4:
Точка ж/д пути: stopLineHump
5.
Добавьте
блок Delay из Библиотеки моделирования процессов, чтобы смоделировать
задержку. Измените свойства блока, задав время этой задержки:
Время задержки: 15 секунд
Мы завершили Шаг 2. Можете запустить
модель и посмотреть, как по ж/д путям передвигаются товарные составы.
Если вы увидите ошибку «The car being
created must fully be on one track», значит на пути недостаточно места для
помещения поезда перед элементом Точка ж/д пути stopLineEntry. В
этом случае вам нужно будет увеличить длину пути trackEntry и отодвинуть
дальше элемент Точка ж/д пути stopLineEntry от начальной точки
ж/д пути.

Локомотив подъезжает к составу, состоящему
из вагонов, чтобы сцепиться с ним.

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

Задание
3. Создаем типы вагонов
Как вы, должно быть, уже видели в окне
работающей модели, созданной на предыдущем шаге, вагоны в нашей модели
отличались исключительно цветом. Шаг 3 будет посвящен созданию различных типов
вагонов.
AnyLogic предоставляет удобный Мастер
создания типа вагона. Просто укажите имя нового типа вагона и выберите фигуру
анимации из списка готовых 3D объектов.
 Задайте
типы вагонов
1.
Создайте
новый Тип вагона, перетащив элемент Тип вагона из палитры Железнодорожная
библиотека на графическую диаграмму Main.

2.
Откроется
окно Мастера Создание агентов. Укажите Имя нового типа как Locomotive,
оставьте опцию Создать новый тип агента «с нуля» выбранной. Нажмите Далее.

3.     Выберите
Locomotive 14.1m в качестве его фигуры анимации в 3D режиме.

3.
Добавьте
еще 5 типов вагонов таким же образом. Назовите их BoxCar, OpenCar,
GondolaCar, TankCar и HopperCar. Выберите
соответствующие 3D фигуры анимации для каждого типа вагона: Крытый вагон,
Открытый вагон, Полувагон, Цистерна, Хоппер.
4.
Таким
же образом создайте тип поезда (перетащив элемент Тип поезда из палитры Железнодорожной
библиотеки). Назовите его Train.
Разнообразьте вагоны поезда
Давайте зададим алгоритм инициализации
поезда, который будет использовать вагон типа Locomotive (локомотив) в
качестве первого вагона состава, а следующие за ним вагоны будут выбираться случайным
образом из остальных типов вагонов, заданных нами на прошлом шаге.
1.
Перетащите
элемент Функция из палитры Агент на диаграмму Main,
назовите эту функцию carSetup и измените ее свойства следующим образом:

Эта функция будет вызываться для создания
вагонов нашего состава (в блоке TrainSource). Она будет возвращать вагон
одного из указанных типов.
В функции есть один аргумент: index (типа
int). Мы будем использовать его для передачи этой функции индекса только что
созданного вагона. Индекс первого вагона 0, поэтому условие if функции index ==
0 верно, соответственно, выполняется строка return new Locomotive(); (мы
указали, что первым вагоном всегда будет локомотив), после чего выполнение
функции будет завершено.
Для вагонов с индексами 1, 2, ... условие
if неверно, поэтому выполняется оператор switch. Этот оператор проверяет
значение целочисленной переменной (ее значение равномерно распределено от 1 до
5, включительно) и создает новый вагон одного из наших пяти типов вагонов, в
зависимости от этого значения (если оно равно 1, будет создан тип OpenCar и так
далее).
Оператор switch
Оператор switch позволяет выбирать,
какую из секций кода нужно выполнить, исходя из того, какому значению равно
заданное выражение.
В нашем примере, оператор return используется
вместо break, потому что мы находимся в теле функции.

Синтаксис

Пример

switch(
  <целочисленное выражение> ) {
case <целочисленная константа 1>:
      <код, выполняемый, если выражение равно константе 1>
    break;
case <целочисленная константа 2>:
      <код, выполняемый в случае 2>
    break;
  …
default:
      <код, выполняемый в других случаях>
      break;
  }

int month;
String
  season;
switch( month
  ) {
case 1:    season = “winter”;
          break;
case 2:    season = “winter”;
          break;
case 3:    season = “spring”;
          break;

  ...

    case 11:    season =
  “autumn”;         break;
case 12:    season = “winter”;
        break;
default:    season = “invalid value”; break;
  }

Внесите
изменения в свойства блока TrainSource
Давайте
укажем блоку trainSource, чтобы он создавал поезда нашего типа Train:
1.
В
поле Новый поезд выберите Train

2.
В
Поле Новый вагон введите carSetup(carindex)
Переключитесь к полю для введения кода,
щелкнув по иконке, которая сменится на, позволив написать
Java код в поле:

Мы
вызываем функцию carSetup, чтобы задать тип создаваемого вагона поезда. Когда
блок TrainSource создает новый поезд, он последовательно вызывает
функцию, указанную в поле Новый вагон, для каждого вагона поезда.
Используя локальную переменную carindex, мы передаем индекс только что
созданного вагона в функцию. В результате, у нас будет поезд с локомотивом в
качестве первого вагона, за которым следуют десять вагонов созданных нами
типов.
Наблюдайте
за моделью в 3D режиме
1.
Добавьте
3D окно из палитры Презентация и поместите его под диаграммой
процесса и анимацией.

2.
Запустите
модель и нажмите на кнопку  Показать область. Выберите из
выпадающего списка пункт [window3d], чтобы переключиться в режим 3D
просмотра. Теперь вы видите поезд, который начинается с локомотива, за которым
следуют десять вагонов других типов.

Если у вас возникнут проблемы с
отображением текстур 3D объектов, выключите шейдеры в настройках AnyLogic.

Задание
4. Моделируем сортировку вагонов
Теперь давайте промоделируем процесс
сортировки вагонов и их распределения на разные пути согласно их типу.
Нарисуйте
дополнительные ж/д пути
1.
Нарисуйте
дополнительно несколько ж/д путей, как показано на рисунке ниже. На этих путях
будет происходить накопление вагонов, на каждом пути будут собираться вагоны определенного
типа. Чтобы нарисовать подобную топологию ж/д путей, необходимо вначале
нарисовать несколько длинных путей, ведущих до самого конца сортировочного
парка, и уже затем от некоторых из них рисовать ответвления.

2.    Присвойте путям
осмысленные имена: trackN1 ... trackN6.

3.
Добавьте
элемент Точка ж/д пути на каждый путь назначения (всего шесть штук).
Назовите их stopLineN1, ... stopLineN6. Таким образом, мы задаем
линию остановки для каждого пути. Вагоны, которые катятся вниз под действием
силы земного притяжения, будут останавливаться у этих точек.

Задайте логику
диаграммы процесса
Поезд,
прибывающий на сортировочную станцию, может содержать несколько вагонов одного
и того же типа, расположенных друг за другом. Такие вагоны могут быть
отправлены на свой путь все вместе.
1.
Добавьте
Функцию, которая будет подсчитывать количество следующих одним за другим
вагонов одного типа в поезде, который находится на горке. Назовите ее carsOfSameType
и измените ее свойства следующим образом:

2.     Создайте еще одну Функцию
и назовите ее departurePointOnTrack.
Она будет определять путь назначения для
вагонов в сортировочном парке (представляющем собой пути, где сортируются
вагоны определенного типа).
Эта функция использует поезд как аргумент,
затем проверяет тип первого вагона поезда (так как обычно поезд и состоит всего
лишь из одного вагона).
Мы находим тип вагона с помощью оператора
Java instanceof. Он возвращает true, если объект является единицей
заданного класса.
В итоге, функция возвращает элемент Точка
ж/д пути, который зависит от типа вагона.
Внесите в свойства следующие изменения:

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

            Настройте Переменную:

Назовите ее trackReadyToDepart.

Выберите Другой в выпадающем списке Тип. В появившемся справа
поле выберите RailwayTrack.
Добавьте
блоки в диаграмму процесса

1.
Блок
TrainDecouple расцепляет вагоны, когда поезд находится на горке. Поезд
может содержать несколько вагонов одного типа, следующих друг за другом. Такие
вагоны откатываются на свой путь назначения сразу же. (Мы определяем, сколько
вагонов нужно откатить, функцией carsOfSameType, созданной на предыдущем
шаге). Путь назначения задается созданной нами функцией departurePointOnTrack.

Укажите следующее в свойствах блока TrainDecouple:

    Количество вагонов для отцепления: carsOfSameType(train)

    Новый поезд: Train
2.     Имеется короткая
задержка перед тем, как поезд продолжит расцепляться.

    Укажите следующее в свойствах блока Delay:

    Время задержки: 5 секунд
3.
Теперь
мы должны определить, содержит ли поезд еще вагоны, которые можно отцепить.
Этим занимается блок SelectOutput. Мы проверяем, содержит ли поезд еще
хоть один вагон (помните, что и сам локомотив считается вагоном). Если это так,
то поезд снова поступает в блок TrainDecouple. Цикл повторяется до тех
пор, пока поезд не содержит только локомотив, готовый покинуть станцию.

    Укажите следующее в свойствах блока SelectOutput:

    Выход true выбирается: при выполнении условия

    Условие: agent.size() > 1
4.     Не забудьте
присоединить правый порт блока SelectOutput к входному порту блока trainMoveTo4,
чтобы вернуть поезд на горку.
 Промоделируйте,
как привезший разнородный состав локомотив покидает станцию

1.
Мы
снова будем использовать блок TrainMoveTo, чтобы промоделировать
движение локомотива. В качестве точки назначения мы укажем нижний путь (trackN6).

    Укажите следующее в свойствах блока TrainMoveTo:

    Маршрут: Вычисляется автоматически…

    Цель движения: Заданное смещение на пути

    Путь: trackN6

    Крейсерская скорость: 5 м/с
2.     В конце концов,
локомотив удаляется из модели блоком TrainDispose.
Задайте логику
скатывания вагонов на пути сортировочного парка
Промоделируйте скатывание вагонов на свои
пути назначения в сортировочном парке под действием силы земного притяжения (пути,
где вагоны сортируются).

1.
Движение,
как обычно, моделируется блоком TrainMoveTo. Поезд содержит отдельные
вагоны или сцепленные вагоны одного типа. Назначение задается функцией departurePointOnTrack,
которую мы указали ранее.

    Укажите следующее в свойствах блока TrainMoveTo:

    Маршрут: Вычисляется автоматически…

    Цель движения: Заданная точка пути

    Точка ж/д пути: departurePointOnTrack(train)

    Крейсерская скорость: 5 м/с

    При окончании движения: Затормозить и остановиться
2.
Если
на пути назначения уже есть какие-то вагоны, то они комбинируются вместе с
только что прибывшими вагонами в блоке TrainCouple.
3.
Вагоны
продолжают соединяться, пока не будет достигнуто определенное количество
вагонов на пути (тогда локомотив приезжает туда и забирает вагоны со станции).
Блок SelectOutput проверяет, когда сбор вагонов можно прекратить. Мы
указываем, что количество собранных вагонов должно быть меньше 8.

    Укажите следующее в свойствах блока SelectOutput:

    Выход true выбирается: при выполнении условия

    Условие: agent.size() < 8
Добавьте
логику отправления готового поезда, собранного из вагонов однго типа, со
станции

1.     Сначала мы
сцепляем вагоны с локомотивом при помощи блока TrainCouple (логику
поведения локомотива мы зададим на следующем шаге).
2.     Затем поезд
покидает станцию (это моделируется блоком TrainMoveTo).
Укажите
следующее в свойствах блока TrainMoveTo:
Маршрут: Не задан (поезд будет следовать согласно стрелкам)
Цель движения: Не задана
3.     В конце концов, мы
удаляем поезд из модели блоком TrainDispose.
Добавьте
логику локомотива, забирающего готовые к отправке вагоны
Сейчас
мы смоделируем, как локомотивы забирают со станции готовые поезда, составленные
из вагонов одного типа.

1.
Сначала
давайте добавим блок TrainSource, моделирующий прибытие локомотива.
Поезд состоит только из одного вагона (сам локомотив). Выберите ручной режим
создания поездов – вызовами функции inject(), так как этот блок будет
создавать поезда, только когда новый поезд готов отправиться со станции.
Локомотив должен появиться на пути, заданном переменной trackReadyToDepart
(мы определяем путь - значение этой переменной - на следующем шаге).
Укажите
следующее в свойствах блока TrainSource:
Имя: newLoco
Поезда прибывают согласно: Вызовам метода inject()
Кол-во вагонов (включая локомотив): 1
Точка входа задается как: Смещение на пути
Путь: trackReadyToDepart
Смещение: от начала пути
Смещение первого вагона: tracklength - 15 метров
Новый поезд: Train
Новый вагон: Locomotive
2.
Этот
блок проверяет, имеется ли достаточное количество вагонов одного типа на пути
или еще нет.
Укажите
следующее в свойстве При выходе (false) секции Действия блока SelectOutput:
            trackReadyToDepart
= agent.getTrack( true );

    newLoco.inject();
Действие При выходе (false) выполняется,
когда появляется требуемое количество вагонов. Строка trackReadyToDepart =
agent.getTrack(true); получает текущий путь, на ктоторм скопились готовые к
отправке вагоны, и записывает его в локальную переменную trackReadyToDepart.
Строка newLoco.inject(); генерирует новый локомотив в блоке newLoco.
Когда локомотив создан, он следует к блоку, который мы создаем далее.
3.
Блок
TrainMoveTo моделирует движение локомотива к готовым к отправке вагонам.
Обратите внимание на направление его движения – Назад (локомотив
движется в направлении, обратном направлению пути, справа налево). Затем
локомотив сцепляется с вагонами, и получившийся поезд проходит ту часть
диаграммы процесса, которая моделирует отправление поезда с сортировочной
горки.
Укажите
следующее в свойствах блока TrainMoveTo:
Направление движения: Назад
Маршрут: Не задан (поезд будет следовать согласно стрелкам)
Цель движения: Не задана
Крейсерская скорость: 10 м/с
В
итоге, ваша диаграмма должна выглядеть так:

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

Мы завершили решение небольшой задачи,
типовой для железнодорожной библиотеки AnyLogic. Чаще эта библиотека
используется не для моделирования железнодорожных сетей целых регионов, а
моделирует именно определенные участки - грузовые или пассажирские ж/д узлы.

СПИСОК ЛИТЕРАТУРЫ
1.     Карпов,
Ю. Г. Имитационное моделирование систем. Введение  в моделирование с AnyLogic 5
/ Ю. Г. Карпов. Санкт-Петербург : БХВ Петербург, 2006. 400 с.

ПРИЛОЖЕНИЯ
ПРИЛОЖЕНИЕ 1
Элементы
библиотеки Enterprise Library

Source

Назначение:
Генерация заявок на вход СМО.
Класс заявки: по умолчанию Entitity.

Методы:
void inject(int
n). Создает n заявок.
int count(). Возвращает
количество заявок, созданных объектом.

Свойства:
int arrivalType (Способ
генерации заявок). Заявки могут пребывать следующими способами:
С заданной интенсивностью.
Интенсивность эквивалентна экспоненциальному закону распределения времени между
прибытиями заявок со средним значением, равным 1/интенсивность.
Путем задания времени между
прибытиями заявок. Время между двумя последовательными прибытиями определяется
заданным выражением. Этот режим рекомендуется использовать для периодической
генерации заявок или для генерации заявок с интервалами времени, не подчиняющихся
экспоненциальному закону распределения.
int entitiesPerArrival. Количество
заявок, прибывающих за один раз. Свойство доступно, если заявки прибывают
согласно интенсивности или по времени между прибытиями. Значение по умолчанию
равно одной заявке.
Фигура анимации заявки. Фигура
анимации, с помощью которой заявки, создаваемые этим объектом, будут
отображаться на презентации.
double rate (Интенсивность
прибытия заявок). Свойство доступно, если заявки прибывают согласно
интенсивности. Значение по умолчанию равно 1.
Entity newEntity (Новая
заявка). Значение по умолчанию равно new Entity()
void onExit (Действие
при выходе). Код, выполняемый при генерации заявки в канал СМО.

Queue

Назначение:
Моделирование очереди заявок.

Методы:
int size(). Возвращает
количество заявок, находящихся в данный момент в очереди.
boolean canEnter() . Возвращает true, если в
очередь может быть добавлена еще одна заявка.

Свойства:
int capacity (Емкость
очереди).
boolean enableTimeout (Разрешить
уход по таймауту).
double timeout (Таймаут).
void onExitTimeout (Действие
при уходе по таймауту).
boolean enablePreemption (Разрешить
вытеснение).
double priority (Приоритет
заявки).
void onExitPreempted (Действие
при вытеснении).
void onEnter (Действие
при входе). Код, выполняемый, когда заявка поступает в объект.
void onExit (Действие
при выходе). Код, выполняемый, когда заявка покидает объект.

Delay

Назначение:  Моделирование
процессора обслуживания.

Методы:
int size(). Возвращает
количество заявок, задерживаемых объектом в текущий момент времени.
boolean canEnter() . Возвращает true, если
объект может принять еще одну заявку.

Свойства:
int capacity. Вместимость
объекта Delay. Задает максимальное количество заявок, которое может одновременно
находиться в объекте. Значение по умолчанию равно одной заявке.
void onEnter (Действие
при входе). Код, выполняемый, когда заявка поступает в объект.
void onExit (Действие
при выходе). Код, выполняемый, когда заявка покидает объект.
double delayTime (Время
задержки заявки).
Service

Назначение:
Моделирование очереди с
процессором обслуживания с учетом использованных ресурсов.

Методы:
int queueSize() . Возвращает
количество заявок во вложенном объекте Queue.
int delaySize(). Возвращает
количество заявок во вложенном объекте Delay.

Свойства:
int quantity (Количество
ресурсов). Выражение, вычисляющее количество ресурсов, необходимое текущей
заявке. Значение по умолчанию равно одному.
void onEnterDelay (Действие
при начале задержки). Код, выполняемый, когда заявка поступает во вложенный
объект Delay.
ResourcePool resourcePool (Объект
ResourcePool). Выражение, возвращающее имя объекта ResourcePool, задающего
ресурсы, которые требуются заявке. Если поле пусто, или если выражение будет
возвращать null, то будут использоваться ресурсы объекта
ResourcePool, соединенного с портом access этого
объекта Service. Значение по умолчанию null.
int quantity (Количество
ресурсов, захваченных заявкой).
double delayTime (Время
задержки, вычисленное для заявки)
Объект поддерживает свойства
«Действие при входе», «Действие при выходе».

ResourcePool

Назначение:
Моделирование ресурсов.

Методы:
int idle(). Возвращает
количество свободных ресурсов.
int busy(). Возвращает
количество занятых ресурсов.

Свойства:
boolean unitsAreObjects (Ресурсы
моделируются). Определяет, как моделируются ресурсы: как индивидуальные объекты
или просто как их количество. Значение по умолчанию: «Как индивидуальные
объекты (true)». Если ресурсы выделяются в виде количества их нельзя отобразить
на презентации.
int capacity (Количество
ресурсов). Свойство доступно если количество ресурсов задано напрямую. Значение
по умолчанию равно одному.

Seize

Назначение:
Моделирование очереди с
захватом для заявки заданного количества ресурсов определенного типа. При
захвате ресурса заявка мгновенно покидает этот объект. Освободить ресурс можно
с помощью объекта Release. Все захваченные ресурсы должны быть
освобождены до того, как заявка будет уничтожена с помощью объекта Sink.
Методы:
Int size() – возвращает
количество заявок во вложенном объекте Queue.
T get( int index ) – возвращает
заявку, находящуюся в очереди в позиции с номером index (ближайшая
к выходу из очереди позиция имеет номер 0).
T remove( T entity ) – извлекает
заявку entity из очереди и возвращает ее. Если такой заявки в очереди обнаружено
не будет, метод вернет null.

Свойства:
int quantity (Количество
ресурсов). Выражение, вычисляющее количество ресурсов, необходимое текущей
заявке. Значение по умолчанию равно одному.
void onEnter (Действие
при входе) Код, выполняемый, когда заявка поступает в объект.
void onExit (Действие
при выходе). Код, выполняемый, когда заявка покидает объект.
ResourcePool
resourcePool (Объект ResourcePool). Выражение, возвращающее имя объекта
ResourcePool, задающего ресурсы, которые требуются заявке. Если поле пусто, или
если выражение будет возвращать null, то будут использоваться
ресурсы объекта ResourcePool, соединенного с портом access этого объекта
Seize. Значение по умолчанию null.
int capacity (Вместимость
очереди). Параметр виден, если не выбрана опция Максимальная вместимость.
Вместимость вложенной очереди queue. Значение по умолчанию: 100

Release

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

Свойства:
int releaseAll (Освобождать).
Определяет, будет ли этот объект освобождать Указанные ресурсы, Все
захваченные ресурсы данного типа или Все захваченные ресурсы (любого
типа).
Значение по умолчанию: Указанные
ресурсы (Release.SPECIFIED)
Локальная переменная: Release.SPECIFIED, Release.ALL_OF_POOL, Release.ALL.
int quantity (Количество
ресурсов). Виден, если объект будет Освобождать Указанные ресурсы.
Выражение, вычисляющее количество ресурсов, которое необходимо освободить
текущей заявке. Если количество ресурсов равно нулю, то наличие ресурсов не
проверяется (может ни быть соединен объект ресурсов, ни указано его имя в поле Объект
ResourcePool, т.e. там будет значение null), при этом заявка будет просто
проходить через объект.
Значение по умолчанию: -1 (при
отрицательном значении будут освобождаться все ресурсы заданного типа).
ResourcePool resourcePool (Объект
ResourcePool). Выражение, возвращающее имя объекта ResourcePool, задающего
ресурсы, которые требуется освободить. Если Вы оставите поле
пустым, или если выражение будет возвращать null, то
будут использоваться ресурсы объекта ResourcePool, соединенного
с портом access этого объекта Release.
Значение по умолчанию: null.

SelectOutput

Назначение:
Используется для выбора канала
СМО при моделировании.

Свойства:
boolean
conditionIsProbabilistic (Выход
true выбирается). Определяет, как будет
производиться маршрутизация заявок: будут ли заявки направляться на
выход true (верхний порт outT) при выполнении условия, заданного в поле «Условие» или же случайно
с заданной вероятностью, определенной в поле «Вероятность [0..1]». boolean
condition (Условие). Свойство доступно, если выход true выбирается
при выполнении условия. Условие, вычисляемое для входящей заявки. Если оно
выполняется (равно true), то заявка покидает объект через порт outT, если
нет - через порт outF. Значение по умолчанию randomTrue(0.5) просто
разделяет поток заявок на две равные части.
code onEnter (Действие
при входе). Код, выполняемый, когда заявка поступает в объект. Синтаксис:
code onExitTrue (Действие
при выходе true). Код, выполняемый, когда заявка покидает объект через порт outT.
code onExitFalse (Действие
при выходе false).
Код, выполняемый, когда заявка
покидает объект через порт outF.

Sink

Назначение:
Уничтожение заявок, после их
выхода из канала СМО.

Метод:
int count() – возвращает
количество заявок, уничтоженных объектом Sink.

Свойства:
void onEnter (Действие при входе). Код, выполняемый при
поступлении заявки в объект.

Скачано с www.znanio.ru

file_name: Методические указания по выполнению практических работ Имитационное моделирование.doc

alt: МИНИСТЕРСТВО КУЛЬТУРЫ РОССИИ

alt: СОДЕРЖАНИЕ ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

alt: Практическая работа №1 Тема:

alt: Задания к практической работе

alt: Вариант 8 Вариант 9 Вариант 10

alt: Цель: - изучение возможностей

alt: Рисунок 6 – Точечная диаграмма

alt: Рисунок 13 - Линейная трендовая модель

alt: Рисунок 16 - Степенная трендовая модель

alt: Рисунок 18 - Расчет ошибки Для оценки точности прогноза рассчитывают следующие показатели: 1

alt: Более 50% Неудовлетворительная 1

alt: Рисунок 21 - Расчет сезонной компоненты

alt: Рисунок 26 - Оценка точности прогноза

alt: Рисунок 1 – Создание новой модели 1

alt: Рисунок 5 – Запуск презентации

alt: Capacity ); задайте время обслуживания (свойство delayTime )

alt: Рисунок 11 - Диаграмма моделируемого процесса 1)

alt: Рис. 12. 1) Перейдите в окно свойств объекта service

alt: Измените свойства блока sink

alt: Треугольное 1/1 2 ± 2 1 1 2

title: Имитационное моделирование