Имитационное моделирование
Оценка 4.7

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

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

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

 

Федеральное государственное бюджетное образовательное учреждение высшего образования

«ТЮМЕНСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ КУЛЬТУРЫ»

Кафедра информатики и информационных технологий

 

 

 

 

 

 

 

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

 

Методические указания по выполнению практических работ

для студентов направления:

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. Создайте новую модель

  1. Щелкните мышью по кнопке панели инструментов Создать . Появится диалоговое окно Новая модель.
  2. Задайте имя новой модели. В поле Имя модели введите 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. Добавьте в Д