На дежурстве находятся n1 средств связи (СС) n2 типов (n21 + n22 + … + n2n2 = n2) в течение n3 часов.
Каждое СС может в любой момент времени выйти из строя. Интервалы времени T21, T22, …, T2n2 между отказами СС, находящимися на дежурстве, случайные. В случае выхода из строя СС заменяют резервным, причем либо сразу, либо по мере появления исправного СС. Тем временем, вышедшее из строя СС ремонтируют, после чего содержат в качестве резервного или направляют его на дежурство. Всего количество резервных СС - n4.
Ремонт неисправных СС производят n5 мастеров. Время T1, T2, …, Tn2 ремонта случайное и зависит от типа СС, но не зависит от того, какой мастер это СС ремонтирует.
Прибыль от СС, находящихся на дежурстве, составляет S1 денежных единиц в час. Почасовой убыток при отсутствии на дежурстве одного СС - S2, …, S2n2 денежных единиц в час. Оплата мастера за ремонт неисправного СС - S31, S32, …, S3n2 денежных единиц в час соответственно.
Затраты на содержание одного резервного СС составляют S4 денежных единиц в час.
Разработать имитационную модель бизнес-процесса предоставления услуг по средствам связи в течение 1000 часов.
Исследовать влияние на ожидаемую прибыль различного количества резервных СС и мастеров.
Определить абсолютные величины и относительные коэффициенты ожидаемой прибыли.
Сделать выводы об использовании СС, мастеров и необходимых мерах по совершенствованию системы предоставления услуг связи.
Уясним задачу на разработку модели, предварительно представив структуру системы предоставления услуг связи (Рис. 5.1) как систему СМО.
(рис 5.1) Система предоставления услуг связи как СМО
Система предоставления услуг связи (далее система связи) представляет собой многофазную многоканальную систему массового обслуживания замкнутого типа с отказами.
Таким образом, модель системы связи должна состоять из следующих сегментов (Рис. 5.2):
(рис 5.2) Концептуальная схема модели системы связи
Заявки как средства связи, поступившие на дежурство, должны иметь следующие параметры (поля):
tipCC - код типа СС;
timeOtkaz - среднее время между отказами СС;
timeMeanRem - среднее время ремонта одного СС;
nach - время начала ремонта в ремонтном подразделении;
nach1 - время начала дежурства.Возьмём, например, $$n_2=5$$. Код типа СС в виде чисел 1, 2, 3, 4, 5 определяется в самом начале моделирования и остаётся неизменным. Для его определения используются следующие исходные данные:
KCC1 … KCC5 - количество СС первого … пятого типов соответственно;
KCCР1 … KCCР5 - количество резервных СС первого … пятого типов соответственно.По этим же данным определяются количества всех СС по типам KolCC1 … KolCC5, а также общее количество СС всех типов KolCC.
В параметр timeOtkaz заносится интенсивность выхода из строя соответствующего типа СС. Интенсивность рассчитывается по средним значениям интервалов выхода из строя СС первого … пятого типов timeOtkaz1 … timeOtkaz5.
В параметр timeMeanRem заносится интенсивность ремонта соответствующего типа СС. Интенсивность рассчитывается по средним значениям времени ремонта СС соответственно первого … пятого типов timeRem1 … timeRem5.
Рассчитанные интенсивности, например, timeOtkaz = 1/timeOtkaz1 используются для обращения к генератору exponential(timeOtkaz).
Параметры nach1 и nach изменяются при каждом поступлении СС на дежурство и в ремонтное подразделение соответственно. Они используются при расчётах дохода от дежурства и затрат на ремонт неисправного СС. В них заносится время начала дежурства и начала ремонта соответственно.
Кроме рассмотренных, СС имеют еще следующие параметры (не заносимые в дополнительные поля заявок, имитирующих СС):
doxDegCC1 … doxDegCC5 - доход от дежурства одного СС первого … пятого типов соответственно;
zatrResCC1 … zatrResCC5 - затраты на содержание резерва одного СС первого … пятого типов соответственно;
stoimRem1 … stoimRem5 - стоимость ремонта одного СС первого … пятого типов соответственно.В ходе моделирования, а также по завершении моделирования рассчитываются:
PribCC1 … PribCC5, SumPribil - абсолютные величины ожидаемой прибыли по каждому типу СС и в целом;
KoefPribCC1 … KoefPribCC5, KoefPribil - относительные коэффициенты ожидаемой прибыли по каждому типу СС и в целом.Рассмотрим вычисление этих показателей на примере PribCC1 и KoefPribCC1.
Предполагается, что максимальный доход DoxMaxCC1 от дежурства будет в случае, когда все СС первого типа будут постоянно находиться на дежурстве, то есть:
DoxMaxCC1= KCC1*doxDegCC1*ВремяРабСист
где ВремяРабСист - время работы моделируемой системы.
Фактический доход DoxDegCC1 от дежурства СС первого типа составит:
DoxDegCC1+=(time()-entity.nach1)* main.doxDegCC1;
где (time()-entity.nach1) - время нахождения СС первого типа на дежурстве.
При отсутствии на дежурстве СС первого типа убыток составит:
UbitokCC1=(1-degCC1.statsUtilization.mean())* main.ubitokCC1*ВремяРабСист*KCC1;
где (1-degCC1.statsUtilization.mean()) - средний коэффициент отсутствия СС первого типа на дежурстве за всё время моделирования.
Затраты на ремонт неисправных СС и содержание резервных СС первого типа составят соответственно:
ZatrRemCC1+=(time()-entity.nach)*stoimRemCC1; ZatrResCC1= KCCP1*zatrResCC1* ВремяРабСист
Абсолютная величина ожидаемой прибыли составит:
PribCC1=DoxDegCC1-(ZatrRemCC1+ZatrRemCC1+UbitokCC1).
Относительный коэффициент прибыли равен:
KoefPribCC1=PribCC1/DoxMaxCC1.
Показатели в целом за систему связи:
SumPribil=SumDoxDeg-(SumZatrRes+SumZatrRem+SumUbitok), KoefPrib=SumPrib/SumDoxMax,
где SumDoxMax, SumDoxDeg, SumZatrRes, SumZatrRem, SumUbitok - соответствующие доходы и затраты за систему.
Сегмент предназначен для имитации поступления основных и резервных СС всех типов и постановки их на дежурство.
Файл/Создать/Модель на панели инструментов. Появится диалоговое окно Новая модель.
Имя модели введите Система_связи. Выберите каталог для сохранения файлов модели.
Готово.Исходные данные разделим и разместим там, где они, по нашему мнению, нужны и их удобно использовать.
Организуйте ввод исходных данных для сегмента Постановка на дежурство.
Палитре выделите Презентация. Перетащите элемент Область просмотра. Перейдите на панель Свойства.
Имя: введите Исходные_данные_ПД.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Местоположение и размер. Введите в поля X: 0, Y: 500, Ширина: 450, Высота: 340.
Местоположение и размер. Введите в поля X: 0, Y: 500, Ширина: 450, Высота: 340.
(рис 5.3) Размещение элементов Параметр и Переменная
Прямоугольник на элемент Область просмотра.
Местоположение и размер. Введите в поля X: 20, Y: 520, Ширина: 390, Высота: 300.
text и на странице Текст в поле text введите Исходные_данные_ПД (здесь ПД - постановка на дежурство).
Палитре выделите Основная. Перетащите элементы Параметр и Переменная на элемент с именем Исходные_данные_ПД и разместите их так, как показано на Рис. 5.3.
Простые переменные с именами KolCC1…KolCC5 - количество СС по типам, а KolCC - количество СС всех типов. Эти переменные мы будем вычислять по исходным значениям КСС1 … КСС5 и КССР1 … КССР5 и использовать при генерации равного значению КolСС заявок, имитирующих СС. Количество СС изменять можно только перед началом моделирования, так как заявки, имитирующие СС, генерируются только один раз.
| Имя | Тип | Значение по умолчанию | Отображать имя |
|---|---|---|---|
| KolCC1 | int | 0 | Установить флажок во всех элементах |
| KolCC2 | int | 0 | |
| KolCC3 | int | 0 | |
| KolCC4 | int | 0 | |
| KolCC5 | int | 0 | |
| KolCC | int | 0 | |
| NumCC | int | 0 | |
| doxdegCC1 | double | 20 | |
| doxdegCC2 | double | 24,2 | |
| doxdegCC3 | double | 32,8 | |
| doxdegCC4 | double | 23 | |
| doxdegCC5 | double | 25,5 | |
| zatrResCC1 | double | 21 | |
| zatrResCC2 | double | 24,2 | |
| zatrResCC3 | double | 28 | |
| zatrResCC4 | double | 26 | |
| zatrResCC5 | double | 25,5 | |
| ubitokCC1 | double | 32 | |
| ubitokCC2 | double | 34,2 | |
| ubitokCC3 | double | 37 | |
| ubitokCC4 | double | 31 | |
| ubitokCC5 | double | 32,5 |
Создайте область просмотра на диаграмме класса Main для размещения объектов сегмента Постановка на дежурство.
Презентация перетащите элемент Область просмотра.
Свойства в поле Имя: введите постановка.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Местоположение и размер. Введите в поля X: 0, Y: 0, Ширина: 700, Высота: 350.
Скруглённый прямоугольник. Оставьте имя, предложенное системой. В нём мы разместим объекты сегмента Постановка на дежурство.
Местоположение и размер. Введите в поля X: 38, Y: 62, Ширина: 642, Высота: 268.
Область просмотра мы уже перетащили Скругленный прямоугольник. На нём мы будем размещать, как отмечалось ранее, объекты сегмента Постановка на дежурство.
text и на панели Свойства в поле Текст: введите Постановка на дежурство. Поместите этот текст посредине в верхней части элемента Скругленный прямоугольник.
Прямоугольник на Область просмотра. На странице Местоположение и размер введите в поля X: 50, Y: 100, Ширина: 170, Высота: 140.
text на Прямоугольник и на панели Свойства в поле Текст: введите Имитация поступления СС.
source на Прямоугольник. Для записи и хранения параметров СС в поля заявок необходимо создать нестандартный тип агента. Создайте тип агента ComFacility.
Проекты Щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
Новый Java класс. В поле Имя: введите имя нового класса ComFacility.
Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щёлкните Далее.
Мастера создания Java класса. Добавьте следующие поля Java класса:
tipCC int; timeMeanRem double; nach double; nach1 double; timeOtkaz double;
Создать конструктор и Создать метод toString ().
Готово. Закройте редактор кода.
Проект только что созданный Java класс и в контекстном меню выберите Преобразовать Java класс в тип агента.
ComFacility. Закройте его.
source.
Свойства уберите флажок Отображать имя.
Тип заявки: и Новая заявка: Agent замените ComFacility. Установите:Прибывают согласно Интенсивности.
Интенсивность прибытия 1
Ограниченное количество прибытий установите флажок
Максимальное количество прибытий 1На странице Действия в поле При выходе: введите Java код:
KolCC1=degurstvo.KCC1+degurstvo.KCCP1; degurstvo.DoxMaxCC1= round((degurstvo.KCC1*doxDegCC1)*ВремяРабСист*100); degurstvo.DoxMaxCC1=degurstvo.DoxMaxCC1/100; degurstvo.ZatrResCC1= round((degurstvo.KCCP1*zatrResCC1)*ВремяРабСист*100); degurstvo.ZatrResCC1=degurstvo.ZatrResCC1/100; KolCC2=degurstvo.KCC2+degurstvo.KCCP2; degurstvo.DoxMaxCC2= round((degurstvo.KCC2*doxDegCC2)*ВремяРабСист*100); degurstvo.DoxMaxCC2=degurstvo.DoxMaxCC2/100; degurstvo.ZatrResCC2= round((degurstvo.KCCP2*zatrResCC2)*ВремяРабСист*100); degurstvo.ZatrResCC2=degurstvo.ZatrResCC2/100; KolCC3=degurstvo.KCC3+degurstvo.KCCP3; degurstvo.DoxMaxCC3= round((degurstvo.KCC3*doxDegCC3)*ВремяРабСист*100); degurstvo.DoxMaxCC3=degurstvo.DoxMaxCC3/100; degurstvo.ZatrResCC3= round((degurstvo.KCCP3*zatrResCC3)*ВремяРабСист*100); degurstvo.ZatrResCC3=degurstvo.ZatrResCC3/100; KolCC4=degurstvo.KCC4+degurstvo.KCCP4; degurstvo.DoxMaxCC4= round((degurstvo.KCC4*doxDegCC4)*ВремяРабСист*100); degurstvo.DoxMaxCC4=degurstvo.DoxMaxCC4/100; degurstvo.ZatrResCC4= round((degurstvo.KCCP4*zatrResCC4)*ВремяРабСист*100); degurstvo.ZatrResCC4=degurstvo.ZatrResCC4/100; KolCC5=degurstvo.KCC5+degurstvo.KCCP5; degurstvo.DoxMaxCC5= round((degurstvo.KCC5*doxDegCC5)*ВремяРабСист*100); degurstvo.DoxMaxCC5=degurstvo.DoxMaxCC5/100; KolCC=KolCC1+KolCC2+KolCC3+KolCC4+KolCC5; degurstvo.ZatrResCC5= round((degurstvo.KCCP5*zatrResCC5)*ВремяРабСист*100); degurstvo.ZatrResCC5=degurstvo.ZatrResCC5/100; degurstvo.SumDoxMax=degurstvo.DoxMaxCC1+ degurstvo.DoxMaxCC2+degurstvo.DoxMaxCC3+ degurstvo.DoxMaxCC4+degurstvo.DoxMaxCC5; degurstvo.SumZatrRes=degurstvo.ZatrResCC1+ degurstvo.ZatrResCC2+degurstvo.ZatrResCC3+ degurstvo.ZatrResCC4+degurstvo.ZatrResCC5;
Введённым кодом определяется количество СС всех типов, включая и резервные средства связи. Эти данные необходимы в последующем в объекте split. Количества СС как исходные данные будут размещены на агенте Degyrstvo, который мы создадим позже, поэтому в коде используется доступ к ним в виде, например, degyrstvo.KCC1.
Кодом рассчитываются также максимальный доход от каждого типа СС и суммарный максимальный доход, а также затраты на содержание резервных СС по типам и суммарные затраты на содержание резервных СС всех типов.
Такой подход к расчётам максимального дохода и затрат на содержание резервных СС принят для экономии машинного времени, поскольку эти показатели зависят только от продолжительности времени моделирования (ВремяРабСист), дохода от дежурства одного СС и затрат на содержание одного резервного СС. То есть данные для их расчёта не носят стохастический характер. Поэтому указанные показатели целесообразно рассчитать здесь, а затем использовать в конце моделирования при обработке накопленных статистических данных.
Для вывода результатов моделирования с двумя знаками после запятой использовался метод round(). Предварительно результат умножался на 100, а потом делился на эту же величину. Например:
degyrstvo.DoxMaxCC1= round((degyrstvo.KCC1*doxDegCC1)*ВремяРабСист*100); degyrstvo.DoxMaxCC1=degyrstvo.DoxMaxCC1/100;
split и sink (Рис. 5.4).
split. Установите свойства как на Рис. 5.5. Так как копии не унаследуют свойств от оригинала, поэтому на странице Действия в поле При выходе копии: введите Java код:
(рис 5.4) Добавлены объекты split и sink
NumCC++; if (NumCC <= KolCC) entity.tipCC = 5; if (NumCC <= (KolCC1+KolCC2+KolCC3+KolCC4)) entity.tipCC = 4; if (NumCC <= (KolCC1+KolCC2+KolCC3)) entity.tipCC = 3; if (NumCC <= (KolCC1+KolCC2)) entity.tipCC = 2; if (NumCC <= KolCC1) entity.tipCC = 1;
Переменная NumCC предназначена для последовательного счёта СС всех типов. Она используется для определения принадлежности СС к соответствующему типу и занесения кода этого типа СС в поле entity.tipCC, например, entity.tipCC = 5, который необходим для нормального функционирования модели, то есть отличия СС по типам.
sink уничтожает заявку-оригинал.
(рис 5.5) Объект split с установленными свойствами
Блок Распределитель средств связи предназначен для распределения СС согласно их типам, т. е. общее количество поступивших СС он должен разделить по типам.
Данный блок реализуется четырьмя объектами selectOutput и одним объектом queue (Рис. 5.6). Возможна реализация этого блока и одним объектом selectOutput5 совместно также с объектом queue.
Объект queue предназначен для приема, хранения и отправки на дежурство исправных СС, поступающих из ремонта.
selectOutput и один объект queue из Библиотеки моделирования процессов на диаграмму агента Main. Соедините их так, как показано на Рис. 5.6.
Свойства свойства объектов selectOutput согласно Табл. 5.2 (при использовании объекта selectOutput5 условия разделения СС по типам останутся такими же).
(рис 5.6) Добавлены объекты SelectOutput и queue
| Имя | Отображать имя | Тип заявки: | Выход true выбирается | Условие |
|---|---|---|---|---|
| СС1 | Установите флажки | ComFacility | При выполнении условия | entity.tipCC==1 |
| СС2 | ComFacility | entity.tipCC==2 | ||
| СС3 | ComFacility | entity.tipCC==3 | ||
| СС4 | ComFacility | entity.tipCC==4 |
false элемента СС4, поэтому пятый объект selectOutput не нужен.
queue и не устанавливайте флажок Отображать имя.
Вместимость 100 и на странице Специфические установите флажок Включить сбор статистики.
Презентация три элемента text и в соответствующих полях Текст: введите текст, как на Рис. 5.6.На Рис. 5.7 показан в окончательном виде сегмент Постановка на дежурство после добавления блока На дежурство. Для добавления этого блока, который должен выполнять "связь" между сегментом Постановка на дежурство и сегментом Имитация дежурства, создадим новый тип агента. Экземпляром этого типа агента и будет нужный нам объект - блок На дежурство.
(рис 5.7) Сегмент Постановка на дежурствоПроекты Щёлкните правой кнопкой мыши Main, с которым вы работаете в данный момент, и выберите из контекстного меню Создать/Тип агента.
Шаг 1. Создание нового типа агента.
Не использовать шаблоны типов агентов.
Имя нового агента: Degurstvo.
Описание: введите описание сущности, моделируемой этим типом агента.
Готово.Создайте область просмотра на типе агента Degurstvo для размещения элементов сегмента Имитация дежурства.
Палитре выделите Презентация. Перетащите элемент Область просмотра.
Свойства.
Имя: введите дежурство.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Местоположение и размер. Введите в поля X: 40, Y: 0, Ширина: 730, Высота: 420.Созданный новый тип агента Degyrstvo является вложенным объектом. Как вы помните, нам нужно сделать так, чтобы СС передавались на дежурство в сегмент Имитация дежурства из сегмента Постановка на дежурство, а отремонтированные СС после ремонта из сегмента Имитация дежурства возвращались в сегмент Постановка на дежурство.
Прямоугольник. На панели Свойства оставьте флажки Исключить и Отображается на верхнем уровне.
Местоположение и размер. Введите в поля X: 110, Y: 130, Ширина: 100, Высота: 180.
Основная и разместите так, как показано на Рис. 5.8. Для всех элементов Порт оставьте только флажок Отображается на верхнем уровне.
(рис 5.8) Добавлены на Degyrstvo шесть портов
Проекты перетащите экземпляр типа агента Degyrstvo, и соедините так, как на Рис. 5.7. При этом следует иметь в виду, что положение портов на экземпляре типа агента Degyrstvo изменить нельзя. Это можно сделать лишь на самом типе агента.Организуйте ввод исходных данных для сегмента Имитация дежурства.
Отображается на верхнем уровне.Область просмотра. Перейдите на панель Свойства. В поле Имя: введите исходные_данные_Д.
Выравнивать по: Верхн. левому углу.
Подогнать под окно.
Местоположение и размер введите в поля X: 40, Y: 800, Ширина: 650, Высота: 240.
Прямоугольник. На нём мы разместим элементы для ввода исходных данных.
Местоположение и размер. Введите в поля X: 50, Y: 840, Ширина: 620, Высота: 190.
text и на панели Свойства в поле Текст: введите Исходные_данные_Д (здесь Д - дежурство).
Параметр на элемент с именем Исходные_данные_Д и разместите их так, как показано на Рис. 5.9. При копировании целесообразно указать имя первого элемента и его тип, например, KCC1, int. Значения по умолчанию нужно установить потом для каждого элемента своё.
Свойства каждого элемента Параметр установите свойства согласно Табл. 5.3.
(рис 5.9) Размещение элементов Параметр для ввода данных
| Имя | Тип | Значение по умолчанию | Отображать имя |
|---|---|---|---|
| KCC1 | int | 55 | Установить флажок во всех элементах |
| KCC2 | int | 100 | |
| KCC3 | int | 60 | |
| KCC4 | int | 45 | |
| KCC5 | int | 60 | |
| KCCР1 | int | 2 | |
| KCCР2 | int | 4 | |
| KCCР3 | int | 4 | |
| KCCР4 | int | 3 | |
| KCCР5 | int | 4 | |
| stoimRemCC1 | double | 17 | |
| stoimRemCC2 | double | 18 | |
| stoimRemCC3 | double | 16 | |
| stoimRemCC4 | double | 20 | |
| stoimRemCC5 | double | 21 | |
| timeRem1 | double | 6,5 | |
| timeRem2 | double | 4,2 | |
| timeRem3 | double | 2,8 | |
| timeRem4 | double | 3 | |
| timeRem5 | double | 5,5 | |
| timeOtkaz1 | double | 373 | |
| timeOtkaz2 | double | 301 | |
| timeOtkaz3 | double | 482 | |
| timeOtkaz4 | double | 325 | |
| timeOtkaz5 | double | 470 | |
| kol_master | int | 3 | |
| КолПрогон | double | 1000 | |
| ВремяРабСист | double | 1000 |
Здесь выводятся все результаты моделирования (Рис. 5.10). Однако с целью экономии машинного времени, выводятся они по разному. Рассчитанные ранее максимальные доходы от дежурства СС и затраты на содержание резервных СС не выводятся в ходе моделирования. Выводятся только текущие доходы от дежурства СС и текущие затраты на ремонт неисправных СС. Все обработанные результаты выводятся по окончании моделирования. Для организации вывода используется способ Событие (см. п. 5.1.7).
(рис 5.10) Элементы Переменная для вывода результатов моделирования
Область просмотра. Перейдите на панель Свойства. В поле Имя: введите текущие_результаты.
Выравнивать по: Верхн. левому углу.
Подогнать под окно.
Местоположение и размер введите в поля X: 40, Y: 430, Ширина: 730, Высота: 350.
Прямоугольник.
Свойства. Введите в поля X: 54, Y: 466, Ширина: 710, Высота: 300.
text и на панели Свойства в поле Текст: введите Затраты и Доходы соответственно.
Палитре выделите Основная. Перетащите, используя копирование, элементы Переменная. Разместите их, дайте имена, как показано на Рис. 5.10. У всех переменных установите флажки Отображать имя и тип double.Реализация событийной части сегмента показана на Рис. 5.11.
Скруглённый прямоугольник. На нём мы разместим все элементы сегмента Имитация дежурства.
Местоположение и размер панели Свойства введите в поля X: 60, Y: 50, Ширина: 600, Высота: 360.
Прямоугольник. На нём мы разместим элементы, непосредственно имитирующие дежурство СС.
Местоположение и размер введите в поля X: 250, Y: 60, Ширина: 170, Высота: 330.
Прямоугольник для размещения элементов, имитирующих ремонтное подразделение СС.
Местоположение и размер панели Свойства введите в поля X: 440, Y: 60, Ширина: 190, Высота: 330.
Degyrstvo последовательно: пять объектов queue, пять объектов delay, один объект queue, один объект delay и соедините их так, как показано на Рис. 5.11. При копировании используйте свойства каждого объекта, приведенные в Табл. 5.4. Кроме них также свойства, указанные в п. 9.
text и введите названия в соответствующие поля Текст: согласно Рис. 5.11.
(рис 5.11) Сегмент Имитация дежурства
| queue | ||
|---|---|---|
| Имя | Вместимость | Действия При выходе |
| резерв1 | KCCP1 | entity.timeOtkaz=1/timeOtkaz1 |
| резерв2 | KCCP2 | entity.timeOtkaz=1/timeOtkaz2 |
| резерв3 | KCCP3 | entity.timeOtkaz=1/timeOtkaz3 |
| резерв4 | KCCP4 | entity.timeOtkaz=1/timeOtkaz4 |
| резерв5 | KCCP5 | entity.timeOtkaz=1/timeOtkaz5 |
| очРем | Максимальная | |
| delay | ||
| Имя | Время задержки | Вместимость |
| degCC1 | exponential(entity.timeOtkaz) | KCC1 |
| degCC2 | exponential(entity.timeOtkaz) | KCC2 |
| degCC3 | exponential(entity.timeOtkaz) | KCC3 |
| degCC4 | exponential(entity.timeOtkaz) | KCC4 |
| degCC5 | exponential(entity.timeOtkaz) | KCC5 |
| remont | exponential(entity.timeMeanRem) | 3 |
| Имя | Действия При выходе | |
| degCC1 | DoxDegCC1+=(time()-entity.nach1)* main.doxDegCC1; | |
| entity.timeMeanRem=1/timeRem1; | ||
| degCC2 | DoxDegCC2+=(time()-entity.nach1)*main.doxDegCC2; | |
| entity.timeMeanRem=1/timeRem2; | ||
| degCC3 | DoxDegCC3+=(time()-entity.nach1)*main.doxDegCC3; | |
| entity.timeMeanRem=1/timeRem3; | ||
| degCC4 | DoxDegCC4+=(time()-entity.nach1)*main.doxDegCC4; | |
| entity.timeMeanRem=1/timeRem4; | ||
| degCC5 | DoxDegCC5+=(time()-entity.nach1)*main.doxDegCC5; | |
| entity.timeMeanRem=1/timeRem5; | ||
Тип заявки: Agent заменить ComFacility;
Включить сбор статистики;
delay degCC1 … degCC5 установить:Действие при входе entity.nach1=time();delay с именем remont также ввести Java коды в следующие свойства:Действие при входе entity.nach=time();
Действия При выходе
if (entity.tipCC == 1)
{ZatrRemCC1+=((time()-entity.nach)*stoimRemCC1);
SumZatrRem+=((time()-entity.nach)*stoimRemCC1);}
if (entity.tipCC == 2)
{ZatrRemCC2+=((time()-entity.nach)*stoimRemCC2);
SumZatrRem+=((time()-entity.nach)*stoimRemCC2);}
if (entity.tipCC == 3)
{ZatrRemCC3+=((time()-entity.nach)*stoimRemCC3);
SumZatrRem+=((time()-entity.nach)*stoimRemCC3);}
if (entity.tipCC == 4)
{ZatrRemCC4+=(time()-entity.nach)*stoimRemCC4;
SumZatrRem+=((time()-entity.nach)*stoimRemCC4);}
if (entity.tipCC == 5)
{ZatrRemCC5+=((time()-entity.nach)*stoimRemCC5);
SumZatrRem+=((time()-entity.nach)*stoimRemCC5);}Результаты моделирования выводятся в сегменте Имитация дежурства. Тем не менее, организуем вывод результатов моделирования, можно сказать, в более презентабельном виде. Для этого создадим сегмент Статистика (Рис. 5.12).
Статистика.
Область просмотра.
Свойства.
Имя: введите статистика.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Местоположение и размер введите в поля X: 0, Y: 1076, Ширина: 960, Высота: 630.
Прямоугольник.
Местоположение и размер введите в поля X: 20, Y: 1116, Ширина: 930, Высота: 580.
(рис 5.12) Сегмент Статистика
text и в поле Текст: введите Результаты моделирования. На странице Местоположение и размер введите в поля X: 360, Y: 1126.
text, разместите и введите в соответствующие поля Текст: надписи, как на Рис. 5.12. Например, при размещении надписи Максимальный доход по типам СС укажите в полях X: 100, Y: 1160, при размещении надписи Коэффициенты использования типов средств связи укажите в полях X: 280, Y: 1490, а при размещении надписи Затраты на содержание резервов по типам средств связи в полях X: 280, Y: 1440.Текстовое поле является простейшим текстовым элементом управления, позволяющим пользователю вводить небольшие объемы текста. Вы можете также связать этот элемент управления с переменной или параметром типа String, double или int. Мы будеи выводить в эти текстовые поля результаты моделирования.
Текстовое поле. При копировании используйте следующие рекомендации. Перетащите первый элемент Текстовое поле. В поле Имя: дайте ему имя editbox1.
Внешний вид в полях Шрифт: установите шрифт по своему усмотрению из выпадающего списка или оставьте предложенный, размер шрифта установите 14.
Местоположение и размер введите в поля X: 70, Y: 1210, Ширина: 80, Высота: 20.
editbox1. Вставьте ещё пять таких элементов. При вставке ориентируйтесь на клетки рабочего поля. Например, в данном случае между элементами по вертикали две клетки.
Текст, разместите номера типов СС 1…5. Шестому элементу введите имя Сумма.
Текстовое поле и сами элементы. Вставьте скопированное четыре раза.
Текстовое поле горизонтально как на Рис. 5.12.
Текстовое поле с именем editbox37. С использованием элемента Текст введите Коэффициент готовности системы связи.| 1 | 2 | 3 | 4 | 5 | Сумма |
|---|---|---|---|---|---|
| Максимальный доход по типам СС | |||||
| editbox1 | editbox2 | editbox3 | editbox4 | editbox5 | editbox6 |
| Доход от дежурства по типам СС и всего | |||||
| editbox7 | editbox8 | editbox9 | editbox10 | editbox11 | editbox12 |
| Стоимость ремонта по типам СС и всего | |||||
| editbox13 | editbox14 | editbox15 | editbox16 | editbox17 | editbox18 |
| Суммарная прибыль от использования СС и всего | |||||
| editbox19 | editbox20 | editbox21 | editbox22 | editbox23 | editbox24 |
| Коэффициенты прибыли по типам СС и всего | |||||
| editbox25 | editbox26 | editbox27 | editbox28 | editbox29 | editbox30 |
| Затраты на содержание резервов по типам СС и всего | |||||
| editbox31 | editbox32 | editbox33 | editbox34 | editbox35 | editbox36 |
С помощью диаграмм AnyLogic позволяет динамически визуализировать данные, собираемые в результате работы модели. Набор диаграмм схож с тем, что предлагается программой MS Excel. Библиотека обладает мощным и удобным интерфейсом, не требующим при создании диаграммы программирования.
Термин диаграмма используется для обозначения, как обычных диаграмм, так и гистограмм. Гистограммы отображают статистически обработанные данные в виде функции плотности вероятности (PDF) и интегральной функции распределения (CDF), учитывающие все когда-либо добавленные на гистограмму значения. Диаграммы отображают текущие значения элементов данных (а некоторые - также недавнюю историю изменения значений).
AnyLogic поддерживает несколько видов диаграмм.
Простые диаграммы:
Диаграммы с историей (временные диаграммы):
Используйте диаграмму с накоплением.
Диаграмма с накоплением показывает вклад нескольких элементов данных в суммирующий результат в виде столбцов, расположенных друг над другом. Высота каждого столбца пропорциональна значению соответствующего элемента данных.
Самый нижний столбец соответствует элементу данных, добавленному вами на диаграмму первым, затем добавленному вторым и т. д. Не допускается присутствие отрицательных значений - в этом случае возникнет ошибка. Вы можете изменить направление роста столбца и его ширину с помощью свойств Направление и Относительная ширина (они находятся на странице свойств Внешний вид).
Диаграмма с накоплением из палитры Статистика и разместите согласно Рис. 5.12.
Свойства установите: Масштаб: Фиксированный, Обновлять данные автоматически.
Внешний вид установите:Направление: вертикальное
Местоположение и размер введите в поля X: 40, Y: 1510, Ширина: 230, Высота: 180.
Легенда установите Высота: 20, Расположение сверху.
Область диаграммы введите в поля Смещение по оси X: 40, Смещение по оси Y: 10, Ширина: 60, Высота: 140.
Добавить элемент данных.
Заголовок: введите СС1.
Значение: введите Java код
degCC1.statsUtilization.mean()
Диаграмма с накоплением.
Заголовок: вставленных элементов внесите правки для получения имён СС2, СС3, СС4, СС5 соответственно.
Значение: вводите Java коды также для элементов 2…5 соответственно:
degCC2.statsUtilization.mean() degCC3.statsUtilization.mean() degCC4.statsUtilization.mean() degCC5.statsUtilization.mean()
На этом построение сегмента Статистика завершено.
Событие является самым простым способом планирования действий в модели. События часто используются для моделирования задержек и таймаутов. Вы можете сделать это и с помощью срабатывающих по таймауту переходов диаграмм состояний, но использование событий является более рациональным. В некоторых случаях поведение может быть смоделировано только с помощью таймеров.
Есть три типа событий.
Событие, происходящее по истечении таймаута. Оно используется тогда, когда Вам нужно запланировать выполнение какого-то действия на определенный момент времени (отстоящий на заданное количество времени (таймаут) от текущего момента). Событие, происходящее по истечению таймаута, предоставляет дополнительные возможности: вы можете сделать событие циклическим, либо же вообще управлять этим событием "вручную".
Событие, происходящее при выполнении заданного условия. Оно используется тогда, когда Вам нужно отслеживать выполнение определенного условия и производить какое-то действие при его происхождении.
Событие, происходящее с заданной интенсивностью. Оно используется для моделирования потока независимых событий (пуассоновский поток). Это часто требуется при моделировании поступления, например, заявок в системах массового обслуживания.
AnyLogic поддерживает еще один тип события, задаваемый уже другим модельным элементом - динамическое событие. Динамические события используются для планирования сразу нескольких одновременных и независимых событий. Например, канал связи, параллельно передающий произвольное количество сообщений, может быть смоделирован с помощью динамических таймеров, создаваемых для каждого сообщения.
Для вывода результатов моделирования воспользуйтесь событием, происходящим по истечении таймаута.
из палитры Основная на диаграмму размещения элементов Переменная для вывода результатов моделирования (Рис. 5.10). Измените его имя на РезультатыМоделирования. Нажмите Enter.
Отображать имя. С помощью выпадающего списка Tип события: выберите По таймауту.
Режим: Срабатывает один раз.
Время срабатывания (абсолютное) 1000000.
Действие введите Java код, который будет выполняться при появлении этого события.
//Расчет результатов по СС1 DoxDegCC1=round((DoxDegCC1/КолПрогон)*100); DoxDegCC1=DoxDegCC1/100; ZatrRemCC1=round((ZatrRemCC1/КолПрогон)*100); ZatrRemCC1=ZatrRemCC1/100; UbitokCC1=round((1-degCC1.statsUtilization.mean())*main.ubitokCC1*ВремяРабСист*KCC1*100); UbitokCC1=UbitokCC1/100; PribCC1=round((DoxDegCC1-(ZatrResCC1+ZatrRemCC1+UbitokCC1))*100); PribCC1=PribCC1/100; koefPribCC1=round((PribCC1/DoxMaxCC1)*1000); koefPribCC1=koefPribCC1/1000; //Расчет результатов по СС2 DoxDegCC2=round((DoxDegCC2/КолПрогон)*100); DoxDegCC2=DoxDegCC2/100; ZatrRemCC2=round((ZatrRemCC2/КолПрогон)*100); ZatrRemCC2=ZatrRemCC2/100; UbitokCC2=(1-degCC2.statsUtilization.mean())*main.ubitokCC2*ВремяРабСист*KCC2; PribCC2=round((DoxDegCC2-(ZatrResCC2+ZatrRemCC2+UbitokCC2))*100); PribCC2=PribCC2/100; koefPribCC2=round((PribCC2/DoxMaxCC2)*1000); koefPribCC2=koefPribCC2/1000; //Расчет результатов по СС3 DoxDegCC3=round((DoxDegCC3/КолПрогон)*100); DoxDegCC3=DoxDegCC3/100; ZatrRemCC3=round((ZatrRemCC3/КолПрогон)*100); ZatrRemCC3=ZatrRemCC3/100; UbitokCC3=(1-degCC3.statsUtilization.mean())* main().ubitokCC3*ВремяРабСист*KCC3; PribCC3=round((DoxDegCC3-(ZatrResCC3+ZatrRemCC3+UbitokCC3))*100); PribCC3=PribCC3/100; koefPribCC3=round((PribCC3/DoxMaxCC3)*1000); koefPribCC3=koefPribCC3/1000; //Расчет результатов по СС4 DoxDegCC4=round((DoxDegCC4/КолПрогон)*100); DoxDegCC4=DoxDegCC4/100; ZatrRemCC4=round((ZatrRemCC4/КолПрогон)*100); ZatrRemCC4=ZatrRemCC4/100; UbitokCC4=(1-degCC4.statsUtilization.mean())* main.ubitokCC4*ВремяРабСист*KCC4; PribCC4=round((DoxDegCC4-(ZatrResCC4+ZatrRemCC4+UbitokCC4))*100); PribCC4=PribCC4/100; koefPribCC4=round((PribCC4/DoxMaxCC4)*1000); koefPribCC4=koefPribCC4/1000; //Расчет результатов по СС5 DoxDegCC5=round((DoxDegCC5/КолПрогон)*100); DoxDegCC5=DoxDegCC5/100; ZatrRemCC5=round((ZatrRemCC5/КолПрогон)*100); ZatrRemCC5=ZatrRemCC5/100; UbitokCC5=(1-degCC5.statsUtilization.mean())* main.ubitokCC5*ВремяРабСист*KCC5; PribCC5=round((DoxDegCC5-(ZatrResCC5+ZatrRemCC5+UbitokCC5))*100); PribCC5=PribCC5/100; koefPribCC5=round((PribCC5/DoxMaxCC5)*1000); koefPribCC5=koefPribCC5/1000; //Расчет суммарных результатов SumDoxDeg=DoxDegCC1+DoxDegCC2+DoxDegCC3+ DoxDegCC4+DoxDegCC5; SumZatrRem=round((SumZatrRem)*100/КолПрогон); SumZatrRem=SumZatrRem/100; SumUbitok=UbitokCC1+UbitokCC2+UbitokCC3+ UbitokCC4+UbitokCC5; SumPribil=round((SumDoxDeg-(SumZatrRes+SumZatrRem+SumUbitok))*100); SumPribil=SumPribil/100; koefPribil=round((SumPribil/SumDoxMax)*1000); koefPribil=koefPribil/1000; //вывод максимального дохода, дохода от дежурства по типам СС и всего editbox1.setText(DoxMaxCC1); editbox7.setText(DoxDegCC1); editbox2.setText(DoxMaxCC2); editbox8.setText(DoxDegCC2); editbox3.setText(DoxMaxCC3); editbox9.setText(DoxDegCC3); editbox4.setText(DoxMaxCC4); editbox10.setText(DoxDegCC4); editbox5.setText(DoxMaxCC5); editbox11.setText(DoxDegCC5); editbox6.setText(SumDoxMax); editbox12.setText(SumDoxDeg); //вывод стоимости ремонта по типам СС и всего editbox13.setText(ZatrRemCC1); editbox14.setText(ZatrRemCC2); editbox15.setText(ZatrRemCC3); editbox16.setText(ZatrRemCC4); editbox17.setText(ZatrRemCC5); editbox18.setText(SumZatrRem); //вывод чистой прибыли от использования по типам СС и всего editbox19.setText(PribCC1); editbox20.setText(PribCC2); editbox21.setText(PribCC3); editbox22.setText(PribCC4); editbox23.setText(PribCC5); editbox24.setText(SumPribil); //вывод коэфициентов прибыли по типам СС и всего editbox25.setText(koefPribCC1); editbox26.setText(koefPribCC2); editbox27.setText(koefPribCC3); editbox28.setText(koefPribCC4); editbox29.setText(koefPribCC5); editbox30.setText(koefPribil); //вывод затрат на содержание резервов по типам СС и всего editbox31.setText(ZatrResCC1); editbox32.setText(ZatrResCC2); editbox33.setText(ZatrResCC3); editbox34.setText(ZatrResCC4); editbox35.setText(ZatrResCC5); editbox36.setText(SumZatrRes); //вывод коэфициента готовности системы связи КоэфГотСС=(degCC1.statsUtilization.mean()+ degCC2.statsUtilization.mean()+ degCC3.statsUtilization.mean()+ degCC4.statsUtilization.mean()+ degCC5.statsUtilization.mean())/КолТипСС; editbox37.setText(КоэфГотСС);
Из кода следует, что по окончании моделирования, которое длится 1 000 000 единиц модельного времени, сработает метод событие, будут рассчитаны и выведены результаты моделирования.
Для округления результатов моделирования (коэффициентов прибыли до трех знаков после запятой, а абсолютных величин прибыли и затрат - до двух знаков) использован метод round(). Предварительно результат умножался на 1000 и 100, а потом делился на эти же величины.
Для вывода результатов моделирования в текстовые поля editbox используется функция setText(), в качестве аргумента которой указывается имя элемента Переменная, например,
editbox1.setText(DoxMaxCC1);
Мы не акцентировали внимание при построении модели на элементах презентации, которые вы уже видели на некоторых рисунках, для переключения между областями просмотра. Если вы не добавляли их, добавьте и укажите свойства согласно Табл. 5.6.
Синим цветом выделены элементы презентации, предназначенные для перехода по щелчку к соответствующим областям просмотра. Чёрным цветом выделены элементы презентации без перехода к каким-либо областям просмотра.
| Элемент презентации | Действие по щелчку |
|---|---|
| Постановка на дежурство (Рис. 5.7) | |
| Имитация дежурства. Текущие результаты | degurstvo.дежурство.navigateTo(); |
| Статистика | degurstvo.статистика.navigateTo(); |
| Исходные данные | исходные_данные_ПД.navigateTo(); |
| Исходные данные ПД (Рис. 5.3) | |
| Постановка на дежурство | постановка.navigateTo(); |
| Имитация дежурства (Рис. 5.11) | |
| Постановка на дежурство | main.постановка.navigateTo(); |
| Статистика | статистика.navigateTo(); |
| Исходные данные | исходные_данные_Д.navigateTo(); |
| Исходные данные Д (Рис. 5.9) | |
| Постановка на дежурство | main.постановка.navigateTo(); |
| Имитация дежурства | дежурство.navigateTo(); |
| Статистика | статистика.navigateTo(); |
| Текущие результаты (Рис. 5.10) | |
| Постановка на дежурство | main.постановка.navigateTo(); |
| Имитация дежурства | дежурство.navigateTo(); |
| Статистика | статистика.navigateTo(); |
| Статистика (Рис. 5.12) | |
| Постановка на дежурство | main.постановка.navigateTo(); |
| Имитация дежурства | дежурство.navigateTo(); |
| Текущие результаты | текущие_результаты.navigateTo(); |
| Исходные данные | исходные_данные_Д.navigateTo(); |
В ходе построения модели вы можете совершить различные ошибки. Мы же остановимся на одной их тех, которая требует хороших знаний или "тонкостей" AnyLogic.
Запустите модель. Ошибка, о которой мы говорим, появится практически сразу после запуска (Рис. 5.13 и 5.14).
В Библиотеке моделирования процессов реализован pull-протокол передачи заявок между объектами. Суть заключается в том, что следующий объект "вытягивает" заявку из предыдущего объект, если он может её принять. Это работает для объектов, которые могут держать в себе заявку некоторое время. Для примера рассмотрим следующую диаграмму процесса:
...-> split -> selectOutput -> queue -> delay ->...
В этом случае объекты, которые заявка проходит насквозь (split и selectOutput), просматриваются объектами queue и delay, чтобы оценить возможность прохода заявки.
(рис 5.13) Сообщение об ошибке
Если объекты могут принять заявку, они мгновенно "вытягивают" её, вследствии чего код в поле При выходе копии объекта split, который был нами ранее введён (см. Рис. 5.5) не выполняется. Это приводит к некорректной маршрутизация заявок в модели.
Поясним это. На Рис. 5.14 видно, что 64 заявки, соответствующие типу СС1, проходят не через свой выход true, а через выход false как заявки, соответствующие типу СС5. Это может быть только в том случае, когда в поле entity.tipCC ничего не заносится, то есть при неработающем коде в поле При выходе копии объекта split.
Для выполнения некоторых действий заявки, когда она проходит через какое-то место диаграммы процесса, в данном случае перед попаданием в selectOutput, но уже после выхода из split, можно использовать объект plain Transfer. В него вы можете вписать код для действий заявки, который был ранее записан в поле При выходе копии объекта split.
split и входом объекта selectOutput.
Библиотеке моделирования процессов откройте Местоположение и размер.
plain Transfer и соедините его вход с выходом копии объекта split, а выход - со входом объекта selectOutput. Замените тип заявки на ComFacility.
При выходе копии объекта split перепишите в поле При подходе ко входу: объекта plain Transfer.Запустите модель. На Рис. 5.15 и Рис. 5.16 показаны результаты моделирования.
(рис 5.14) Остановка модели по ошибке
(рис 5.15) Результаты моделирования
(рис 5.16) Результаты моделирования в сегменте Статистика
AnyLogic предоставляет пользователю возможность провести следующие эксперименты:
Последние пять экспериментов доступны только в AnyLogic Professional.
Простой эксперимент запускает модель с заданными значениями параметров, поддерживает режимы виртуального и реального времени, анимацию, отладку модели.
При создании модели автоматически создается один простой эксперимент, названный Simulation. Именно такой эксперимент мы с вами и рассматривали до сих пор.
Эксперимент этого типа используется в большинстве случаев. Другие эксперименты нужны тогда, когда важную роль играют значения параметров модели. То есть вам нужно проанализировать, как они влияют на поведение или эффективность моделируемой системы или если вам нужно найти оптимальные параметры вашей модели.
Далее в рамках данного пособия мы остановимся на доступных в версии AnyLogic University экспериментах оптимизации и варьирования переменных, овладев методиками проведения которых, вы самостоятельно сможете выполнять в AnyLogic Professional и другие эксперименты.
Начиная создавать модель в AnyLogic, мы ничего не говорили об экспериментах и особенностях их проведения. Поэтому все исходные данные разместили на Исходные_данные_ПД (Рис. 5.3) и Исходные_данные_Д (Рис. 5.9) так, как нам представлялось удобным для построения модели и управления ею в ходе проведения простого эксперимента.
При проведении эксперимента и наличии в модели, как у нас, вложенных объектов, нужно связывать параметры корневого объекта и вложенных объектов, так как изменять в ходе эксперимента можно только параметры корневого объекта. В результате связывания значение параметра любого уровня вложенного объекта будет равно значению параметра объекта самого верхнего уровня.
Но следует иметь в виду, что связываются только параметры одного типа и что передача значения параметра производится лишь параметру объекта, находящемуся ниже уровнем в иерархическом дереве модели. То есть связываются параметры последовательно от одного уровня к другому, а не через уровень или уровни.
Разместите элементы, как показано на Рис. 5.17. Внесите соответствующие изменения в модель. Обратите внимание на различие имён связываемых параметров, например, КССР_1.
Свяжите параметры корневого типа агента Main с параметрами вложенного объекта типа агента Degyrstvo.
Свойства. В таблице Параметры в поле Значение введите имя параметра типа агента-владельца Main, значение которого нужно передавать параметру вложенного объекта. В результате у вас должно быть так, как на Рис. 5.18.
(рис 5.17) Размещение элементов на Исходные_данные_ПД
(рис 5.18) Фрагмент страницы Параметры после связывания параметров
Эксперимент Оптимизация может проводиться в AnyLogic оптимизатором OptQuest для детерминированных и стохастических моделей.
Наша модель Система связи стохастическая. Создайте оптимизационный эксперимент стохастической модели с целью определения максимального коэффициента прибыли в зависимости от количества резервных СС и мастеров-ремонтников.
Проект Щёлкните правой кнопкой мыши элемент модели Система_связи и из контекстного меню выберите Coздать/ Эксперимент. В появившемся диалоговом окне из списка Тип эксперимента: выберите Оптимизация (Рис. 5.19).
(рис 5.19) Диалоговое окно Новый эксперимент
Имя: введите имя эксперимента, например, Система_связи_Оптимизация1. Имя эксперимента должно начинаться с заглавной буквы - правило названия классов в Java.
Агент верхнего уровня: выберите Main. Этим действием вы задали корневой (главный) класс эксперимента. Объект этого класса будет играть роль корня иерархического дерева объектов модели, запускаемой оптимизационным экспериментом.
Копировать установки модельного времени из: и выберите эксперимент из расположенного справа выпадающего списка. В данном случае оставьте, так как есть: Simulation.
Готово. Появится страница Основные панели Свойства (Рис. 5.20).
максимизировать.
Целевая функция введите root.degurstvo.koefPribil.
Случайность установите Фиксированное начальное число (воспроизводимые прогоны).
Начальное число введите 5672.
Количество итераций:. Под итерацией понимается один опыт (одно наблюдение). Количество итераций - это цель стратегического планирования эксперимента - определение количества наблюдений и уровней факторов в них для получения полной и достоверной информации о модели.
где $$k_i$$ - число уровней i-го фактора, $$i=\overline{1,m}$$.
КССР_1…КССР_5 и количество мастеров-ремонтников Kol_master, то есть всего m=6 факторов. Факторы имеют следующие уровни: $$k_1=3, k_2=k_3=k_4=6, k_5=k_6=5$$. Тогда число итераций
$$I=k_1\cdot k_2 \cdot k_3 \cdot k_4 \cdot k_5 \cdot k_6 \cdot = 3 \cdot 6 \cdot 6 \cdot 6 \cdot 5\cdot 5 = 16200.$$
(рис 5.20) Вкладка Основные оптимизационного эксперимента
Количество итераций:, так как данная версия AnyLogic ограничена этим количеством итераций.
Тип. Выберите тип параметра, отличный от значения фиксированный. Так как параметр KCCР_1 целочисленный типа int, выберите дискретный.
Мин. минимальное значение 1, в ячейку Макс. максимальное значение, например, для КССР1, 3. Так как параметр дискретный, в ячейке Шаг укажите величину шага 1.
Репликации панели Свойства.
Использовать репликации.
где $$t_\alpha =1,96$$ - табулированный аргумент функции Лапласа.
Возможность переменного количества репликаций позволяет оптимизатору OptQust проверять на статистическую значимость разницу между средним значением целевой функции в текущей итерации и лучшим значением, найденным за предыдущие итерации (лучшее значение). Целью такой проверки является удаление худших решений без потери времени на их получение. Таким образом, процесс может быть ускорен за счёт прекращения поиска неподходящих решений вместо выполнения заданного максимального количества репликаций модели.
Репликации выберите опцию Фиксированное количество репликаций и в поле Количество репликаций за итерацию: установите рассчитанное число репликаций (прогонов) модели 4.
Основные. Щёлкните кнопку Создать интерфейс. После щелчка удаляется содержимое презентации эксперимента и создаётся интерфейс эксперимента заново (Рис. 5.21) согласно его текущим установкам (набору оптимизационных параметров и их свойствам и т. д.). Поэтому создавать интерфейс нужно только после окончания задания параметров эксперимента. На интерфейсе видны знаки вопросов напротив оптимизационных параметров.
(рис 5.21) Интерфейс оптимизационного эксперимента
(рис 5.22) Результаты первого оптимизационного эксперимента
Система_связи / Система_связи_Оптимизация1.
Запустить. Начнёт выполняться эксперимент, в ходе которого можно видеть на графике изменения значения целевой функции. После 200*4=800 прогонов (Рис. 5.22) эксперимент остановится.
KCCP_1 = KCCP_2 = KCCP_4 = KCCP_5 = Kol_master =1, KCCP_3 = 6.Создайте и проведите второй оптимизационный эксперимент при тех же условиях с целью определения коэффициента готовности системы связи.
При размещении параметров для ввода исходных данных и последующем их связывании мы не задумывались над тем, как они будут размещены на страницах свойств и тем более в интерфейсе оптимизационного эксперимента.
Но теперь нас не устраивает то, что оптимизируемые параметры размещены последними в интерфейсе первого оптимизационного эксперимента (Рис. 5.20, 5.21, 5.22). Предположим, что нам не нужны на рисуне все параметры модели, а нужны только оптимизируемые.
Разместите оптимизируемые параметры в верхних частях страниц свойств соответствующих объектов.
Предв. просмотр параметров.
КССР_1 и, щёлкая по верхней стрелке, расположенной справа от поля параметра, переместите его в верхнюю часть страницы свойств (Рис. 5.23).
КССР_2… КССР_5 и Kol_master. У вас должно быть так, как на Рис. 5.24.
Degurstvo. На панели свойств откройте страницу Предв. просмотр параметров.
КССР1…КССР5 и kol_master в верхнюю часть страницы свойств.
(рис 5.23) Перемещение параметра на странице предварительного просмотра
(рис 5.24) Оптимизируемые параметры перемещены в верхнюю часть страницы свойств типа агента Main
Итак, второй оптимизационный эксперимент проводится при тех же условиях, что и первый оптимизационный эксперимент.
Проект Щёлкните правой кнопкой мыши элемент модели Система_связи и из контекстного меню выберите Coздать/Эксперимент. В диалоговом окне из списка Тип эксперимента: выберите Оптимизация.
Имя: введите Система_связи_Оптимизация2 имя эксперимента.
Целевая функция введите: root.degurstvo.КоэфГотСС
Случайность установите Фиксированное начальное число (воспроизводимые прогоны).
Начальное число введите 5672.
Репликации выберите опцию Фиксированное количество репликаций и в поле Количество репликаций за итерацию: установите число репликаций (прогонов) модели 4.
Создать интерфейс. Обратите внимание, что оптимизируемые параметры расположены вверхней части. Запустите модель.
В результате второго эксперимента (Рис. 5.25) наилучшее значение целевой функции - коэффициент готовности системы связи равен 0,813. Получен он на 35-й итерации при следующих оптимальных значениях параметров: KCCP_1 = KCCP_2 =1, KCCP_3 = KCCP_4 = 6, KCCP_5 = 5, Kol_master = 5.
KCCP_1…KCCP_5 и Kol_master на Исходные_данные_ПД на значения, полученные в первом оптимизационном эксперименте.
KCCP_1…KCCP_5 и Kol_master на Исходные_данные_ПД на значения, полученные во втором оптимизационном эксперименте.
(рис 5.25) Результаты второго оптимизационного эксперимента
Эксперимент Варьирование параметров может проводиться только для детерминированных моделей.
Создайте эксперимент Варьирование параметров для стохастической модели Система_связи с целью наблюдения за изменением коэффициента готовности в зависимости от количества резервных СС и мастеров-ремонтников.
Проект Щёлкните правой кнопкой мыши элемент модели Система_связи и из контекстного меню выберите Создать эксперимент.
Тип эксперимента: выберите Варьирование параметров.
Имя введите имя эксперимента, например, Система_связи_Вар_параметров.
Готово. Появится страница Параметры панели Свойства (Рис. 5.26).
Параметры по сравнению с оптимизационным экспериментом отсутствуют опции минимизировать, максимизировать, Количество итераций. Последнее определяется AnyLogic в зависимости от диапазонов и шагов изменения параметров. Не используются и репликации, по
Тип. Выберите тип параметра, отличный от значения фиксированный. Параметр КССР_1 типа int, поэтому он может изменяться в диапазоне. Выберите Диапазон. В ячейку Мин введите минимальное значение 1, в ячейку Макс - максимальное значение 3, в ячейке Шаг укажите величину шага 1.
Основные и щёлкните кнопку Создать интерфейс.
Варьирование параметров в отличие от эксперимента Оптимизация интерфейс создаёт пользователь. Связано это с тем, что выходными результатами данного эксперимента могут быть любые показатели моделируемой системы.
(рис 5.26) Страница Параметры эксперимента варьирования параметров
График из палитры Статистика на диаграмму.
Местоположение и размер и установите:
X: 260, Y: 100, Ширина: 510, Высота: 400, Цвет фона: Нет заливки, Цвет границы: Нет линии.
Добавить элемент данных.
Набор данных. Заголовок: КоэфГотСС. Набор данных: dataset. Установите Не обновлять данные автоматически.
Область диаграммы. Установите: Смещение по Х: 50, Смещение по Y: 30, Ширина: 450, Высота: 330.
Статистика перетащите элемент Набор данных. Установите опцию Не обновлять автоматически.
Основная перетащите элемент Переменная. На панели Свойства в поле Имя: введите коэфГотСС. Установите Уровень доступа: public. Тип: double.
Действия Java панели Свойства и введите коды:Действие после прогона модели:
коэфГотСС = root.degurstvo.КоэфГотСС;
Действие после итерации
dataset.add(getCurrentIteration(),коэфГотСС);
Система_связи / Система_связи_Вар_параметров.
Запустить.
Варьирование параметров приведен на Рис. 5.28.
КССР_1=КССР_5 = kol_master =1, КССР_2= КССР_3=5, КССР_4=3.
(рис 5.27) Интерфейс эксперимента варьирования параметров
(рис 5.28) Фрагмент результатов выполнения эксперимента Варьирование параметров
Модели AnyLogic являются приложением Java, поэтому их можно запускать на большинстве современных платформ, а также помещать на веб-сайты в виде апплетов.
Наличие такой возможности позволяет удалённым пользователям запускать интерактивные модели в веб-браузере при отсутствии AnyLogic или какого-либо другого программного обеспечения. В этом случае на клиентской машине будут запускаться скопированные из сети файлы модели с такой же поддержкой интерактивной работы, что и при запуске из среды AnyLogic.
Экспортируйте модель ComSystem в виде Java апплета.
Экспорт/В Java апплет (запускается в веб браузере) из контекстного меню.
Экспорт модели (Рис. 5.29). Щелчком мыши раскройте список Экспортировать эксперимент и выберите в нем Simulation. Настройки этого эксперимента будут применены к экспортируемой модели.
Каталог для создаваемых файлов укажите каталог, в который вы хотите поместить файлы экспортируемой модели. Можно также выбрать каталог с помощью диалогового окна навигации, которое становится доступным при нажатии кнопки Выбрать.
Язык: <системный по-умолчанию>). При необходимости можно выбрать для интерфейса апплета другой язык из выпадающего списка Язык: (на данный момент AnyLogic поддерживает русский, английский, китайский, немецкий и итальянский языки).
(рис 5.29) Диалоговое окно Экспорт модели
(рис 5.30) Набор файлов Java апплет
Открыть апплет модели в веб браузере.
Готово. Откроется диалоговое окно, в котором будет сообщение об успешном завершении экспортирования модели ComSystem: Модель ComSystem была экспортирована в G:\BOEV.
OK.Модель, экспортированная как Java апплет, представляет собой набор следующих файлов (Рис. 5.30):
При публикации апплета модели в сети Интернет нужно предоставить доступ ко всем этим файлам из кода апплета. Это значит, что если вы добавляете ссылку на .html файл модели на веб страницу, то необходимо разместить все эти файлы в той же директории, где и этот .html файл. Для показа апплета на своей веб странице следует скопировать код апплета из .html файла модели в код своей страницы, и добавить все файлы, сгенерированные при экспорте модели, в тот же каталог, где находится ваша страница.
Запустите апплет модели, дважды щелкнув ComSystem.html. Результаты работы апплета модели показаны на Рис. 5.31. Коэффициент прибыли равен 0,949 (см. п. 5.1.8.3).
(рис 5.31) Результаты работы апплета модели ComSystem
Как уже отмечалось, система связи представляет собой многофазную многоканальную систему массового обслуживания замкнутого типа с отказами и ожиданием.
Какие ограничения в системе?
Для моделирования двух первых ограничений целесообразно использовать МКУ, а для третьего и четвертого ограничений - транзакты.
Модель системы связи должна состоять из следующих сегментов:
Сегмент переопределения блоков модели необходим для изменения версий модели, т. е. изменения количества резервных СС и мастеров-ремонтников в ремонтном подразделении, а также номеров строк и столбцов матриц, в которые записываются результаты моделирования. Количество переопределений в сегменте соответствует числу версий модели минус один.
Предполагается, что количество типов СС в системе предоставления услуг связи может изменяться от одного до максимального значения n2_. Программа модели, как уже омечалось при разработке AnyLogic-модели, построена для n2_ = 5.
Для хранения результатов моделирования используются матрицы. В целях придания неизменности программы модели при варьировании количеством типов СС матрицы должны быть пронумерованы. Однако GPSS World при описании матриц командой MATRIX не позволяет вместо имени указывать число. Матрицы нужно вначале описать, дав им имена, а затем пронумеровать.
Результаты моделирования для одного типа СС хранятся в семи матрицах, например, для СС типа 1 (СС1) с идентификаторами:
Prib1 - матрица ожидаемой прибыли СС1;
KPr1 - матрица коэффициентов прибыли СС1;
KZen1 - матрица коэффициентов использования СС1;
DoxMax1 - матрица максимальных доходов от СС1;
DoxDeg1 - матрица доходов от дежурства СС1;
ZatrRem1 - матрица затрат на ремонт СС1;
ZatrResSS1 - матрица затрат на резервные СС1.Значит, аналогичных матриц будет тридцать пять. Да плюс еще матрица KRem коэффициентов использования мастеров - ремонтников. Именам этим тридцати шести матрицам даны номера.
Три матрицы для хранения суммарных результатов моделирования для СС всех типов не нумеровались:
Pribil - матрица суммарной прибыли;
SrKPrib - матрица средних коэффициентов прибыли СС всех типов;
SrKIsp - матрица коэффициентов использования СС всех типов.Именам пяти МКУ СС1_, СС2_, СС3_, СС4_ и СС5_, имитирующим по типам СС, находящиеся на дежурстве, даны номера 1 … 5. Это позволяет сократить число блоков в модели за счет того, что вместо пяти (в данном варианте модели) сегментов имитации постановки на дежурство СС используется один сегмент.
Для записи исходных данных: количества СС всех типов (в том числе и резервных), среднего времени наработки на отказ и среднего времени восстановления по типам СС, дохода по типам от одного СС, находящегося на дежурстве, убытка по типам при отсутствии одного СС на дежурстве, стоимости по типам одного резервного СС используются функции KolSS, KollSSRes, NarOtk, SrVrRem, S1_, S2_, S3_ соответственно. Этот способ по сравнению со способом использования матриц для записи этих же данных позволяет сократить программу модели на двадцать пять строк.
В начале работы модели генератор сразу вырабатывает количество транзактов, равное соответствующему количеству типов СС, и перестает быть активным.
Далее блоками SAVEVALUE и ASSIGN в параметр 1 каждого из транзактов последовательно заносятся коды 1…n1_ - признак типа СС.
Затем каждый из транзактов с помощью блока SPLIT расщепляется (копируется, размножается) по количеству СС (с учетом резервных СС) соответствующего типа.
После расщепления транзакты в соответствии с типом СС сразу занимают все каналы МКУ, имитирующие нахождение СС на дежурстве. Резервные СС остаются в списках задержки соответствующих МКУ.
Вышедшее из строя СС снимается с дежурства, поступает в ремонтное подразделение - транзакт либо занимает свободный канал МКУ Rem, если такой есть, либо при отсутствии свободного канала помещается в список задержки этого МКУ - список транзактов, ожидающих возможность занять освободившиеся каналы МКУ.
После ремонта СС отправляется либо сразу на дежурство, либо в резерв. В обоих случаях транзакт направляется на метку Met1. Здесь также транзакт либо занимает свободный канал, либо помещается в список задержки МКУ, соответствующего типу СС.
Ниже приводится программа только (в целях сокращения) для моделирования случая три мастера-ремонтника, а резервных СС2 - четыре, пять и шесть.
; Модель функционирования системы связи ; Задание номеров матрицам Prib1 EQU 1 ; Матрица ожидаемой прибыли СС1 KPr1 EQU 2 ; Матрица коэффициентов прибыли СС1 KZen1 EQU 3 ; Матрица коэффициентов использования СС1 DoxMax1 EQU 4 ; Матрица максимальных доходов СС1 DoxDeg1 EQU 5 ; Матрица доходов от дежурства СС1 ZatrRem1 EQU 6 ; Матрица затрат на ремонт СС1 ZatrResSS1 EQU 7 ; Матрица затрат на резервные СС1 Prib2 EQU 8 ; Матрица ожидаемой прибыли СС2 KPr2 EQU 9 ; Матрица коэффициентов прибыли СС2 KZen2 EQU 10 ; Матрица коэффициентов использования СС2 DoxMax2 EQU 11 ; Матрица максимальных доходов СС2 DoxDeg2 EQU 12 ; Матрица доходов от дежурства СС2 ZatrRem2 EQU 13 ; Матрица затрат на ремонт СС2 ZatrResSS2 EQU 14 ; Матрица затрат на резервные СС2 Prib3 EQU 15 ; Матрица ожидаемой прибыли СС3 KPr3 EQU 16 ; Матрица коэффициентов прибыли СС3 KZen3 EQU 17 ; Матрица коэффициентов использования СС3 DoxMax3 EQU 18 ; Матрица максимальных доходов СС3 DoxDeg3 EQU 19 ; Матрица доходов от дежурства СС3 ZatrRem3 EQU 20 ; Матрица затрат на ремонт СС3 ZatrResSS3 EQU 21 ; Матрица затрат на резервные СС3 Prib4 EQU 22 ; Матрица ожидаемой прибыли СС4 KPr4 EQU 23 ; Матрица коэффициентов прибыли СС4 KZen4 EQU 24 ; Матрица коэффициентов использования СС4 DoxMax4 EQU 25 ; Матрица максимальных доходов СС4 DoxDeg4 EQU 26 ; Матрица доходов от дежурства СС4 ZatrRem4 EQU 27 ; Матрица затрат на ремонт СС4 ZatrResSS4 EQU 28 ; Матрица затрат на резервные СС4 Prib5 EQU 29 ; Матрица ожидаемой прибыли СС5 KPr5 EQU 30 ; Матрица коэффициентов прибыли СС5 KZen5 EQU 31 ; Матрица коэффициентов использования СС5 DoxMax5 EQU 32 ; Матрица максимальных доходов СС5 DoxDeg5 EQU 33 ; Матрица доходов от дежурства СС5 ZatrRem5 EQU 34 ; Матрица затрат на ремонт СС5 ZatrResSS5 EQU 35 ; Матрица затрат на резервные СС5 KRem EQU 36 ; Матрица коэффициентов использования Rem ; Задание номеров МКУ, имитирующих дежурство СС CC1_ EQU 1 ; Задание номера МКУ СС1 CC2_ EQU 2 ; Задание номера МКУ СС2 CC3_ EQU 3 ; Задание номера МКУ СС3 CC4_ EQU 4 ; Задание номера МКУ СС4 CC5_ EQU 5 ; Задание номера МКУ СС5 ; Задание по типам количества СС, находящихся на дежурстве n2_ EQU 5 ; Количество типов СС VrMod EQU 1000 ; Время моделирования, 1 ед. мод. вр. = 1 час KolProg EQU 1000 Stroka EQU 1 ; Номер строки матрицы Stolbez EQU 1 ; Номер столбца матрицы Prib1 MATRIX ,3,3 ; Матрица ожидаемой прибыли СС1 KPr1 MATRIX ,3,3 ; Матрица коэффициентов прибыли СС1 KZen1 MATRIX ,3,3 ; Матрица коэффициентов загрузки СС1 DoxMax1 MATRIX ,3,3 ; Матрица максимальных доходов СС1 DoxDeg1 MATRIX ,3,3 ; Матрица доходов от дежурства СС1 ZatrRem1 MATRIX ,3,3 ; Матрица затрат на ремонт СС1 ZatrResSS1 MATRIX ,3,3 ; Матрица затрат на резервные СС1 Prib2 MATRIX ,3,3 ; Матрица ожидаемой прибыли СС2 KPr2 MATRIX ,3,3 ; Матрица коэффициентов прибыли СС2 KZen2 MATRIX ,3,3 ; Матрица коэффициентов загрузки СС2 DoxMax2 MATRIX ,3,3 ; Матрица максимальных доходов СС2 DoxDeg2 MATRIX ,3,3 ; Матрица доходов от дежурства СС2 ZatrRem2 MATRIX ,3,3 ; Матрица затрат на ремонт СС2 ZatrResSS2 MATRIX ,3,3 ; Матрица затрат на резервные СС2 Prib3 MATRIX ,3,3 ; Матрица ожидаемой прибыли СС3 KPr3 MATRIX ,3,3 ; Матрица коэффициентов прибыли СС3 KZen3 MATRIX ,3,3 ; Матрица коэффициентов загрузки СС3 DoxMax3 MATRIX ,3,3 ; Матрица максимальных доходов СС3 DoxDeg3 MATRIX ,3,3 ; Матрица доходов от дежурства СС3 ZatrRem3 MATRIX ,3,3 ; Матрица затрат на ремонт СС3 ZatrResSS3 MATRIX ,3,3 ; Матрица затрат на резервные СС3 Prib4 MATRIX ,3,3 ; Матрица ожидаемой прибыли СС4 KPr4 MATRIX ,3,3 ; Матрица коэффициентов прибыли СС4 KZen4 MATRIX ,3,3 ; Матрица коэффициентов загрузки СС4 DoxMax4 MATRIX ,3,3 ; Матрица максимальных доходов СС4 DoxDeg4 MATRIX ,3,3 ; Матрица доходов от дежурства СС4 ZatrRem4 MATRIX ,3,3 ; Матрица затрат на ремонт СС4 ZatrResSS4 MATRIX ,3,3 ; Матрица затрат на резервные СС4 Prib5 MATRIX ,3,3 ; Матрица ожидаемой прибыли СС5 KPr5 MATRIX ,3,3 ; Матрица коэффициентов прибыли СС5 KZen5 MATRIX ,3,3 ; Матрица коэффициентов загрузки СС5 DoxMax5 MATRIX ,3,3 ; Матрица максимальных доходов СС5 DoxDeg5 MATRIX ,3,3 ; Матрица доходов от дежурства СС5 ZatrRem5 MATRIX ,3,3 ; Матрица затрат на ремонт СС5 ZatrResSS5 MATRIX ,3,3 ; Матрица затрат на резервные СС5 KRem MATRIX ,3,3 ; Матрица коэффициентов загрузки Rem Pribil MATRIX ,3,3 ; Матрица суммарной прибыли SrKPrib MATRIX ,3,3 ; Матрица коэффициентов прибыли СС всех типов SrKIsp MATRIX ,3,3 ; Матрица коэффициентов загрузки СС всех типов ; Определение МКУ по количеству СС, находящихся на дежурстве CC1_ STORAGE 55 ; Емкость МКУ по количеству СС1 CC2_ STORAGE 100 ; Емкость МКУ по количеству СС2 CC3_ STORAGE 60 ; Емкость МКУ по количеству СС3 CC4_ STORAGE 45 ; Емкость МКУ по количеству СС4 CC5_ STORAGE 60 ; Емкость МКУ по количеству СС5 Rem STORAGE 3 ; Емкость МКУ по числу мастеров-ремонтников ; Описание арифметических выражений DoxMax VARIABLE VrMod#FN$S1_#FN$KolSS ; Максимальный доход от дежурства СС Ubitok VARIABLE VrMod#FN$KolSS#(1-(SR*1/1000))#FN$S2_;Убыток от отсутствия на дежурстве СС DoxDeg VARIABLE (AC1-P$Nach1)#FN$S1_ ; Полученный доход от дежурства СС StoRem VARIABLE (AC1-P$Nach)#FN$StoMast ; Стоимость ремонта неисправных СС ZatrResSS VARIABLE FN$S3_#FN$KolSSRes#VrMod; Затраты на содержание резервных СС SumPrib VARIABLE X$DoxDeg-(X$ZatrRem+MX*4(Stroka,Stolbez)+V$Ubitok) ; Прибыль KoefPr VARIABLE MX*6(Stroka,Stolbez)/X$DoxMax; Коэффициент прибыли StoMast FUNCTION P1,D5 ; Стоимость работы одного мастера 1,17/2,18/3,16/4,20/5,21 KolSS FUNCTION P1,D5 ; Количество по типам СС, находящихся на дежурстве 1,55/2,100/3,60/4,45/5,60 KolSSRes FUNCTION P1,D5 ; Количество по типам резервных СС 1,2/2,4/3,4/4,3/5,4 NarOtk FUNCTION P1,D5 ; Среднее время наработки до отказа по типам СС, час 1,373/2,301/3,482/4,325/5,470 SrVrRem FUNCTION P1,D5 ; Среднее время ремонта по типам СС, час 1,6.5/2,4.2/3,2.8/4,3/5,5.5 S1_ FUNCTION P1,D5 ; Доход по типам от одного СС, находящегося на дежурстве 1,20/2,24.2/3,32.8/4,23/5,25.5 S2_ FUNCTION P1,D5 ; Убыток по типам при отсутствии одного СС на дежурстве 1,32/2,34.2/3,37/4,31/5,32.5 S3_ FUNCTION P1,D5 ; Затраты по типам на содержание одного резервного СС 1,21/2,24.2/3,28/4,26/5,25.5 ; Сегмент постановки на дежурство СС GENERATE ,,,n2_ SAVEVALUE TipSS+,1 ; Код 1 ... n2_ - признак СС1 CCn2 в X$TipSS ASSIGN 1,X$TipSS ; Код 1 ... n2_ - признак СС1 CCn2_ в P1 SPLIT (FN$KolSS+FN$KolSSRes-1) ; Число СС + резервные СС ; Сегмент имитации дежурства СС Met1 ENTER P1 ; Встать на дежурство СС типа, номер которого в Р1 ASSIGN Nach1,AC1 ; Время начала дежурства ADVANCE (Exponential(5672,0,FN$NarOtk)) ; Имитация выхода СС из строя, номер которого в Р2 LEAVE P1 ; Снятие с дежурства из-за выхода из строя СС типа, номер которого в Р1 ASSIGN 3,0 Met3 ASSIGN 3+,1 ; Начало цикла изменения типов СС TEST E P1,P3,Met4 ; Р1=Р3? ASSIGN 4,(P1#7) ; Р4=Р1#7 ASSIGN 5,(P4-2) ; Номера матриц: 5,12,19,26,33 MSAVEVALUE *5+,Stroka,Stolbez,V$DoxDeg ; MSAVEVALUE Pribil+,Stroka,Stolbez,V$DoxDeg Met4 TEST GE P3,n2_,Met3 ; Все ли типы СС? ; Сегмент имитации работы ремонтного подразделения ENTER Rem ; Занять одного мастера ASSIGN Nach,AC1 ; Время начала дежурства ADVANCE (Exponential(5672,0,FN$SrVrRem)) ; Имитация ремонта LEAVE Rem ; Конец ремонта ASSIGN 3,0 Met5 ASSIGN 3+,1 ; Начало цикла изменения типов СС TEST E P1,P3,Met6 ; Р1=Р3? ASSIGN 4,(P1#7) ; Р4=Р1#7 ASSIGN 5,(P4-1) ; Номера матриц: 6,13,20,27,34 MSAVEVALUE *5+,Stroka,Stolbez,V$StoRem ; MSAVEVALUE Pribil+,Stroka,Stolbez,V$StoRem Met6 TEST GE P3,n2_,Met5 ; Все ли типы СС? TRANSFER ,Met1 ; Направить исправное СС на дежурство или в резерв ; Сегмент задания времени моделирования и расчета результатов GENERATE VrMod TEST E TG1,1,Met2 ASSIGN 1,0 Met7 ASSIGN 1+,1 ; Начало цикла изменения типов СС ASSIGN 2,(P1#7) ; Р2=Р1#7 ASSIGN 9,(P2-2) ; Номера матриц: 5,12,19,26,33 SAVEVALUEDoxDeg,((MX*9(Stroka,Stolbez))/KolProg);Доход от дежурства MSAVEVALUE *9,Stroka,Stolbez,X$DoxDeg ASSIGN 3,(P2-3) ; Номера матриц: 4,11,18,25,32 MSAVEVALUE *3,Stroka,Stolbez,V$DoxMax; Максимально возможный доход от дежурства СС SAVEVALUE DoxMax,MX*3(Stroka,Stolbez) ASSIGN 4,(P2-0) ; Номера матриц: 7,14,21,28,35 MSAVEVALUE *4,Stroka,Stolbez,V$ZatrResSS ; Затраты на резервные СС ASSIGN 5,(P2-1) ; Номера матриц: 6,13,20,27,34 SAVEVALUE ZatrRem,((MX*5(Stroka,Stolbez))/KolProg) MSAVEVALUE *5,Stroka,Stolbez,X$ZatrRem ASSIGN 6,(P2-6) ; Номера матриц: 1,8,15,22,29 MSAVEVALUE *6,Stroka,Stolbez,V$SumPrib ASSIGN 7,(P2-5) ; Номера матриц: 2,9,16,23,24 MSAVEVALUE *7,Stroka,Stolbez,V$KoefPr MSAVEVALUE Pribil+,Stroka,Stolbez, MX*6(Stroka,Stolbez) ; Суммарная прибыль по СС всех типов ASSIGN 8,(P2-4) MSAVEVALUE SrKPrib+,Stroka,Stolbez,(MX*7(Stroka,Stolbez)/n2_) ; Средний коэффициент прибыли по СС всех типов MSAVEVALUE *8,Stroka,Stolbez,(SR*1/1000) ; Коэффициент использования CC MSAVEVALUE SrKIsp+,Stroka,Stolbez,(SR*1/(1000#n2_)) ; Средний коэффициент использования CC всех типов TEST GE P1,n2_,Met7 ; Все ли типы СС? MSAVEVALUE 31,Stroka,Stolbez,(SR$Rem/1000); Коэффициент использования Rem SAVEVALUE TipSS,0 Met2 TERMINATE 1 START 1000,NP ; Вариант1: ССР2=4, мастеров=3 KolSSres FUNCTION P1,D5 1,2/2,5/3,4/4,4/5,4 Stolbez EQU 2 CLEAR OFF START 1000,NP ; Вариант2: ССР2=5, мастеров=3 KolSSres FUNCTION P1,D5 1,2/2,6/3,4/4,4/5,4 Stolbez EQU 3 CLEAR OFF START 1000,NP ; Вариант3: ССР2=6, мастеров=3 KolSSres FUNCTION P1,D5 1,2/2,4/3,4/4,4/5,4 Stroka EQU 2 Stolbez EQU 1 Rem STORAGE 4 ; Емкость МКУ по числу мастеров-ремонтников CLEAR OFF START 1000,NP ; Вариант4: ССР2=4, мастеров=4 KolSSres FUNCTION P1,D5 1,2/2,5/3,4/4,4/5,4 Stolbez EQU 2 CLEAR OFF START 1000,NP ; Вариант5: ССР2=5, мастеров=4 KolSSres FUNCTION P1,D5 1,2/2,6/3,4/4,4/5,4 Stolbez EQU 3 CLEAR OFF START 1000,NP ; Вариант6: ССР2=6, мастеров=4 KolSSres FUNCTION P1,D5 1,2/2,4/3,4/4,4/5,4 Stroka EQU 3 Stolbez EQU 1 Rem STORAGE 5 ; Емкость МКУ по числу мастеров-ремонтников CLEAR OFF START 1000,NP ; Вариант7: ССР2=4, мастеров=5 KolSSres FUNCTION P1,D5 1,2/2,5/3,4/4,4/5,4 Stolbez EQU 2 CLEAR OFF START 1000,NP ; Вариант8: ССР2=5, мастеров=5 KolSSres FUNCTION P1,D5 1,2/2,6/3,4/4,4/5,4 Stolbez EQU 3 CLEAR OFF START 1000 ; Вариант9: ССР2=6, мастеров=5
В программе, кроме методов применения матриц и функций, показывается метод изменения версий модели. Изменение версий модели производится переопределением соответствующих блоков. Переопределяться не могут только блоки GENERATE. Для переопределения блоков, описывающих ОКУ и МКУ, они должны иметь метки. В командах START, кроме последней, указывается операнд В - NP - не выводить отчёт. Однако одного переопределения блоков недостаточно. В GPSS World изменение версий модели достигается также за счет использования команды CLEAR.
В рассматриваемом примере в процессе моделирования необходимо собирать статистику по версиям модели. Нужная собранная статистика должна быть сохранена, а ненужная - сброшена.
Процесс моделирования в исходное состояние возвращает команда CLEAR. Формат записи команды:
CLEAR [A]
Операнд А может быть ON либо OFF. По умолчанию - ON.
Команда CLEAR сбрасывает всю накопленные статистические данные, удаляет все транзакты из процесса моделирования и заполняет все блоки GENERATE первым транзактом. ОКУ и МКУ становятся доступными, устанавливаются в незанятое состояние. Содержимое всех блоков становится нулевым. Генераторы случайных чисел не сбрасываются.
Если в команде CLEAR операнд А равен OFF, то сохраняемые ячейки, матрицы и логические ключи остаются без изменений. Поэтому в модели в команде CLEAR используется операнд А, равный OFF, так как нужно сохранить результаты моделирования предыдущей версии модели.
Однако при этом нужно иметь в виду те ячейки, начальные значения которых должны быть нулевыми в новой версии модели. Необходимо предусмотреть в программе блоки приведения таких ячеек в исходное состояние. В данной модели это показано на примере сохраняемой ячейки TipSS. Если эту ячейку не привести в нулевое состояние, процесс моделирования второй версии будет остановлен по ошибке "Обращение к несуществующей памяти".
Поскольку накопленные и сохраненные в матрицах результаты моделирования нет необходимости выводить после каждого варианта, то в команде START используется операнд В, равный ON. В последней команде START операнд В не используется. Поэтому стандартный отчет выдаётся после завершения моделирования. В рассматриваемом примере - после девяти наблюдений.
Ниже показан фрагмент журнала с информацией о ходе моделирования. В первом наблюдении (первой версии модели) модельное время изменяется от 0 до 1 000 000 единиц модельного времени (1000 прогонов # 1000 часов работы моделируемой системы).
После переопределения (формирования второй версии модели) выполняется команда CLEAR и абсолютное модельное время вновь изменяется от 0 до 1 000 000 единиц модельного времени.
07/11/11 16:56:06 Model Translation Begun. 07/11/11 16:56:06 Ready. 07/11/11 16:56:06 Simulation in Progress. 07/11/11 16:56:26 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:56:26 Simulation in Progress. 07/11/11 16:56:46 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:56:46 Simulation in Progress. 07/11/11 16:57:06 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:57:06 Simulation in Progress. 07/11/11 16:57:31 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:57:31 Simulation in Progress. 07/11/11 16:57:55 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:57:55 Simulation in Progress. 07/11/11 16:58:19 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:58:19 Simulation in Progress. 07/11/11 16:58:44 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:58:44 Simulation in Progress. 07/11/11 16:59:09 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:59:09 Simulation in Progress. 07/11/11 16:59:33 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:59:33 Reporting in Модель сеть связи 3.128.1-REPORT.
Для включения в формируемый стандартный отчет матриц необходимо при открытом объекте "Модель" выполнить команду:
Edit/Settings/Reports/Matrices/Применить/Ok
Результаты моделирования после 1000 прогонов приведены ниже. Но опять в целях сокращения приведены для СС1 первые три матрицы с абсолютной и относительной прибылью, а также с коэффициентами использования СС1.
MATRIX RETRY INDICES VALUE
PRIB1 0 1 1 411920.775
1 2 412047.879
1 3 395398.298
2 1 975100.990
2 2 973737.015
2 3 972026.043
3 1 1029846.786
3 2 1029847.984
3 3 1029916.195
KPR1 0
1 1 .374
1 2 .374
1 3 .359
2 1 .886
2 2 .885
2 3 .883
3 1 .936
3 2 .936
3 3 .936
KZEN1 0
1 1 .778
1 2 .778
1 3 .772
2 1 .976
2 2 .976
2 3 .975
3 1 .995
3 2 .995
3 3 .995
В соответствии с постановкой задачи нужно определить такое сочетание количества резервных СС и мастеров-ремонтников, при котором доход от предоставления услуг системой связи будет максимальным.
В GPSS World имеются средства для проведения оптимизационного эксперимента. Однако провести его так, чтобы он был аналогичен оптимизационному эксперименту в AnyLogic и, благодаря этому, можно было бы сравнивать результаты оптимизации, не представляется возможным. Во-первых, число факторов в GPSS World не может быть более пяти. Во-вторых, ремонтное подразделение имитируется МКУ, которое описывается командой STORAGE A. Операнд А этой команды, задающий ёмкость МКУ, должен быть только числом. Факторы же эксперимента обязательно должны быть переменными пользователя и не могут быть на месте операнда А. Отсюда нет возможности изменять в ходе эксперимента количество мастеров-ремонтников. Для изменения количества мастеров-ремонтников такая возможность есть.
Поэтому для достижения цели работы - установления адекватности результатов моделирования, эксперименты проводились в "ручном режиме". Причём, изменялось количество резервных СС только второго типа (ССР2) от 4 до 6 при изменениях количества мастеров-ремонтников от 3 до 5. Таким образом, было проведено по 9 экспериментов в каждой системе моделирования. GPSS World позволяет проводить сразу все эти девять экспериментов, для чего должен быть написан соответствующий сегмент изменения версий модели. Что и было сделано. В AnyLogic вручную изменялись соответствующие данные, после чего запускалась модель.
Результаты экспериментов представлены в Табл. 5.6. Из их сравнения следует, что они адекватны, поскольку отличия незначительны и составляют в основном 0…0,001, 0…0,002.
Что касается выбора оптимального сочетания количества резервных ССР2 и мастеров-ремонтников для условий данных экспериментов, то можно выбрать вариант 7: ССР2 = 4, мастеров-ремонтников = 5.
| Показатели | GPSS World | AnyLogic | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Типы средств связи | ||||||||||
| СС1 | СС2 | СС3 | СС4 | СС5 | СС1 | СС2 | СС3 | СС4 | СС5 | |
| Вариант 1: ССР2 = 4, мастеров-ремонтников = 3 | ||||||||||
| Коэффициент прибыли по типам СС | 0,374 | 0,327 | 0,627 | 0,4 | 0,573 | 0,38 | 0,332 | 0,633 | 0,405 | 0,576 |
| Суммарный коэффициент прибыли | 0,46 | 0,468 | ||||||||
| Коэффициент использования по типам СС | 0,779 | 0,741 | 0,853 | 0,78 | 0,846 | 0,781 | 0,743 | 0,856 | 0,781 | 0,847 |
| Суммарный коэффициент использования СС | 0,799 | 0,8 | ||||||||
| Вариант 2: ССР2 = 5, мастеров-ремонтников = 3 | ||||||||||
| Коэффициент прибыли по типам СС | 0,377 | 0,336 | 0,626 | 0,397 | 0,571 | 0,369 | 0,332 | 0,624 | 0,393 | 0,57 |
| Суммарный коэффициент прибыли | 0,462 | 0,462 | ||||||||
| Коэффициент использования по типам СС | 0,779 | 0,749 | 0,852 | 0,778 | 0,845 | 0,777 | 0,747 | 0,851 | 0,776 | 0,844 |
| Суммарный коэффициент использования СС | 0,801 | 0,8 | ||||||||
| Вариант 3: ССР2 = 6, мастеров-ремонтников = 3 | ||||||||||
| Коэффициент прибыли по типам СС | 0,364 | 0,33 | 0,619 | 0,385 | 0,564 | 0,361 | 0,331 | 0,62 | 0,39 | 0,563 |
| Суммарный коэффициент прибыли | 0,453 | 0,457 | ||||||||
| Коэффициент использования по типам СС | 0,774 | 0,751 | 0,849 | 0,773 | 0,842 | 0,774 | 0,751 | 0,85 | 0,775 | 0,841 |
| Суммарный коэффициент использования СС | 0,797 | 0,797 | ||||||||
| Вариант 4: ССР2 = 4, мастеров-ремонтников = 4 | ||||||||||
| Коэффициент прибыли по типам СС | 0,89 | 0,895 | 0,931 | 0,89 | 0,911 | 0,889 | 0,892 | 0,931 | 0,889 | 0,91 |
| Суммарный коэффициент прибыли | 0,903 | 0,905 | ||||||||
| Коэффициент использования по типам СС | 0,978 | 0,977 | 0,996 | 0,988 | 0,995 | 0,978 | 0,977 | 0,996 | 0,988 | 0,994 |
| Суммарный коэффициент использования СС | 0,987 | 0,987 | ||||||||
| Вариант 5: ССР2 = 5, мастеров-ремонтников = 4 | ||||||||||
| Коэффициент прибыли по типам СС | 0,887 | 0,892 | 0,93 | 0,887 | 0,909 | 0,885 | 0,89 | 0,93 | 0,886 | 0,909 |
| Суммарный коэффициент прибыли | 0,901 | 0,902 | ||||||||
| Коэффициент использования по типам СС | 0,977 | 0,981 | 0,996 | 0,988 | 0,994 | 0,976 | 0,98 | 0,995 | 0,987 | 0,994 |
| Суммарный коэффициент использования СС | 0,987 | 0,986 | ||||||||
| Вариант 6: ССР2 = 6, мастеров-ремонтников = 4 | ||||||||||
| Коэффициент прибыли по типам СС | 0,885 | 0,89 | 0,93 | 0,886 | 0,909 | 0,887 | 0,89 | 0,93 | 0,887 | 0,91 |
| Суммарный коэффициент прибыли | 0,9 | 0,903 | ||||||||
| Коэффициент использования по типам СС | 0,977 | 0,984 | 0,995 | 0,987 | 0,994 | 0,977 | 0,984 | 0,996 | 0,988 | 0,994 |
| Суммарный коэффициент использования СС | 0,987 | 0,987 | ||||||||
| Вариант 7: ССР2 = 4, мастеров-ремонтников = 5 | ||||||||||
| Коэффициент прибыли по типам СС | 0,935 | 0,944 | 0,939 | 0,914 | 0,922 | 0,936 | 0,945 | 0,94 | 0,915 | 0,923 |
| Суммарный коэффициент прибыли | 0,931 | 0,934 | ||||||||
| Коэффициент использования по типам СС | 0,996 | 0,998 | 1 | 0,999 | 1 | 0,996 | 0,998 | 1 | 0,999 | 1 |
| Суммарный коэффициент использования СС | 0,998 | 0,998 | ||||||||
| Вариант 8: ССР2 = 5, мастеров-ремонтников = 5 | ||||||||||
| Коэффициент прибыли по типам СС | 0,936 | 0,936 | 0,939 | 0,915 | 0,922 | 0,936 | 0,936 | 0,94 | 0,915 | 0,923 |
| Суммарный коэффициент прибыли | 0,93 | 0,932 | ||||||||
| Коэффициент использования по типам СС | 0,996 | 0,999 | 1 | 0,999 | 1 | 0,996 | 0,999 | 1 | 0,999 | 1 |
| Суммарный коэффициент использования СС | 0,998 | 0,998 | ||||||||
| Вариант 9: ССР2 = 6, мастеров-ремонтников = 5 | ||||||||||
| Коэффициент прибыли по типам СС | 0,936 | 0,927 | 0,939 | 0,915 | 0,922 | 0,936 | 0,928 | 0,94 | 0,915 | 0,923 |
| Суммарный коэффициент прибыли | 0,928 | 0,929 | ||||||||
| Коэффициент использования по типам СС | 0,996 | 0,999 | 1 | 0,999 | 1 | 0,996 | 0,999 | 1 | 0,999 | 1 |
| Суммарный коэффициент использования СС | 0,998 | 0,998 | ||||||||
На дежурстве находятся n1 средств связи (СС) n2 типов (n21 + n22 + … + n2n2 = n2) в течение n3 часов.
Каждое СС может в любой момент времени выйти из строя. Интервалы времени T21, T22, …, T2n2 между отказами СС, находящимися на дежурстве, случайные. В случае выхода из строя СС заменяют резервным, причем либо сразу, либо по мере появления исправного СС. Тем временем, вышедшее из строя СС ремонтируют, после чего содержат в качестве резервного или направляют его на дежурство. Всего количество резервных СС - n4.
Ремонт неисправных СС производят n5 мастеров. Время T1, T2, …, Tn2 ремонта случайное и зависит от типа СС, но не зависит от того, какой мастер это СС ремонтирует.
Прибыль от СС, находящихся на дежурстве, составляет S1 денежных единиц в час. Почасовой убыток при отсутствии на дежурстве одного СС - S2, …, S2n2 денежных единиц в час. Оплата мастера за ремонт неисправного СС - S31, S32, …, S3n2 денежных единиц в час соответственно.
Затраты на содержание одного резервного СС составляют S4 денежных единиц в час.
Разработать имитационную модель бизнес-процесса предоставления услуг по средствам связи в течение 1000 часов.
Исследовать влияние на ожидаемую прибыль различного количества резервных СС и мастеров.
Определить абсолютные величины и относительные коэффициенты ожидаемой прибыли.
Сделать выводы об использовании СС, мастеров и необходимых мерах по совершенствованию системы предоставления услуг связи.
Уясним задачу на разработку модели, предварительно представив структуру системы предоставления услуг связи (Рис. 5.1) как систему СМО.
(рис 5.1) Система предоставления услуг связи как СМО
Система предоставления услуг связи (далее система связи) представляет собой многофазную многоканальную систему массового обслуживания замкнутого типа с отказами.
Таким образом, модель системы связи должна состоять из следующих сегментов (Рис. 5.2):
(рис 5.2) Концептуальная схема модели системы связи
Заявки как средства связи, поступившие на дежурство, должны иметь следующие параметры (поля):
tipCC - код типа СС;
timeOtkaz - среднее время между отказами СС;
timeMeanRem - среднее время ремонта одного СС;
nach - время начала ремонта в ремонтном подразделении;
nach1 - время начала дежурства.Возьмём, например, $$n_2=5$$. Код типа СС в виде чисел 1, 2, 3, 4, 5 определяется в самом начале моделирования и остаётся неизменным. Для его определения используются следующие исходные данные:
KCC1 … KCC5 - количество СС первого … пятого типов соответственно;
KCCР1 … KCCР5 - количество резервных СС первого … пятого типов соответственно.По этим же данным определяются количества всех СС по типам KolCC1 … KolCC5, а также общее количество СС всех типов KolCC.
В параметр timeOtkaz заносится интенсивность выхода из строя соответствующего типа СС. Интенсивность рассчитывается по средним значениям интервалов выхода из строя СС первого … пятого типов timeOtkaz1 … timeOtkaz5.
В параметр timeMeanRem заносится интенсивность ремонта соответствующего типа СС. Интенсивность рассчитывается по средним значениям времени ремонта СС соответственно первого … пятого типов timeRem1 … timeRem5.
Рассчитанные интенсивности, например, timeOtkaz = 1/timeOtkaz1 используются для обращения к генератору exponential(timeOtkaz).
Параметры nach1 и nach изменяются при каждом поступлении СС на дежурство и в ремонтное подразделение соответственно. Они используются при расчётах дохода от дежурства и затрат на ремонт неисправного СС. В них заносится время начала дежурства и начала ремонта соответственно.
Кроме рассмотренных, СС имеют еще следующие параметры (не заносимые в дополнительные поля заявок, имитирующих СС):
doxDegCC1 … doxDegCC5 - доход от дежурства одного СС первого … пятого типов соответственно;
zatrResCC1 … zatrResCC5 - затраты на содержание резерва одного СС первого … пятого типов соответственно;
stoimRem1 … stoimRem5 - стоимость ремонта одного СС первого … пятого типов соответственно.В ходе моделирования, а также по завершении моделирования рассчитываются:
PribCC1 … PribCC5, SumPribil - абсолютные величины ожидаемой прибыли по каждому типу СС и в целом;
KoefPribCC1 … KoefPribCC5, KoefPribil - относительные коэффициенты ожидаемой прибыли по каждому типу СС и в целом.Рассмотрим вычисление этих показателей на примере PribCC1 и KoefPribCC1.
Предполагается, что максимальный доход DoxMaxCC1 от дежурства будет в случае, когда все СС первого типа будут постоянно находиться на дежурстве, то есть:
DoxMaxCC1= KCC1*doxDegCC1*ВремяРабСист
где ВремяРабСист - время работы моделируемой системы.
Фактический доход DoxDegCC1 от дежурства СС первого типа составит:
DoxDegCC1+=(time()-entity.nach1)* main.doxDegCC1;
где (time()-entity.nach1) - время нахождения СС первого типа на дежурстве.
При отсутствии на дежурстве СС первого типа убыток составит:
UbitokCC1=(1-degCC1.statsUtilization.mean())* main.ubitokCC1*ВремяРабСист*KCC1;
где (1-degCC1.statsUtilization.mean()) - средний коэффициент отсутствия СС первого типа на дежурстве за всё время моделирования.
Затраты на ремонт неисправных СС и содержание резервных СС первого типа составят соответственно:
ZatrRemCC1+=(time()-entity.nach)*stoimRemCC1; ZatrResCC1= KCCP1*zatrResCC1* ВремяРабСист
Абсолютная величина ожидаемой прибыли составит:
PribCC1=DoxDegCC1-(ZatrRemCC1+ZatrRemCC1+UbitokCC1).
Относительный коэффициент прибыли равен:
KoefPribCC1=PribCC1/DoxMaxCC1.
Показатели в целом за систему связи:
SumPribil=SumDoxDeg-(SumZatrRes+SumZatrRem+SumUbitok), KoefPrib=SumPrib/SumDoxMax,
где SumDoxMax, SumDoxDeg, SumZatrRes, SumZatrRem, SumUbitok - соответствующие доходы и затраты за систему.
Сегмент предназначен для имитации поступления основных и резервных СС всех типов и постановки их на дежурство.
Файл/Создать/Модель на панели инструментов. Появится диалоговое окно Новая модель.
Имя модели введите Система_связи. Выберите каталог для сохранения файлов модели.
Готово.Исходные данные разделим и разместим там, где они, по нашему мнению, нужны и их удобно использовать.
Организуйте ввод исходных данных для сегмента Постановка на дежурство.
Палитре выделите Презентация. Перетащите элемент Область просмотра. Перейдите на панель Свойства.
Имя: введите Исходные_данные_ПД.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Местоположение и размер. Введите в поля X: 0, Y: 500, Ширина: 450, Высота: 340.
Местоположение и размер. Введите в поля X: 0, Y: 500, Ширина: 450, Высота: 340.
(рис 5.3) Размещение элементов Параметр и Переменная
Прямоугольник на элемент Область просмотра.
Местоположение и размер. Введите в поля X: 20, Y: 520, Ширина: 390, Высота: 300.
text и на странице Текст в поле text введите Исходные_данные_ПД (здесь ПД - постановка на дежурство).
Палитре выделите Основная. Перетащите элементы Параметр и Переменная на элемент с именем Исходные_данные_ПД и разместите их так, как показано на Рис. 5.3.
Простые переменные с именами KolCC1…KolCC5 - количество СС по типам, а KolCC - количество СС всех типов. Эти переменные мы будем вычислять по исходным значениям КСС1 … КСС5 и КССР1 … КССР5 и использовать при генерации равного значению КolСС заявок, имитирующих СС. Количество СС изменять можно только перед началом моделирования, так как заявки, имитирующие СС, генерируются только один раз.
| Имя | Тип | Значение по умолчанию | Отображать имя |
|---|---|---|---|
| KolCC1 | int | 0 | Установить флажок во всех элементах |
| KolCC2 | int | 0 | |
| KolCC3 | int | 0 | |
| KolCC4 | int | 0 | |
| KolCC5 | int | 0 | |
| KolCC | int | 0 | |
| NumCC | int | 0 | |
| doxdegCC1 | double | 20 | |
| doxdegCC2 | double | 24,2 | |
| doxdegCC3 | double | 32,8 | |
| doxdegCC4 | double | 23 | |
| doxdegCC5 | double | 25,5 | |
| zatrResCC1 | double | 21 | |
| zatrResCC2 | double | 24,2 | |
| zatrResCC3 | double | 28 | |
| zatrResCC4 | double | 26 | |
| zatrResCC5 | double | 25,5 | |
| ubitokCC1 | double | 32 | |
| ubitokCC2 | double | 34,2 | |
| ubitokCC3 | double | 37 | |
| ubitokCC4 | double | 31 | |
| ubitokCC5 | double | 32,5 |
Создайте область просмотра на диаграмме класса Main для размещения объектов сегмента Постановка на дежурство.
Презентация перетащите элемент Область просмотра.
Свойства в поле Имя: введите постановка.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Местоположение и размер. Введите в поля X: 0, Y: 0, Ширина: 700, Высота: 350.
Скруглённый прямоугольник. Оставьте имя, предложенное системой. В нём мы разместим объекты сегмента Постановка на дежурство.
Местоположение и размер. Введите в поля X: 38, Y: 62, Ширина: 642, Высота: 268.
Область просмотра мы уже перетащили Скругленный прямоугольник. На нём мы будем размещать, как отмечалось ранее, объекты сегмента Постановка на дежурство.
text и на панели Свойства в поле Текст: введите Постановка на дежурство. Поместите этот текст посредине в верхней части элемента Скругленный прямоугольник.
Прямоугольник на Область просмотра. На странице Местоположение и размер введите в поля X: 50, Y: 100, Ширина: 170, Высота: 140.
text на Прямоугольник и на панели Свойства в поле Текст: введите Имитация поступления СС.
source на Прямоугольник. Для записи и хранения параметров СС в поля заявок необходимо создать нестандартный тип агента. Создайте тип агента ComFacility.
Проекты Щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
Новый Java класс. В поле Имя: введите имя нового класса ComFacility.
Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щёлкните Далее.
Мастера создания Java класса. Добавьте следующие поля Java класса:
tipCC int; timeMeanRem double; nach double; nach1 double; timeOtkaz double;
Создать конструктор и Создать метод toString ().
Готово. Закройте редактор кода.
Проект только что созданный Java класс и в контекстном меню выберите Преобразовать Java класс в тип агента.
ComFacility. Закройте его.
source.
Свойства уберите флажок Отображать имя.
Тип заявки: и Новая заявка: Agent замените ComFacility. Установите:Прибывают согласно Интенсивности.
Интенсивность прибытия 1
Ограниченное количество прибытий установите флажок
Максимальное количество прибытий 1На странице Действия в поле При выходе: введите Java код:
KolCC1=degurstvo.KCC1+degurstvo.KCCP1; degurstvo.DoxMaxCC1= round((degurstvo.KCC1*doxDegCC1)*ВремяРабСист*100); degurstvo.DoxMaxCC1=degurstvo.DoxMaxCC1/100; degurstvo.ZatrResCC1= round((degurstvo.KCCP1*zatrResCC1)*ВремяРабСист*100); degurstvo.ZatrResCC1=degurstvo.ZatrResCC1/100; KolCC2=degurstvo.KCC2+degurstvo.KCCP2; degurstvo.DoxMaxCC2= round((degurstvo.KCC2*doxDegCC2)*ВремяРабСист*100); degurstvo.DoxMaxCC2=degurstvo.DoxMaxCC2/100; degurstvo.ZatrResCC2= round((degurstvo.KCCP2*zatrResCC2)*ВремяРабСист*100); degurstvo.ZatrResCC2=degurstvo.ZatrResCC2/100; KolCC3=degurstvo.KCC3+degurstvo.KCCP3; degurstvo.DoxMaxCC3= round((degurstvo.KCC3*doxDegCC3)*ВремяРабСист*100); degurstvo.DoxMaxCC3=degurstvo.DoxMaxCC3/100; degurstvo.ZatrResCC3= round((degurstvo.KCCP3*zatrResCC3)*ВремяРабСист*100); degurstvo.ZatrResCC3=degurstvo.ZatrResCC3/100; KolCC4=degurstvo.KCC4+degurstvo.KCCP4; degurstvo.DoxMaxCC4= round((degurstvo.KCC4*doxDegCC4)*ВремяРабСист*100); degurstvo.DoxMaxCC4=degurstvo.DoxMaxCC4/100; degurstvo.ZatrResCC4= round((degurstvo.KCCP4*zatrResCC4)*ВремяРабСист*100); degurstvo.ZatrResCC4=degurstvo.ZatrResCC4/100; KolCC5=degurstvo.KCC5+degurstvo.KCCP5; degurstvo.DoxMaxCC5= round((degurstvo.KCC5*doxDegCC5)*ВремяРабСист*100); degurstvo.DoxMaxCC5=degurstvo.DoxMaxCC5/100; KolCC=KolCC1+KolCC2+KolCC3+KolCC4+KolCC5; degurstvo.ZatrResCC5= round((degurstvo.KCCP5*zatrResCC5)*ВремяРабСист*100); degurstvo.ZatrResCC5=degurstvo.ZatrResCC5/100; degurstvo.SumDoxMax=degurstvo.DoxMaxCC1+ degurstvo.DoxMaxCC2+degurstvo.DoxMaxCC3+ degurstvo.DoxMaxCC4+degurstvo.DoxMaxCC5; degurstvo.SumZatrRes=degurstvo.ZatrResCC1+ degurstvo.ZatrResCC2+degurstvo.ZatrResCC3+ degurstvo.ZatrResCC4+degurstvo.ZatrResCC5;
Введённым кодом определяется количество СС всех типов, включая и резервные средства связи. Эти данные необходимы в последующем в объекте split. Количества СС как исходные данные будут размещены на агенте Degyrstvo, который мы создадим позже, поэтому в коде используется доступ к ним в виде, например, degyrstvo.KCC1.
Кодом рассчитываются также максимальный доход от каждого типа СС и суммарный максимальный доход, а также затраты на содержание резервных СС по типам и суммарные затраты на содержание резервных СС всех типов.
Такой подход к расчётам максимального дохода и затрат на содержание резервных СС принят для экономии машинного времени, поскольку эти показатели зависят только от продолжительности времени моделирования (ВремяРабСист), дохода от дежурства одного СС и затрат на содержание одного резервного СС. То есть данные для их расчёта не носят стохастический характер. Поэтому указанные показатели целесообразно рассчитать здесь, а затем использовать в конце моделирования при обработке накопленных статистических данных.
Для вывода результатов моделирования с двумя знаками после запятой использовался метод round(). Предварительно результат умножался на 100, а потом делился на эту же величину. Например:
degyrstvo.DoxMaxCC1= round((degyrstvo.KCC1*doxDegCC1)*ВремяРабСист*100); degyrstvo.DoxMaxCC1=degyrstvo.DoxMaxCC1/100;
split и sink (Рис. 5.4).
split. Установите свойства как на Рис. 5.5. Так как копии не унаследуют свойств от оригинала, поэтому на странице Действия в поле При выходе копии: введите Java код:
(рис 5.4) Добавлены объекты split и sink
NumCC++; if (NumCC <= KolCC) entity.tipCC = 5; if (NumCC <= (KolCC1+KolCC2+KolCC3+KolCC4)) entity.tipCC = 4; if (NumCC <= (KolCC1+KolCC2+KolCC3)) entity.tipCC = 3; if (NumCC <= (KolCC1+KolCC2)) entity.tipCC = 2; if (NumCC <= KolCC1) entity.tipCC = 1;
Переменная NumCC предназначена для последовательного счёта СС всех типов. Она используется для определения принадлежности СС к соответствующему типу и занесения кода этого типа СС в поле entity.tipCC, например, entity.tipCC = 5, который необходим для нормального функционирования модели, то есть отличия СС по типам.
sink уничтожает заявку-оригинал.
(рис 5.5) Объект split с установленными свойствами
Блок Распределитель средств связи предназначен для распределения СС согласно их типам, т. е. общее количество поступивших СС он должен разделить по типам.
Данный блок реализуется четырьмя объектами selectOutput и одним объектом queue (Рис. 5.6). Возможна реализация этого блока и одним объектом selectOutput5 совместно также с объектом queue.
Объект queue предназначен для приема, хранения и отправки на дежурство исправных СС, поступающих из ремонта.
selectOutput и один объект queue из Библиотеки моделирования процессов на диаграмму агента Main. Соедините их так, как показано на Рис. 5.6.
Свойства свойства объектов selectOutput согласно Табл. 5.2 (при использовании объекта selectOutput5 условия разделения СС по типам останутся такими же).
(рис 5.6) Добавлены объекты SelectOutput и queue
| Имя | Отображать имя | Тип заявки: | Выход true выбирается | Условие |
|---|---|---|---|---|
| СС1 | Установите флажки | ComFacility | При выполнении условия | entity.tipCC==1 |
| СС2 | ComFacility | entity.tipCC==2 | ||
| СС3 | ComFacility | entity.tipCC==3 | ||
| СС4 | ComFacility | entity.tipCC==4 |
false элемента СС4, поэтому пятый объект selectOutput не нужен.
queue и не устанавливайте флажок Отображать имя.
Вместимость 100 и на странице Специфические установите флажок Включить сбор статистики.
Презентация три элемента text и в соответствующих полях Текст: введите текст, как на Рис. 5.6.На Рис. 5.7 показан в окончательном виде сегмент Постановка на дежурство после добавления блока На дежурство. Для добавления этого блока, который должен выполнять "связь" между сегментом Постановка на дежурство и сегментом Имитация дежурства, создадим новый тип агента. Экземпляром этого типа агента и будет нужный нам объект - блок На дежурство.
(рис 5.7) Сегмент Постановка на дежурствоПроекты Щёлкните правой кнопкой мыши Main, с которым вы работаете в данный момент, и выберите из контекстного меню Создать/Тип агента.
Шаг 1. Создание нового типа агента.
Не использовать шаблоны типов агентов.
Имя нового агента: Degurstvo.
Описание: введите описание сущности, моделируемой этим типом агента.
Готово.Создайте область просмотра на типе агента Degurstvo для размещения элементов сегмента Имитация дежурства.
Палитре выделите Презентация. Перетащите элемент Область просмотра.
Свойства.
Имя: введите дежурство.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Местоположение и размер. Введите в поля X: 40, Y: 0, Ширина: 730, Высота: 420.Созданный новый тип агента Degyrstvo является вложенным объектом. Как вы помните, нам нужно сделать так, чтобы СС передавались на дежурство в сегмент Имитация дежурства из сегмента Постановка на дежурство, а отремонтированные СС после ремонта из сегмента Имитация дежурства возвращались в сегмент Постановка на дежурство.
Прямоугольник. На панели Свойства оставьте флажки Исключить и Отображается на верхнем уровне.
Местоположение и размер. Введите в поля X: 110, Y: 130, Ширина: 100, Высота: 180.
Основная и разместите так, как показано на Рис. 5.8. Для всех элементов Порт оставьте только флажок Отображается на верхнем уровне.
(рис 5.8) Добавлены на Degyrstvo шесть портов
Проекты перетащите экземпляр типа агента Degyrstvo, и соедините так, как на Рис. 5.7. При этом следует иметь в виду, что положение портов на экземпляре типа агента Degyrstvo изменить нельзя. Это можно сделать лишь на самом типе агента.Организуйте ввод исходных данных для сегмента Имитация дежурства.
Отображается на верхнем уровне.Область просмотра. Перейдите на панель Свойства. В поле Имя: введите исходные_данные_Д.
Выравнивать по: Верхн. левому углу.
Подогнать под окно.
Местоположение и размер введите в поля X: 40, Y: 800, Ширина: 650, Высота: 240.
Прямоугольник. На нём мы разместим элементы для ввода исходных данных.
Местоположение и размер. Введите в поля X: 50, Y: 840, Ширина: 620, Высота: 190.
text и на панели Свойства в поле Текст: введите Исходные_данные_Д (здесь Д - дежурство).
Параметр на элемент с именем Исходные_данные_Д и разместите их так, как показано на Рис. 5.9. При копировании целесообразно указать имя первого элемента и его тип, например, KCC1, int. Значения по умолчанию нужно установить потом для каждого элемента своё.
Свойства каждого элемента Параметр установите свойства согласно Табл. 5.3.
(рис 5.9) Размещение элементов Параметр для ввода данных
| Имя | Тип | Значение по умолчанию | Отображать имя |
|---|---|---|---|
| KCC1 | int | 55 | Установить флажок во всех элементах |
| KCC2 | int | 100 | |
| KCC3 | int | 60 | |
| KCC4 | int | 45 | |
| KCC5 | int | 60 | |
| KCCР1 | int | 2 | |
| KCCР2 | int | 4 | |
| KCCР3 | int | 4 | |
| KCCР4 | int | 3 | |
| KCCР5 | int | 4 | |
| stoimRemCC1 | double | 17 | |
| stoimRemCC2 | double | 18 | |
| stoimRemCC3 | double | 16 | |
| stoimRemCC4 | double | 20 | |
| stoimRemCC5 | double | 21 | |
| timeRem1 | double | 6,5 | |
| timeRem2 | double | 4,2 | |
| timeRem3 | double | 2,8 | |
| timeRem4 | double | 3 | |
| timeRem5 | double | 5,5 | |
| timeOtkaz1 | double | 373 | |
| timeOtkaz2 | double | 301 | |
| timeOtkaz3 | double | 482 | |
| timeOtkaz4 | double | 325 | |
| timeOtkaz5 | double | 470 | |
| kol_master | int | 3 | |
| КолПрогон | double | 1000 | |
| ВремяРабСист | double | 1000 |
Здесь выводятся все результаты моделирования (Рис. 5.10). Однако с целью экономии машинного времени, выводятся они по разному. Рассчитанные ранее максимальные доходы от дежурства СС и затраты на содержание резервных СС не выводятся в ходе моделирования. Выводятся только текущие доходы от дежурства СС и текущие затраты на ремонт неисправных СС. Все обработанные результаты выводятся по окончании моделирования. Для организации вывода используется способ Событие (см. п. 5.1.7).
(рис 5.10) Элементы Переменная для вывода результатов моделирования
Область просмотра. Перейдите на панель Свойства. В поле Имя: введите текущие_результаты.
Выравнивать по: Верхн. левому углу.
Подогнать под окно.
Местоположение и размер введите в поля X: 40, Y: 430, Ширина: 730, Высота: 350.
Прямоугольник.
Свойства. Введите в поля X: 54, Y: 466, Ширина: 710, Высота: 300.
text и на панели Свойства в поле Текст: введите Затраты и Доходы соответственно.
Палитре выделите Основная. Перетащите, используя копирование, элементы Переменная. Разместите их, дайте имена, как показано на Рис. 5.10. У всех переменных установите флажки Отображать имя и тип double.Реализация событийной части сегмента показана на Рис. 5.11.
Скруглённый прямоугольник. На нём мы разместим все элементы сегмента Имитация дежурства.
Местоположение и размер панели Свойства введите в поля X: 60, Y: 50, Ширина: 600, Высота: 360.
Прямоугольник. На нём мы разместим элементы, непосредственно имитирующие дежурство СС.
Местоположение и размер введите в поля X: 250, Y: 60, Ширина: 170, Высота: 330.
Прямоугольник для размещения элементов, имитирующих ремонтное подразделение СС.
Местоположение и размер панели Свойства введите в поля X: 440, Y: 60, Ширина: 190, Высота: 330.
Degyrstvo последовательно: пять объектов queue, пять объектов delay, один объект queue, один объект delay и соедините их так, как показано на Рис. 5.11. При копировании используйте свойства каждого объекта, приведенные в Табл. 5.4. Кроме них также свойства, указанные в п. 9.
text и введите названия в соответствующие поля Текст: согласно Рис. 5.11.
(рис 5.11) Сегмент Имитация дежурства
| queue | ||
|---|---|---|
| Имя | Вместимость | Действия При выходе |
| резерв1 | KCCP1 | entity.timeOtkaz=1/timeOtkaz1 |
| резерв2 | KCCP2 | entity.timeOtkaz=1/timeOtkaz2 |
| резерв3 | KCCP3 | entity.timeOtkaz=1/timeOtkaz3 |
| резерв4 | KCCP4 | entity.timeOtkaz=1/timeOtkaz4 |
| резерв5 | KCCP5 | entity.timeOtkaz=1/timeOtkaz5 |
| очРем | Максимальная | |
| delay | ||
| Имя | Время задержки | Вместимость |
| degCC1 | exponential(entity.timeOtkaz) | KCC1 |
| degCC2 | exponential(entity.timeOtkaz) | KCC2 |
| degCC3 | exponential(entity.timeOtkaz) | KCC3 |
| degCC4 | exponential(entity.timeOtkaz) | KCC4 |
| degCC5 | exponential(entity.timeOtkaz) | KCC5 |
| remont | exponential(entity.timeMeanRem) | 3 |
| Имя | Действия При выходе | |
| degCC1 | DoxDegCC1+=(time()-entity.nach1)* main.doxDegCC1; | |
| entity.timeMeanRem=1/timeRem1; | ||
| degCC2 | DoxDegCC2+=(time()-entity.nach1)*main.doxDegCC2; | |
| entity.timeMeanRem=1/timeRem2; | ||
| degCC3 | DoxDegCC3+=(time()-entity.nach1)*main.doxDegCC3; | |
| entity.timeMeanRem=1/timeRem3; | ||
| degCC4 | DoxDegCC4+=(time()-entity.nach1)*main.doxDegCC4; | |
| entity.timeMeanRem=1/timeRem4; | ||
| degCC5 | DoxDegCC5+=(time()-entity.nach1)*main.doxDegCC5; | |
| entity.timeMeanRem=1/timeRem5; | ||
Тип заявки: Agent заменить ComFacility;
Включить сбор статистики;
delay degCC1 … degCC5 установить:Действие при входе entity.nach1=time();delay с именем remont также ввести Java коды в следующие свойства:Действие при входе entity.nach=time();
Действия При выходе
if (entity.tipCC == 1)
{ZatrRemCC1+=((time()-entity.nach)*stoimRemCC1);
SumZatrRem+=((time()-entity.nach)*stoimRemCC1);}
if (entity.tipCC == 2)
{ZatrRemCC2+=((time()-entity.nach)*stoimRemCC2);
SumZatrRem+=((time()-entity.nach)*stoimRemCC2);}
if (entity.tipCC == 3)
{ZatrRemCC3+=((time()-entity.nach)*stoimRemCC3);
SumZatrRem+=((time()-entity.nach)*stoimRemCC3);}
if (entity.tipCC == 4)
{ZatrRemCC4+=(time()-entity.nach)*stoimRemCC4;
SumZatrRem+=((time()-entity.nach)*stoimRemCC4);}
if (entity.tipCC == 5)
{ZatrRemCC5+=((time()-entity.nach)*stoimRemCC5);
SumZatrRem+=((time()-entity.nach)*stoimRemCC5);}Результаты моделирования выводятся в сегменте Имитация дежурства. Тем не менее, организуем вывод результатов моделирования, можно сказать, в более презентабельном виде. Для этого создадим сегмент Статистика (Рис. 5.12).
Статистика.
Область просмотра.
Свойства.
Имя: введите статистика.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Местоположение и размер введите в поля X: 0, Y: 1076, Ширина: 960, Высота: 630.
Прямоугольник.
Местоположение и размер введите в поля X: 20, Y: 1116, Ширина: 930, Высота: 580.
(рис 5.12) Сегмент Статистика
text и в поле Текст: введите Результаты моделирования. На странице Местоположение и размер введите в поля X: 360, Y: 1126.
text, разместите и введите в соответствующие поля Текст: надписи, как на Рис. 5.12. Например, при размещении надписи Максимальный доход по типам СС укажите в полях X: 100, Y: 1160, при размещении надписи Коэффициенты использования типов средств связи укажите в полях X: 280, Y: 1490, а при размещении надписи Затраты на содержание резервов по типам средств связи в полях X: 280, Y: 1440.Текстовое поле является простейшим текстовым элементом управления, позволяющим пользователю вводить небольшие объемы текста. Вы можете также связать этот элемент управления с переменной или параметром типа String, double или int. Мы будеи выводить в эти текстовые поля результаты моделирования.
Текстовое поле. При копировании используйте следующие рекомендации. Перетащите первый элемент Текстовое поле. В поле Имя: дайте ему имя editbox1.
Внешний вид в полях Шрифт: установите шрифт по своему усмотрению из выпадающего списка или оставьте предложенный, размер шрифта установите 14.
Местоположение и размер введите в поля X: 70, Y: 1210, Ширина: 80, Высота: 20.
editbox1. Вставьте ещё пять таких элементов. При вставке ориентируйтесь на клетки рабочего поля. Например, в данном случае между элементами по вертикали две клетки.
Текст, разместите номера типов СС 1…5. Шестому элементу введите имя Сумма.
Текстовое поле и сами элементы. Вставьте скопированное четыре раза.
Текстовое поле горизонтально как на Рис. 5.12.
Текстовое поле с именем editbox37. С использованием элемента Текст введите Коэффициент готовности системы связи.| 1 | 2 | 3 | 4 | 5 | Сумма |
|---|---|---|---|---|---|
| Максимальный доход по типам СС | |||||
| editbox1 | editbox2 | editbox3 | editbox4 | editbox5 | editbox6 |
| Доход от дежурства по типам СС и всего | |||||
| editbox7 | editbox8 | editbox9 | editbox10 | editbox11 | editbox12 |
| Стоимость ремонта по типам СС и всего | |||||
| editbox13 | editbox14 | editbox15 | editbox16 | editbox17 | editbox18 |
| Суммарная прибыль от использования СС и всего | |||||
| editbox19 | editbox20 | editbox21 | editbox22 | editbox23 | editbox24 |
| Коэффициенты прибыли по типам СС и всего | |||||
| editbox25 | editbox26 | editbox27 | editbox28 | editbox29 | editbox30 |
| Затраты на содержание резервов по типам СС и всего | |||||
| editbox31 | editbox32 | editbox33 | editbox34 | editbox35 | editbox36 |
С помощью диаграмм AnyLogic позволяет динамически визуализировать данные, собираемые в результате работы модели. Набор диаграмм схож с тем, что предлагается программой MS Excel. Библиотека обладает мощным и удобным интерфейсом, не требующим при создании диаграммы программирования.
Термин диаграмма используется для обозначения, как обычных диаграмм, так и гистограмм. Гистограммы отображают статистически обработанные данные в виде функции плотности вероятности (PDF) и интегральной функции распределения (CDF), учитывающие все когда-либо добавленные на гистограмму значения. Диаграммы отображают текущие значения элементов данных (а некоторые - также недавнюю историю изменения значений).
AnyLogic поддерживает несколько видов диаграмм.
Простые диаграммы:
Диаграммы с историей (временные диаграммы):
Используйте диаграмму с накоплением.
Диаграмма с накоплением показывает вклад нескольких элементов данных в суммирующий результат в виде столбцов, расположенных друг над другом. Высота каждого столбца пропорциональна значению соответствующего элемента данных.
Самый нижний столбец соответствует элементу данных, добавленному вами на диаграмму первым, затем добавленному вторым и т. д. Не допускается присутствие отрицательных значений - в этом случае возникнет ошибка. Вы можете изменить направление роста столбца и его ширину с помощью свойств Направление и Относительная ширина (они находятся на странице свойств Внешний вид).
Диаграмма с накоплением из палитры Статистика и разместите согласно Рис. 5.12.
Свойства установите: Масштаб: Фиксированный, Обновлять данные автоматически.
Внешний вид установите:Направление: вертикальное
Местоположение и размер введите в поля X: 40, Y: 1510, Ширина: 230, Высота: 180.
Легенда установите Высота: 20, Расположение сверху.
Область диаграммы введите в поля Смещение по оси X: 40, Смещение по оси Y: 10, Ширина: 60, Высота: 140.
Добавить элемент данных.
Заголовок: введите СС1.
Значение: введите Java код
degCC1.statsUtilization.mean()
Диаграмма с накоплением.
Заголовок: вставленных элементов внесите правки для получения имён СС2, СС3, СС4, СС5 соответственно.
Значение: вводите Java коды также для элементов 2…5 соответственно:
degCC2.statsUtilization.mean() degCC3.statsUtilization.mean() degCC4.statsUtilization.mean() degCC5.statsUtilization.mean()
На этом построение сегмента Статистика завершено.
Событие является самым простым способом планирования действий в модели. События часто используются для моделирования задержек и таймаутов. Вы можете сделать это и с помощью срабатывающих по таймауту переходов диаграмм состояний, но использование событий является более рациональным. В некоторых случаях поведение может быть смоделировано только с помощью таймеров.
Есть три типа событий.
Событие, происходящее по истечении таймаута. Оно используется тогда, когда Вам нужно запланировать выполнение какого-то действия на определенный момент времени (отстоящий на заданное количество времени (таймаут) от текущего момента). Событие, происходящее по истечению таймаута, предоставляет дополнительные возможности: вы можете сделать событие циклическим, либо же вообще управлять этим событием "вручную".
Событие, происходящее при выполнении заданного условия. Оно используется тогда, когда Вам нужно отслеживать выполнение определенного условия и производить какое-то действие при его происхождении.
Событие, происходящее с заданной интенсивностью. Оно используется для моделирования потока независимых событий (пуассоновский поток). Это часто требуется при моделировании поступления, например, заявок в системах массового обслуживания.
AnyLogic поддерживает еще один тип события, задаваемый уже другим модельным элементом - динамическое событие. Динамические события используются для планирования сразу нескольких одновременных и независимых событий. Например, канал связи, параллельно передающий произвольное количество сообщений, может быть смоделирован с помощью динамических таймеров, создаваемых для каждого сообщения.
Для вывода результатов моделирования воспользуйтесь событием, происходящим по истечении таймаута.
из палитры Основная на диаграмму размещения элементов Переменная для вывода результатов моделирования (Рис. 5.10). Измените его имя на РезультатыМоделирования. Нажмите Enter.
Отображать имя. С помощью выпадающего списка Tип события: выберите По таймауту.
Режим: Срабатывает один раз.
Время срабатывания (абсолютное) 1000000.
Действие введите Java код, который будет выполняться при появлении этого события.
//Расчет результатов по СС1 DoxDegCC1=round((DoxDegCC1/КолПрогон)*100); DoxDegCC1=DoxDegCC1/100; ZatrRemCC1=round((ZatrRemCC1/КолПрогон)*100); ZatrRemCC1=ZatrRemCC1/100; UbitokCC1=round((1-degCC1.statsUtilization.mean())*main.ubitokCC1*ВремяРабСист*KCC1*100); UbitokCC1=UbitokCC1/100; PribCC1=round((DoxDegCC1-(ZatrResCC1+ZatrRemCC1+UbitokCC1))*100); PribCC1=PribCC1/100; koefPribCC1=round((PribCC1/DoxMaxCC1)*1000); koefPribCC1=koefPribCC1/1000; //Расчет результатов по СС2 DoxDegCC2=round((DoxDegCC2/КолПрогон)*100); DoxDegCC2=DoxDegCC2/100; ZatrRemCC2=round((ZatrRemCC2/КолПрогон)*100); ZatrRemCC2=ZatrRemCC2/100; UbitokCC2=(1-degCC2.statsUtilization.mean())*main.ubitokCC2*ВремяРабСист*KCC2; PribCC2=round((DoxDegCC2-(ZatrResCC2+ZatrRemCC2+UbitokCC2))*100); PribCC2=PribCC2/100; koefPribCC2=round((PribCC2/DoxMaxCC2)*1000); koefPribCC2=koefPribCC2/1000; //Расчет результатов по СС3 DoxDegCC3=round((DoxDegCC3/КолПрогон)*100); DoxDegCC3=DoxDegCC3/100; ZatrRemCC3=round((ZatrRemCC3/КолПрогон)*100); ZatrRemCC3=ZatrRemCC3/100; UbitokCC3=(1-degCC3.statsUtilization.mean())* main().ubitokCC3*ВремяРабСист*KCC3; PribCC3=round((DoxDegCC3-(ZatrResCC3+ZatrRemCC3+UbitokCC3))*100); PribCC3=PribCC3/100; koefPribCC3=round((PribCC3/DoxMaxCC3)*1000); koefPribCC3=koefPribCC3/1000; //Расчет результатов по СС4 DoxDegCC4=round((DoxDegCC4/КолПрогон)*100); DoxDegCC4=DoxDegCC4/100; ZatrRemCC4=round((ZatrRemCC4/КолПрогон)*100); ZatrRemCC4=ZatrRemCC4/100; UbitokCC4=(1-degCC4.statsUtilization.mean())* main.ubitokCC4*ВремяРабСист*KCC4; PribCC4=round((DoxDegCC4-(ZatrResCC4+ZatrRemCC4+UbitokCC4))*100); PribCC4=PribCC4/100; koefPribCC4=round((PribCC4/DoxMaxCC4)*1000); koefPribCC4=koefPribCC4/1000; //Расчет результатов по СС5 DoxDegCC5=round((DoxDegCC5/КолПрогон)*100); DoxDegCC5=DoxDegCC5/100; ZatrRemCC5=round((ZatrRemCC5/КолПрогон)*100); ZatrRemCC5=ZatrRemCC5/100; UbitokCC5=(1-degCC5.statsUtilization.mean())* main.ubitokCC5*ВремяРабСист*KCC5; PribCC5=round((DoxDegCC5-(ZatrResCC5+ZatrRemCC5+UbitokCC5))*100); PribCC5=PribCC5/100; koefPribCC5=round((PribCC5/DoxMaxCC5)*1000); koefPribCC5=koefPribCC5/1000; //Расчет суммарных результатов SumDoxDeg=DoxDegCC1+DoxDegCC2+DoxDegCC3+ DoxDegCC4+DoxDegCC5; SumZatrRem=round((SumZatrRem)*100/КолПрогон); SumZatrRem=SumZatrRem/100; SumUbitok=UbitokCC1+UbitokCC2+UbitokCC3+ UbitokCC4+UbitokCC5; SumPribil=round((SumDoxDeg-(SumZatrRes+SumZatrRem+SumUbitok))*100); SumPribil=SumPribil/100; koefPribil=round((SumPribil/SumDoxMax)*1000); koefPribil=koefPribil/1000; //вывод максимального дохода, дохода от дежурства по типам СС и всего editbox1.setText(DoxMaxCC1); editbox7.setText(DoxDegCC1); editbox2.setText(DoxMaxCC2); editbox8.setText(DoxDegCC2); editbox3.setText(DoxMaxCC3); editbox9.setText(DoxDegCC3); editbox4.setText(DoxMaxCC4); editbox10.setText(DoxDegCC4); editbox5.setText(DoxMaxCC5); editbox11.setText(DoxDegCC5); editbox6.setText(SumDoxMax); editbox12.setText(SumDoxDeg); //вывод стоимости ремонта по типам СС и всего editbox13.setText(ZatrRemCC1); editbox14.setText(ZatrRemCC2); editbox15.setText(ZatrRemCC3); editbox16.setText(ZatrRemCC4); editbox17.setText(ZatrRemCC5); editbox18.setText(SumZatrRem); //вывод чистой прибыли от использования по типам СС и всего editbox19.setText(PribCC1); editbox20.setText(PribCC2); editbox21.setText(PribCC3); editbox22.setText(PribCC4); editbox23.setText(PribCC5); editbox24.setText(SumPribil); //вывод коэфициентов прибыли по типам СС и всего editbox25.setText(koefPribCC1); editbox26.setText(koefPribCC2); editbox27.setText(koefPribCC3); editbox28.setText(koefPribCC4); editbox29.setText(koefPribCC5); editbox30.setText(koefPribil); //вывод затрат на содержание резервов по типам СС и всего editbox31.setText(ZatrResCC1); editbox32.setText(ZatrResCC2); editbox33.setText(ZatrResCC3); editbox34.setText(ZatrResCC4); editbox35.setText(ZatrResCC5); editbox36.setText(SumZatrRes); //вывод коэфициента готовности системы связи КоэфГотСС=(degCC1.statsUtilization.mean()+ degCC2.statsUtilization.mean()+ degCC3.statsUtilization.mean()+ degCC4.statsUtilization.mean()+ degCC5.statsUtilization.mean())/КолТипСС; editbox37.setText(КоэфГотСС);
Из кода следует, что по окончании моделирования, которое длится 1 000 000 единиц модельного времени, сработает метод событие, будут рассчитаны и выведены результаты моделирования.
Для округления результатов моделирования (коэффициентов прибыли до трех знаков после запятой, а абсолютных величин прибыли и затрат - до двух знаков) использован метод round(). Предварительно результат умножался на 1000 и 100, а потом делился на эти же величины.
Для вывода результатов моделирования в текстовые поля editbox используется функция setText(), в качестве аргумента которой указывается имя элемента Переменная, например,
editbox1.setText(DoxMaxCC1);
Мы не акцентировали внимание при построении модели на элементах презентации, которые вы уже видели на некоторых рисунках, для переключения между областями просмотра. Если вы не добавляли их, добавьте и укажите свойства согласно Табл. 5.6.
Синим цветом выделены элементы презентации, предназначенные для перехода по щелчку к соответствующим областям просмотра. Чёрным цветом выделены элементы презентации без перехода к каким-либо областям просмотра.
| Элемент презентации | Действие по щелчку |
|---|---|
| Постановка на дежурство (Рис. 5.7) | |
| Имитация дежурства. Текущие результаты | degurstvo.дежурство.navigateTo(); |
| Статистика | degurstvo.статистика.navigateTo(); |
| Исходные данные | исходные_данные_ПД.navigateTo(); |
| Исходные данные ПД (Рис. 5.3) | |
| Постановка на дежурство | постановка.navigateTo(); |
| Имитация дежурства (Рис. 5.11) | |
| Постановка на дежурство | main.постановка.navigateTo(); |
| Статистика | статистика.navigateTo(); |
| Исходные данные | исходные_данные_Д.navigateTo(); |
| Исходные данные Д (Рис. 5.9) | |
| Постановка на дежурство | main.постановка.navigateTo(); |
| Имитация дежурства | дежурство.navigateTo(); |
| Статистика | статистика.navigateTo(); |
| Текущие результаты (Рис. 5.10) | |
| Постановка на дежурство | main.постановка.navigateTo(); |
| Имитация дежурства | дежурство.navigateTo(); |
| Статистика | статистика.navigateTo(); |
| Статистика (Рис. 5.12) | |
| Постановка на дежурство | main.постановка.navigateTo(); |
| Имитация дежурства | дежурство.navigateTo(); |
| Текущие результаты | текущие_результаты.navigateTo(); |
| Исходные данные | исходные_данные_Д.navigateTo(); |
В ходе построения модели вы можете совершить различные ошибки. Мы же остановимся на одной их тех, которая требует хороших знаний или "тонкостей" AnyLogic.
Запустите модель. Ошибка, о которой мы говорим, появится практически сразу после запуска (Рис. 5.13 и 5.14).
В Библиотеке моделирования процессов реализован pull-протокол передачи заявок между объектами. Суть заключается в том, что следующий объект "вытягивает" заявку из предыдущего объект, если он может её принять. Это работает для объектов, которые могут держать в себе заявку некоторое время. Для примера рассмотрим следующую диаграмму процесса:
...-> split -> selectOutput -> queue -> delay ->...
В этом случае объекты, которые заявка проходит насквозь (split и selectOutput), просматриваются объектами queue и delay, чтобы оценить возможность прохода заявки.
(рис 5.13) Сообщение об ошибке
Если объекты могут принять заявку, они мгновенно "вытягивают" её, вследствии чего код в поле При выходе копии объекта split, который был нами ранее введён (см. Рис. 5.5) не выполняется. Это приводит к некорректной маршрутизация заявок в модели.
Поясним это. На Рис. 5.14 видно, что 64 заявки, соответствующие типу СС1, проходят не через свой выход true, а через выход false как заявки, соответствующие типу СС5. Это может быть только в том случае, когда в поле entity.tipCC ничего не заносится, то есть при неработающем коде в поле При выходе копии объекта split.
Для выполнения некоторых действий заявки, когда она проходит через какое-то место диаграммы процесса, в данном случае перед попаданием в selectOutput, но уже после выхода из split, можно использовать объект plain Transfer. В него вы можете вписать код для действий заявки, который был ранее записан в поле При выходе копии объекта split.
split и входом объекта selectOutput.
Библиотеке моделирования процессов откройте Местоположение и размер.
plain Transfer и соедините его вход с выходом копии объекта split, а выход - со входом объекта selectOutput. Замените тип заявки на ComFacility.
При выходе копии объекта split перепишите в поле При подходе ко входу: объекта plain Transfer.Запустите модель. На Рис. 5.15 и Рис. 5.16 показаны результаты моделирования.
(рис 5.14) Остановка модели по ошибке
(рис 5.15) Результаты моделирования
(рис 5.16) Результаты моделирования в сегменте Статистика
AnyLogic предоставляет пользователю возможность провести следующие эксперименты:
Последние пять экспериментов доступны только в AnyLogic Professional.
Простой эксперимент запускает модель с заданными значениями параметров, поддерживает режимы виртуального и реального времени, анимацию, отладку модели.
При создании модели автоматически создается один простой эксперимент, названный Simulation. Именно такой эксперимент мы с вами и рассматривали до сих пор.
Эксперимент этого типа используется в большинстве случаев. Другие эксперименты нужны тогда, когда важную роль играют значения параметров модели. То есть вам нужно проанализировать, как они влияют на поведение или эффективность моделируемой системы или если вам нужно найти оптимальные параметры вашей модели.
Далее в рамках данного пособия мы остановимся на доступных в версии AnyLogic University экспериментах оптимизации и варьирования переменных, овладев методиками проведения которых, вы самостоятельно сможете выполнять в AnyLogic Professional и другие эксперименты.
Начиная создавать модель в AnyLogic, мы ничего не говорили об экспериментах и особенностях их проведения. Поэтому все исходные данные разместили на Исходные_данные_ПД (Рис. 5.3) и Исходные_данные_Д (Рис. 5.9) так, как нам представлялось удобным для построения модели и управления ею в ходе проведения простого эксперимента.
При проведении эксперимента и наличии в модели, как у нас, вложенных объектов, нужно связывать параметры корневого объекта и вложенных объектов, так как изменять в ходе эксперимента можно только параметры корневого объекта. В результате связывания значение параметра любого уровня вложенного объекта будет равно значению параметра объекта самого верхнего уровня.
Но следует иметь в виду, что связываются только параметры одного типа и что передача значения параметра производится лишь параметру объекта, находящемуся ниже уровнем в иерархическом дереве модели. То есть связываются параметры последовательно от одного уровня к другому, а не через уровень или уровни.
Разместите элементы, как показано на Рис. 5.17. Внесите соответствующие изменения в модель. Обратите внимание на различие имён связываемых параметров, например, КССР_1.
Свяжите параметры корневого типа агента Main с параметрами вложенного объекта типа агента Degyrstvo.
Свойства. В таблице Параметры в поле Значение введите имя параметра типа агента-владельца Main, значение которого нужно передавать параметру вложенного объекта. В результате у вас должно быть так, как на Рис. 5.18.
(рис 5.17) Размещение элементов на Исходные_данные_ПД
(рис 5.18) Фрагмент страницы Параметры после связывания параметров
Эксперимент Оптимизация может проводиться в AnyLogic оптимизатором OptQuest для детерминированных и стохастических моделей.
Наша модель Система связи стохастическая. Создайте оптимизационный эксперимент стохастической модели с целью определения максимального коэффициента прибыли в зависимости от количества резервных СС и мастеров-ремонтников.
Проект Щёлкните правой кнопкой мыши элемент модели Система_связи и из контекстного меню выберите Coздать/ Эксперимент. В появившемся диалоговом окне из списка Тип эксперимента: выберите Оптимизация (Рис. 5.19).
(рис 5.19) Диалоговое окно Новый эксперимент
Имя: введите имя эксперимента, например, Система_связи_Оптимизация1. Имя эксперимента должно начинаться с заглавной буквы - правило названия классов в Java.
Агент верхнего уровня: выберите Main. Этим действием вы задали корневой (главный) класс эксперимента. Объект этого класса будет играть роль корня иерархического дерева объектов модели, запускаемой оптимизационным экспериментом.
Копировать установки модельного времени из: и выберите эксперимент из расположенного справа выпадающего списка. В данном случае оставьте, так как есть: Simulation.
Готово. Появится страница Основные панели Свойства (Рис. 5.20).
максимизировать.
Целевая функция введите root.degurstvo.koefPribil.
Случайность установите Фиксированное начальное число (воспроизводимые прогоны).
Начальное число введите 5672.
Количество итераций:. Под итерацией понимается один опыт (одно наблюдение). Количество итераций - это цель стратегического планирования эксперимента - определение количества наблюдений и уровней факторов в них для получения полной и достоверной информации о модели.
где $$k_i$$ - число уровней i-го фактора, $$i=\overline{1,m}$$.
КССР_1…КССР_5 и количество мастеров-ремонтников Kol_master, то есть всего m=6 факторов. Факторы имеют следующие уровни: $$k_1=3, k_2=k_3=k_4=6, k_5=k_6=5$$. Тогда число итераций
$$I=k_1\cdot k_2 \cdot k_3 \cdot k_4 \cdot k_5 \cdot k_6 \cdot = 3 \cdot 6 \cdot 6 \cdot 6 \cdot 5\cdot 5 = 16200.$$
(рис 5.20) Вкладка Основные оптимизационного эксперимента
Количество итераций:, так как данная версия AnyLogic ограничена этим количеством итераций.
Тип. Выберите тип параметра, отличный от значения фиксированный. Так как параметр KCCР_1 целочисленный типа int, выберите дискретный.
Мин. минимальное значение 1, в ячейку Макс. максимальное значение, например, для КССР1, 3. Так как параметр дискретный, в ячейке Шаг укажите величину шага 1.
Репликации панели Свойства.
Использовать репликации.
где $$t_\alpha =1,96$$ - табулированный аргумент функции Лапласа.
Возможность переменного количества репликаций позволяет оптимизатору OptQust проверять на статистическую значимость разницу между средним значением целевой функции в текущей итерации и лучшим значением, найденным за предыдущие итерации (лучшее значение). Целью такой проверки является удаление худших решений без потери времени на их получение. Таким образом, процесс может быть ускорен за счёт прекращения поиска неподходящих решений вместо выполнения заданного максимального количества репликаций модели.
Репликации выберите опцию Фиксированное количество репликаций и в поле Количество репликаций за итерацию: установите рассчитанное число репликаций (прогонов) модели 4.
Основные. Щёлкните кнопку Создать интерфейс. После щелчка удаляется содержимое презентации эксперимента и создаётся интерфейс эксперимента заново (Рис. 5.21) согласно его текущим установкам (набору оптимизационных параметров и их свойствам и т. д.). Поэтому создавать интерфейс нужно только после окончания задания параметров эксперимента. На интерфейсе видны знаки вопросов напротив оптимизационных параметров.
(рис 5.21) Интерфейс оптимизационного эксперимента
(рис 5.22) Результаты первого оптимизационного эксперимента
Система_связи / Система_связи_Оптимизация1.
Запустить. Начнёт выполняться эксперимент, в ходе которого можно видеть на графике изменения значения целевой функции. После 200*4=800 прогонов (Рис. 5.22) эксперимент остановится.
KCCP_1 = KCCP_2 = KCCP_4 = KCCP_5 = Kol_master =1, KCCP_3 = 6.Создайте и проведите второй оптимизационный эксперимент при тех же условиях с целью определения коэффициента готовности системы связи.
При размещении параметров для ввода исходных данных и последующем их связывании мы не задумывались над тем, как они будут размещены на страницах свойств и тем более в интерфейсе оптимизационного эксперимента.
Но теперь нас не устраивает то, что оптимизируемые параметры размещены последними в интерфейсе первого оптимизационного эксперимента (Рис. 5.20, 5.21, 5.22). Предположим, что нам не нужны на рисуне все параметры модели, а нужны только оптимизируемые.
Разместите оптимизируемые параметры в верхних частях страниц свойств соответствующих объектов.
Предв. просмотр параметров.
КССР_1 и, щёлкая по верхней стрелке, расположенной справа от поля параметра, переместите его в верхнюю часть страницы свойств (Рис. 5.23).
КССР_2… КССР_5 и Kol_master. У вас должно быть так, как на Рис. 5.24.
Degurstvo. На панели свойств откройте страницу Предв. просмотр параметров.
КССР1…КССР5 и kol_master в верхнюю часть страницы свойств.
(рис 5.23) Перемещение параметра на странице предварительного просмотра
(рис 5.24) Оптимизируемые параметры перемещены в верхнюю часть страницы свойств типа агента Main
Итак, второй оптимизационный эксперимент проводится при тех же условиях, что и первый оптимизационный эксперимент.
Проект Щёлкните правой кнопкой мыши элемент модели Система_связи и из контекстного меню выберите Coздать/Эксперимент. В диалоговом окне из списка Тип эксперимента: выберите Оптимизация.
Имя: введите Система_связи_Оптимизация2 имя эксперимента.
Целевая функция введите: root.degurstvo.КоэфГотСС
Случайность установите Фиксированное начальное число (воспроизводимые прогоны).
Начальное число введите 5672.
Репликации выберите опцию Фиксированное количество репликаций и в поле Количество репликаций за итерацию: установите число репликаций (прогонов) модели 4.
Создать интерфейс. Обратите внимание, что оптимизируемые параметры расположены вверхней части. Запустите модель.
В результате второго эксперимента (Рис. 5.25) наилучшее значение целевой функции - коэффициент готовности системы связи равен 0,813. Получен он на 35-й итерации при следующих оптимальных значениях параметров: KCCP_1 = KCCP_2 =1, KCCP_3 = KCCP_4 = 6, KCCP_5 = 5, Kol_master = 5.
KCCP_1…KCCP_5 и Kol_master на Исходные_данные_ПД на значения, полученные в первом оптимизационном эксперименте.
KCCP_1…KCCP_5 и Kol_master на Исходные_данные_ПД на значения, полученные во втором оптимизационном эксперименте.
(рис 5.25) Результаты второго оптимизационного эксперимента
Эксперимент Варьирование параметров может проводиться только для детерминированных моделей.
Создайте эксперимент Варьирование параметров для стохастической модели Система_связи с целью наблюдения за изменением коэффициента готовности в зависимости от количества резервных СС и мастеров-ремонтников.
Проект Щёлкните правой кнопкой мыши элемент модели Система_связи и из контекстного меню выберите Создать эксперимент.
Тип эксперимента: выберите Варьирование параметров.
Имя введите имя эксперимента, например, Система_связи_Вар_параметров.
Готово. Появится страница Параметры панели Свойства (Рис. 5.26).
Параметры по сравнению с оптимизационным экспериментом отсутствуют опции минимизировать, максимизировать, Количество итераций. Последнее определяется AnyLogic в зависимости от диапазонов и шагов изменения параметров. Не используются и репликации, по
Тип. Выберите тип параметра, отличный от значения фиксированный. Параметр КССР_1 типа int, поэтому он может изменяться в диапазоне. Выберите Диапазон. В ячейку Мин введите минимальное значение 1, в ячейку Макс - максимальное значение 3, в ячейке Шаг укажите величину шага 1.
Основные и щёлкните кнопку Создать интерфейс.
Варьирование параметров в отличие от эксперимента Оптимизация интерфейс создаёт пользователь. Связано это с тем, что выходными результатами данного эксперимента могут быть любые показатели моделируемой системы.
(рис 5.26) Страница Параметры эксперимента варьирования параметров
График из палитры Статистика на диаграмму.
Местоположение и размер и установите:
X: 260, Y: 100, Ширина: 510, Высота: 400, Цвет фона: Нет заливки, Цвет границы: Нет линии.
Добавить элемент данных.
Набор данных. Заголовок: КоэфГотСС. Набор данных: dataset. Установите Не обновлять данные автоматически.
Область диаграммы. Установите: Смещение по Х: 50, Смещение по Y: 30, Ширина: 450, Высота: 330.
Статистика перетащите элемент Набор данных. Установите опцию Не обновлять автоматически.
Основная перетащите элемент Переменная. На панели Свойства в поле Имя: введите коэфГотСС. Установите Уровень доступа: public. Тип: double.
Действия Java панели Свойства и введите коды:Действие после прогона модели:
коэфГотСС = root.degurstvo.КоэфГотСС;
Действие после итерации
dataset.add(getCurrentIteration(),коэфГотСС);
Система_связи / Система_связи_Вар_параметров.
Запустить.
Варьирование параметров приведен на Рис. 5.28.
КССР_1=КССР_5 = kol_master =1, КССР_2= КССР_3=5, КССР_4=3.
(рис 5.27) Интерфейс эксперимента варьирования параметров
(рис 5.28) Фрагмент результатов выполнения эксперимента Варьирование параметров
Модели AnyLogic являются приложением Java, поэтому их можно запускать на большинстве современных платформ, а также помещать на веб-сайты в виде апплетов.
Наличие такой возможности позволяет удалённым пользователям запускать интерактивные модели в веб-браузере при отсутствии AnyLogic или какого-либо другого программного обеспечения. В этом случае на клиентской машине будут запускаться скопированные из сети файлы модели с такой же поддержкой интерактивной работы, что и при запуске из среды AnyLogic.
Экспортируйте модель ComSystem в виде Java апплета.
Экспорт/В Java апплет (запускается в веб браузере) из контекстного меню.
Экспорт модели (Рис. 5.29). Щелчком мыши раскройте список Экспортировать эксперимент и выберите в нем Simulation. Настройки этого эксперимента будут применены к экспортируемой модели.
Каталог для создаваемых файлов укажите каталог, в который вы хотите поместить файлы экспортируемой модели. Можно также выбрать каталог с помощью диалогового окна навигации, которое становится доступным при нажатии кнопки Выбрать.
Язык: <системный по-умолчанию>). При необходимости можно выбрать для интерфейса апплета другой язык из выпадающего списка Язык: (на данный момент AnyLogic поддерживает русский, английский, китайский, немецкий и итальянский языки).
(рис 5.29) Диалоговое окно Экспорт модели
(рис 5.30) Набор файлов Java апплет
Открыть апплет модели в веб браузере.
Готово. Откроется диалоговое окно, в котором будет сообщение об успешном завершении экспортирования модели ComSystem: Модель ComSystem была экспортирована в G:\BOEV.
OK.Модель, экспортированная как Java апплет, представляет собой набор следующих файлов (Рис. 5.30):
При публикации апплета модели в сети Интернет нужно предоставить доступ ко всем этим файлам из кода апплета. Это значит, что если вы добавляете ссылку на .html файл модели на веб страницу, то необходимо разместить все эти файлы в той же директории, где и этот .html файл. Для показа апплета на своей веб странице следует скопировать код апплета из .html файла модели в код своей страницы, и добавить все файлы, сгенерированные при экспорте модели, в тот же каталог, где находится ваша страница.
Запустите апплет модели, дважды щелкнув ComSystem.html. Результаты работы апплета модели показаны на Рис. 5.31. Коэффициент прибыли равен 0,949 (см. п. 5.1.8.3).
(рис 5.31) Результаты работы апплета модели ComSystem
Как уже отмечалось, система связи представляет собой многофазную многоканальную систему массового обслуживания замкнутого типа с отказами и ожиданием.
Какие ограничения в системе?
Для моделирования двух первых ограничений целесообразно использовать МКУ, а для третьего и четвертого ограничений - транзакты.
Модель системы связи должна состоять из следующих сегментов:
Сегмент переопределения блоков модели необходим для изменения версий модели, т. е. изменения количества резервных СС и мастеров-ремонтников в ремонтном подразделении, а также номеров строк и столбцов матриц, в которые записываются результаты моделирования. Количество переопределений в сегменте соответствует числу версий модели минус один.
Предполагается, что количество типов СС в системе предоставления услуг связи может изменяться от одного до максимального значения n2_. Программа модели, как уже омечалось при разработке AnyLogic-модели, построена для n2_ = 5.
Для хранения результатов моделирования используются матрицы. В целях придания неизменности программы модели при варьировании количеством типов СС матрицы должны быть пронумерованы. Однако GPSS World при описании матриц командой MATRIX не позволяет вместо имени указывать число. Матрицы нужно вначале описать, дав им имена, а затем пронумеровать.
Результаты моделирования для одного типа СС хранятся в семи матрицах, например, для СС типа 1 (СС1) с идентификаторами:
Prib1 - матрица ожидаемой прибыли СС1;
KPr1 - матрица коэффициентов прибыли СС1;
KZen1 - матрица коэффициентов использования СС1;
DoxMax1 - матрица максимальных доходов от СС1;
DoxDeg1 - матрица доходов от дежурства СС1;
ZatrRem1 - матрица затрат на ремонт СС1;
ZatrResSS1 - матрица затрат на резервные СС1.Значит, аналогичных матриц будет тридцать пять. Да плюс еще матрица KRem коэффициентов использования мастеров - ремонтников. Именам этим тридцати шести матрицам даны номера.
Три матрицы для хранения суммарных результатов моделирования для СС всех типов не нумеровались:
Pribil - матрица суммарной прибыли;
SrKPrib - матрица средних коэффициентов прибыли СС всех типов;
SrKIsp - матрица коэффициентов использования СС всех типов.Именам пяти МКУ СС1_, СС2_, СС3_, СС4_ и СС5_, имитирующим по типам СС, находящиеся на дежурстве, даны номера 1 … 5. Это позволяет сократить число блоков в модели за счет того, что вместо пяти (в данном варианте модели) сегментов имитации постановки на дежурство СС используется один сегмент.
Для записи исходных данных: количества СС всех типов (в том числе и резервных), среднего времени наработки на отказ и среднего времени восстановления по типам СС, дохода по типам от одного СС, находящегося на дежурстве, убытка по типам при отсутствии одного СС на дежурстве, стоимости по типам одного резервного СС используются функции KolSS, KollSSRes, NarOtk, SrVrRem, S1_, S2_, S3_ соответственно. Этот способ по сравнению со способом использования матриц для записи этих же данных позволяет сократить программу модели на двадцать пять строк.
В начале работы модели генератор сразу вырабатывает количество транзактов, равное соответствующему количеству типов СС, и перестает быть активным.
Далее блоками SAVEVALUE и ASSIGN в параметр 1 каждого из транзактов последовательно заносятся коды 1…n1_ - признак типа СС.
Затем каждый из транзактов с помощью блока SPLIT расщепляется (копируется, размножается) по количеству СС (с учетом резервных СС) соответствующего типа.
После расщепления транзакты в соответствии с типом СС сразу занимают все каналы МКУ, имитирующие нахождение СС на дежурстве. Резервные СС остаются в списках задержки соответствующих МКУ.
Вышедшее из строя СС снимается с дежурства, поступает в ремонтное подразделение - транзакт либо занимает свободный канал МКУ Rem, если такой есть, либо при отсутствии свободного канала помещается в список задержки этого МКУ - список транзактов, ожидающих возможность занять освободившиеся каналы МКУ.
После ремонта СС отправляется либо сразу на дежурство, либо в резерв. В обоих случаях транзакт направляется на метку Met1. Здесь также транзакт либо занимает свободный канал, либо помещается в список задержки МКУ, соответствующего типу СС.
Ниже приводится программа только (в целях сокращения) для моделирования случая три мастера-ремонтника, а резервных СС2 - четыре, пять и шесть.
; Модель функционирования системы связи ; Задание номеров матрицам Prib1 EQU 1 ; Матрица ожидаемой прибыли СС1 KPr1 EQU 2 ; Матрица коэффициентов прибыли СС1 KZen1 EQU 3 ; Матрица коэффициентов использования СС1 DoxMax1 EQU 4 ; Матрица максимальных доходов СС1 DoxDeg1 EQU 5 ; Матрица доходов от дежурства СС1 ZatrRem1 EQU 6 ; Матрица затрат на ремонт СС1 ZatrResSS1 EQU 7 ; Матрица затрат на резервные СС1 Prib2 EQU 8 ; Матрица ожидаемой прибыли СС2 KPr2 EQU 9 ; Матрица коэффициентов прибыли СС2 KZen2 EQU 10 ; Матрица коэффициентов использования СС2 DoxMax2 EQU 11 ; Матрица максимальных доходов СС2 DoxDeg2 EQU 12 ; Матрица доходов от дежурства СС2 ZatrRem2 EQU 13 ; Матрица затрат на ремонт СС2 ZatrResSS2 EQU 14 ; Матрица затрат на резервные СС2 Prib3 EQU 15 ; Матрица ожидаемой прибыли СС3 KPr3 EQU 16 ; Матрица коэффициентов прибыли СС3 KZen3 EQU 17 ; Матрица коэффициентов использования СС3 DoxMax3 EQU 18 ; Матрица максимальных доходов СС3 DoxDeg3 EQU 19 ; Матрица доходов от дежурства СС3 ZatrRem3 EQU 20 ; Матрица затрат на ремонт СС3 ZatrResSS3 EQU 21 ; Матрица затрат на резервные СС3 Prib4 EQU 22 ; Матрица ожидаемой прибыли СС4 KPr4 EQU 23 ; Матрица коэффициентов прибыли СС4 KZen4 EQU 24 ; Матрица коэффициентов использования СС4 DoxMax4 EQU 25 ; Матрица максимальных доходов СС4 DoxDeg4 EQU 26 ; Матрица доходов от дежурства СС4 ZatrRem4 EQU 27 ; Матрица затрат на ремонт СС4 ZatrResSS4 EQU 28 ; Матрица затрат на резервные СС4 Prib5 EQU 29 ; Матрица ожидаемой прибыли СС5 KPr5 EQU 30 ; Матрица коэффициентов прибыли СС5 KZen5 EQU 31 ; Матрица коэффициентов использования СС5 DoxMax5 EQU 32 ; Матрица максимальных доходов СС5 DoxDeg5 EQU 33 ; Матрица доходов от дежурства СС5 ZatrRem5 EQU 34 ; Матрица затрат на ремонт СС5 ZatrResSS5 EQU 35 ; Матрица затрат на резервные СС5 KRem EQU 36 ; Матрица коэффициентов использования Rem ; Задание номеров МКУ, имитирующих дежурство СС CC1_ EQU 1 ; Задание номера МКУ СС1 CC2_ EQU 2 ; Задание номера МКУ СС2 CC3_ EQU 3 ; Задание номера МКУ СС3 CC4_ EQU 4 ; Задание номера МКУ СС4 CC5_ EQU 5 ; Задание номера МКУ СС5 ; Задание по типам количества СС, находящихся на дежурстве n2_ EQU 5 ; Количество типов СС VrMod EQU 1000 ; Время моделирования, 1 ед. мод. вр. = 1 час KolProg EQU 1000 Stroka EQU 1 ; Номер строки матрицы Stolbez EQU 1 ; Номер столбца матрицы Prib1 MATRIX ,3,3 ; Матрица ожидаемой прибыли СС1 KPr1 MATRIX ,3,3 ; Матрица коэффициентов прибыли СС1 KZen1 MATRIX ,3,3 ; Матрица коэффициентов загрузки СС1 DoxMax1 MATRIX ,3,3 ; Матрица максимальных доходов СС1 DoxDeg1 MATRIX ,3,3 ; Матрица доходов от дежурства СС1 ZatrRem1 MATRIX ,3,3 ; Матрица затрат на ремонт СС1 ZatrResSS1 MATRIX ,3,3 ; Матрица затрат на резервные СС1 Prib2 MATRIX ,3,3 ; Матрица ожидаемой прибыли СС2 KPr2 MATRIX ,3,3 ; Матрица коэффициентов прибыли СС2 KZen2 MATRIX ,3,3 ; Матрица коэффициентов загрузки СС2 DoxMax2 MATRIX ,3,3 ; Матрица максимальных доходов СС2 DoxDeg2 MATRIX ,3,3 ; Матрица доходов от дежурства СС2 ZatrRem2 MATRIX ,3,3 ; Матрица затрат на ремонт СС2 ZatrResSS2 MATRIX ,3,3 ; Матрица затрат на резервные СС2 Prib3 MATRIX ,3,3 ; Матрица ожидаемой прибыли СС3 KPr3 MATRIX ,3,3 ; Матрица коэффициентов прибыли СС3 KZen3 MATRIX ,3,3 ; Матрица коэффициентов загрузки СС3 DoxMax3 MATRIX ,3,3 ; Матрица максимальных доходов СС3 DoxDeg3 MATRIX ,3,3 ; Матрица доходов от дежурства СС3 ZatrRem3 MATRIX ,3,3 ; Матрица затрат на ремонт СС3 ZatrResSS3 MATRIX ,3,3 ; Матрица затрат на резервные СС3 Prib4 MATRIX ,3,3 ; Матрица ожидаемой прибыли СС4 KPr4 MATRIX ,3,3 ; Матрица коэффициентов прибыли СС4 KZen4 MATRIX ,3,3 ; Матрица коэффициентов загрузки СС4 DoxMax4 MATRIX ,3,3 ; Матрица максимальных доходов СС4 DoxDeg4 MATRIX ,3,3 ; Матрица доходов от дежурства СС4 ZatrRem4 MATRIX ,3,3 ; Матрица затрат на ремонт СС4 ZatrResSS4 MATRIX ,3,3 ; Матрица затрат на резервные СС4 Prib5 MATRIX ,3,3 ; Матрица ожидаемой прибыли СС5 KPr5 MATRIX ,3,3 ; Матрица коэффициентов прибыли СС5 KZen5 MATRIX ,3,3 ; Матрица коэффициентов загрузки СС5 DoxMax5 MATRIX ,3,3 ; Матрица максимальных доходов СС5 DoxDeg5 MATRIX ,3,3 ; Матрица доходов от дежурства СС5 ZatrRem5 MATRIX ,3,3 ; Матрица затрат на ремонт СС5 ZatrResSS5 MATRIX ,3,3 ; Матрица затрат на резервные СС5 KRem MATRIX ,3,3 ; Матрица коэффициентов загрузки Rem Pribil MATRIX ,3,3 ; Матрица суммарной прибыли SrKPrib MATRIX ,3,3 ; Матрица коэффициентов прибыли СС всех типов SrKIsp MATRIX ,3,3 ; Матрица коэффициентов загрузки СС всех типов ; Определение МКУ по количеству СС, находящихся на дежурстве CC1_ STORAGE 55 ; Емкость МКУ по количеству СС1 CC2_ STORAGE 100 ; Емкость МКУ по количеству СС2 CC3_ STORAGE 60 ; Емкость МКУ по количеству СС3 CC4_ STORAGE 45 ; Емкость МКУ по количеству СС4 CC5_ STORAGE 60 ; Емкость МКУ по количеству СС5 Rem STORAGE 3 ; Емкость МКУ по числу мастеров-ремонтников ; Описание арифметических выражений DoxMax VARIABLE VrMod#FN$S1_#FN$KolSS ; Максимальный доход от дежурства СС Ubitok VARIABLE VrMod#FN$KolSS#(1-(SR*1/1000))#FN$S2_;Убыток от отсутствия на дежурстве СС DoxDeg VARIABLE (AC1-P$Nach1)#FN$S1_ ; Полученный доход от дежурства СС StoRem VARIABLE (AC1-P$Nach)#FN$StoMast ; Стоимость ремонта неисправных СС ZatrResSS VARIABLE FN$S3_#FN$KolSSRes#VrMod; Затраты на содержание резервных СС SumPrib VARIABLE X$DoxDeg-(X$ZatrRem+MX*4(Stroka,Stolbez)+V$Ubitok) ; Прибыль KoefPr VARIABLE MX*6(Stroka,Stolbez)/X$DoxMax; Коэффициент прибыли StoMast FUNCTION P1,D5 ; Стоимость работы одного мастера 1,17/2,18/3,16/4,20/5,21 KolSS FUNCTION P1,D5 ; Количество по типам СС, находящихся на дежурстве 1,55/2,100/3,60/4,45/5,60 KolSSRes FUNCTION P1,D5 ; Количество по типам резервных СС 1,2/2,4/3,4/4,3/5,4 NarOtk FUNCTION P1,D5 ; Среднее время наработки до отказа по типам СС, час 1,373/2,301/3,482/4,325/5,470 SrVrRem FUNCTION P1,D5 ; Среднее время ремонта по типам СС, час 1,6.5/2,4.2/3,2.8/4,3/5,5.5 S1_ FUNCTION P1,D5 ; Доход по типам от одного СС, находящегося на дежурстве 1,20/2,24.2/3,32.8/4,23/5,25.5 S2_ FUNCTION P1,D5 ; Убыток по типам при отсутствии одного СС на дежурстве 1,32/2,34.2/3,37/4,31/5,32.5 S3_ FUNCTION P1,D5 ; Затраты по типам на содержание одного резервного СС 1,21/2,24.2/3,28/4,26/5,25.5 ; Сегмент постановки на дежурство СС GENERATE ,,,n2_ SAVEVALUE TipSS+,1 ; Код 1 ... n2_ - признак СС1 CCn2 в X$TipSS ASSIGN 1,X$TipSS ; Код 1 ... n2_ - признак СС1 CCn2_ в P1 SPLIT (FN$KolSS+FN$KolSSRes-1) ; Число СС + резервные СС ; Сегмент имитации дежурства СС Met1 ENTER P1 ; Встать на дежурство СС типа, номер которого в Р1 ASSIGN Nach1,AC1 ; Время начала дежурства ADVANCE (Exponential(5672,0,FN$NarOtk)) ; Имитация выхода СС из строя, номер которого в Р2 LEAVE P1 ; Снятие с дежурства из-за выхода из строя СС типа, номер которого в Р1 ASSIGN 3,0 Met3 ASSIGN 3+,1 ; Начало цикла изменения типов СС TEST E P1,P3,Met4 ; Р1=Р3? ASSIGN 4,(P1#7) ; Р4=Р1#7 ASSIGN 5,(P4-2) ; Номера матриц: 5,12,19,26,33 MSAVEVALUE *5+,Stroka,Stolbez,V$DoxDeg ; MSAVEVALUE Pribil+,Stroka,Stolbez,V$DoxDeg Met4 TEST GE P3,n2_,Met3 ; Все ли типы СС? ; Сегмент имитации работы ремонтного подразделения ENTER Rem ; Занять одного мастера ASSIGN Nach,AC1 ; Время начала дежурства ADVANCE (Exponential(5672,0,FN$SrVrRem)) ; Имитация ремонта LEAVE Rem ; Конец ремонта ASSIGN 3,0 Met5 ASSIGN 3+,1 ; Начало цикла изменения типов СС TEST E P1,P3,Met6 ; Р1=Р3? ASSIGN 4,(P1#7) ; Р4=Р1#7 ASSIGN 5,(P4-1) ; Номера матриц: 6,13,20,27,34 MSAVEVALUE *5+,Stroka,Stolbez,V$StoRem ; MSAVEVALUE Pribil+,Stroka,Stolbez,V$StoRem Met6 TEST GE P3,n2_,Met5 ; Все ли типы СС? TRANSFER ,Met1 ; Направить исправное СС на дежурство или в резерв ; Сегмент задания времени моделирования и расчета результатов GENERATE VrMod TEST E TG1,1,Met2 ASSIGN 1,0 Met7 ASSIGN 1+,1 ; Начало цикла изменения типов СС ASSIGN 2,(P1#7) ; Р2=Р1#7 ASSIGN 9,(P2-2) ; Номера матриц: 5,12,19,26,33 SAVEVALUEDoxDeg,((MX*9(Stroka,Stolbez))/KolProg);Доход от дежурства MSAVEVALUE *9,Stroka,Stolbez,X$DoxDeg ASSIGN 3,(P2-3) ; Номера матриц: 4,11,18,25,32 MSAVEVALUE *3,Stroka,Stolbez,V$DoxMax; Максимально возможный доход от дежурства СС SAVEVALUE DoxMax,MX*3(Stroka,Stolbez) ASSIGN 4,(P2-0) ; Номера матриц: 7,14,21,28,35 MSAVEVALUE *4,Stroka,Stolbez,V$ZatrResSS ; Затраты на резервные СС ASSIGN 5,(P2-1) ; Номера матриц: 6,13,20,27,34 SAVEVALUE ZatrRem,((MX*5(Stroka,Stolbez))/KolProg) MSAVEVALUE *5,Stroka,Stolbez,X$ZatrRem ASSIGN 6,(P2-6) ; Номера матриц: 1,8,15,22,29 MSAVEVALUE *6,Stroka,Stolbez,V$SumPrib ASSIGN 7,(P2-5) ; Номера матриц: 2,9,16,23,24 MSAVEVALUE *7,Stroka,Stolbez,V$KoefPr MSAVEVALUE Pribil+,Stroka,Stolbez, MX*6(Stroka,Stolbez) ; Суммарная прибыль по СС всех типов ASSIGN 8,(P2-4) MSAVEVALUE SrKPrib+,Stroka,Stolbez,(MX*7(Stroka,Stolbez)/n2_) ; Средний коэффициент прибыли по СС всех типов MSAVEVALUE *8,Stroka,Stolbez,(SR*1/1000) ; Коэффициент использования CC MSAVEVALUE SrKIsp+,Stroka,Stolbez,(SR*1/(1000#n2_)) ; Средний коэффициент использования CC всех типов TEST GE P1,n2_,Met7 ; Все ли типы СС? MSAVEVALUE 31,Stroka,Stolbez,(SR$Rem/1000); Коэффициент использования Rem SAVEVALUE TipSS,0 Met2 TERMINATE 1 START 1000,NP ; Вариант1: ССР2=4, мастеров=3 KolSSres FUNCTION P1,D5 1,2/2,5/3,4/4,4/5,4 Stolbez EQU 2 CLEAR OFF START 1000,NP ; Вариант2: ССР2=5, мастеров=3 KolSSres FUNCTION P1,D5 1,2/2,6/3,4/4,4/5,4 Stolbez EQU 3 CLEAR OFF START 1000,NP ; Вариант3: ССР2=6, мастеров=3 KolSSres FUNCTION P1,D5 1,2/2,4/3,4/4,4/5,4 Stroka EQU 2 Stolbez EQU 1 Rem STORAGE 4 ; Емкость МКУ по числу мастеров-ремонтников CLEAR OFF START 1000,NP ; Вариант4: ССР2=4, мастеров=4 KolSSres FUNCTION P1,D5 1,2/2,5/3,4/4,4/5,4 Stolbez EQU 2 CLEAR OFF START 1000,NP ; Вариант5: ССР2=5, мастеров=4 KolSSres FUNCTION P1,D5 1,2/2,6/3,4/4,4/5,4 Stolbez EQU 3 CLEAR OFF START 1000,NP ; Вариант6: ССР2=6, мастеров=4 KolSSres FUNCTION P1,D5 1,2/2,4/3,4/4,4/5,4 Stroka EQU 3 Stolbez EQU 1 Rem STORAGE 5 ; Емкость МКУ по числу мастеров-ремонтников CLEAR OFF START 1000,NP ; Вариант7: ССР2=4, мастеров=5 KolSSres FUNCTION P1,D5 1,2/2,5/3,4/4,4/5,4 Stolbez EQU 2 CLEAR OFF START 1000,NP ; Вариант8: ССР2=5, мастеров=5 KolSSres FUNCTION P1,D5 1,2/2,6/3,4/4,4/5,4 Stolbez EQU 3 CLEAR OFF START 1000 ; Вариант9: ССР2=6, мастеров=5
В программе, кроме методов применения матриц и функций, показывается метод изменения версий модели. Изменение версий модели производится переопределением соответствующих блоков. Переопределяться не могут только блоки GENERATE. Для переопределения блоков, описывающих ОКУ и МКУ, они должны иметь метки. В командах START, кроме последней, указывается операнд В - NP - не выводить отчёт. Однако одного переопределения блоков недостаточно. В GPSS World изменение версий модели достигается также за счет использования команды CLEAR.
В рассматриваемом примере в процессе моделирования необходимо собирать статистику по версиям модели. Нужная собранная статистика должна быть сохранена, а ненужная - сброшена.
Процесс моделирования в исходное состояние возвращает команда CLEAR. Формат записи команды:
CLEAR [A]
Операнд А может быть ON либо OFF. По умолчанию - ON.
Команда CLEAR сбрасывает всю накопленные статистические данные, удаляет все транзакты из процесса моделирования и заполняет все блоки GENERATE первым транзактом. ОКУ и МКУ становятся доступными, устанавливаются в незанятое состояние. Содержимое всех блоков становится нулевым. Генераторы случайных чисел не сбрасываются.
Если в команде CLEAR операнд А равен OFF, то сохраняемые ячейки, матрицы и логические ключи остаются без изменений. Поэтому в модели в команде CLEAR используется операнд А, равный OFF, так как нужно сохранить результаты моделирования предыдущей версии модели.
Однако при этом нужно иметь в виду те ячейки, начальные значения которых должны быть нулевыми в новой версии модели. Необходимо предусмотреть в программе блоки приведения таких ячеек в исходное состояние. В данной модели это показано на примере сохраняемой ячейки TipSS. Если эту ячейку не привести в нулевое состояние, процесс моделирования второй версии будет остановлен по ошибке "Обращение к несуществующей памяти".
Поскольку накопленные и сохраненные в матрицах результаты моделирования нет необходимости выводить после каждого варианта, то в команде START используется операнд В, равный ON. В последней команде START операнд В не используется. Поэтому стандартный отчет выдаётся после завершения моделирования. В рассматриваемом примере - после девяти наблюдений.
Ниже показан фрагмент журнала с информацией о ходе моделирования. В первом наблюдении (первой версии модели) модельное время изменяется от 0 до 1 000 000 единиц модельного времени (1000 прогонов # 1000 часов работы моделируемой системы).
После переопределения (формирования второй версии модели) выполняется команда CLEAR и абсолютное модельное время вновь изменяется от 0 до 1 000 000 единиц модельного времени.
07/11/11 16:56:06 Model Translation Begun. 07/11/11 16:56:06 Ready. 07/11/11 16:56:06 Simulation in Progress. 07/11/11 16:56:26 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:56:26 Simulation in Progress. 07/11/11 16:56:46 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:56:46 Simulation in Progress. 07/11/11 16:57:06 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:57:06 Simulation in Progress. 07/11/11 16:57:31 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:57:31 Simulation in Progress. 07/11/11 16:57:55 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:57:55 Simulation in Progress. 07/11/11 16:58:19 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:58:19 Simulation in Progress. 07/11/11 16:58:44 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:58:44 Simulation in Progress. 07/11/11 16:59:09 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:59:09 Simulation in Progress. 07/11/11 16:59:33 The Simulation has ended. Clock is 1000000.000000. 07/11/11 16:59:33 Reporting in Модель сеть связи 3.128.1-REPORT.
Для включения в формируемый стандартный отчет матриц необходимо при открытом объекте "Модель" выполнить команду:
Edit/Settings/Reports/Matrices/Применить/Ok
Результаты моделирования после 1000 прогонов приведены ниже. Но опять в целях сокращения приведены для СС1 первые три матрицы с абсолютной и относительной прибылью, а также с коэффициентами использования СС1.
MATRIX RETRY INDICES VALUE
PRIB1 0 1 1 411920.775
1 2 412047.879
1 3 395398.298
2 1 975100.990
2 2 973737.015
2 3 972026.043
3 1 1029846.786
3 2 1029847.984
3 3 1029916.195
KPR1 0
1 1 .374
1 2 .374
1 3 .359
2 1 .886
2 2 .885
2 3 .883
3 1 .936
3 2 .936
3 3 .936
KZEN1 0
1 1 .778
1 2 .778
1 3 .772
2 1 .976
2 2 .976
2 3 .975
3 1 .995
3 2 .995
3 3 .995
В соответствии с постановкой задачи нужно определить такое сочетание количества резервных СС и мастеров-ремонтников, при котором доход от предоставления услуг системой связи будет максимальным.
В GPSS World имеются средства для проведения оптимизационного эксперимента. Однако провести его так, чтобы он был аналогичен оптимизационному эксперименту в AnyLogic и, благодаря этому, можно было бы сравнивать результаты оптимизации, не представляется возможным. Во-первых, число факторов в GPSS World не может быть более пяти. Во-вторых, ремонтное подразделение имитируется МКУ, которое описывается командой STORAGE A. Операнд А этой команды, задающий ёмкость МКУ, должен быть только числом. Факторы же эксперимента обязательно должны быть переменными пользователя и не могут быть на месте операнда А. Отсюда нет возможности изменять в ходе эксперимента количество мастеров-ремонтников. Для изменения количества мастеров-ремонтников такая возможность есть.
Поэтому для достижения цели работы - установления адекватности результатов моделирования, эксперименты проводились в "ручном режиме". Причём, изменялось количество резервных СС только второго типа (ССР2) от 4 до 6 при изменениях количества мастеров-ремонтников от 3 до 5. Таким образом, было проведено по 9 экспериментов в каждой системе моделирования. GPSS World позволяет проводить сразу все эти девять экспериментов, для чего должен быть написан соответствующий сегмент изменения версий модели. Что и было сделано. В AnyLogic вручную изменялись соответствующие данные, после чего запускалась модель.
Результаты экспериментов представлены в Табл. 5.6. Из их сравнения следует, что они адекватны, поскольку отличия незначительны и составляют в основном 0…0,001, 0…0,002.
Что касается выбора оптимального сочетания количества резервных ССР2 и мастеров-ремонтников для условий данных экспериментов, то можно выбрать вариант 7: ССР2 = 4, мастеров-ремонтников = 5.
| Показатели | GPSS World | AnyLogic | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Типы средств связи | ||||||||||
| СС1 | СС2 | СС3 | СС4 | СС5 | СС1 | СС2 | СС3 | СС4 | СС5 | |
| Вариант 1: ССР2 = 4, мастеров-ремонтников = 3 | ||||||||||
| Коэффициент прибыли по типам СС | 0,374 | 0,327 | 0,627 | 0,4 | 0,573 | 0,38 | 0,332 | 0,633 | 0,405 | 0,576 |
| Суммарный коэффициент прибыли | 0,46 | 0,468 | ||||||||
| Коэффициент использования по типам СС | 0,779 | 0,741 | 0,853 | 0,78 | 0,846 | 0,781 | 0,743 | 0,856 | 0,781 | 0,847 |
| Суммарный коэффициент использования СС | 0,799 | 0,8 | ||||||||
| Вариант 2: ССР2 = 5, мастеров-ремонтников = 3 | ||||||||||
| Коэффициент прибыли по типам СС | 0,377 | 0,336 | 0,626 | 0,397 | 0,571 | 0,369 | 0,332 | 0,624 | 0,393 | 0,57 |
| Суммарный коэффициент прибыли | 0,462 | 0,462 | ||||||||
| Коэффициент использования по типам СС | 0,779 | 0,749 | 0,852 | 0,778 | 0,845 | 0,777 | 0,747 | 0,851 | 0,776 | 0,844 |
| Суммарный коэффициент использования СС | 0,801 | 0,8 | ||||||||
| Вариант 3: ССР2 = 6, мастеров-ремонтников = 3 | ||||||||||
| Коэффициент прибыли по типам СС | 0,364 | 0,33 | 0,619 | 0,385 | 0,564 | 0,361 | 0,331 | 0,62 | 0,39 | 0,563 |
| Суммарный коэффициент прибыли | 0,453 | 0,457 | ||||||||
| Коэффициент использования по типам СС | 0,774 | 0,751 | 0,849 | 0,773 | 0,842 | 0,774 | 0,751 | 0,85 | 0,775 | 0,841 |
| Суммарный коэффициент использования СС | 0,797 | 0,797 | ||||||||
| Вариант 4: ССР2 = 4, мастеров-ремонтников = 4 | ||||||||||
| Коэффициент прибыли по типам СС | 0,89 | 0,895 | 0,931 | 0,89 | 0,911 | 0,889 | 0,892 | 0,931 | 0,889 | 0,91 |
| Суммарный коэффициент прибыли | 0,903 | 0,905 | ||||||||
| Коэффициент использования по типам СС | 0,978 | 0,977 | 0,996 | 0,988 | 0,995 | 0,978 | 0,977 | 0,996 | 0,988 | 0,994 |
| Суммарный коэффициент использования СС | 0,987 | 0,987 | ||||||||
| Вариант 5: ССР2 = 5, мастеров-ремонтников = 4 | ||||||||||
| Коэффициент прибыли по типам СС | 0,887 | 0,892 | 0,93 | 0,887 | 0,909 | 0,885 | 0,89 | 0,93 | 0,886 | 0,909 |
| Суммарный коэффициент прибыли | 0,901 | 0,902 | ||||||||
| Коэффициент использования по типам СС | 0,977 | 0,981 | 0,996 | 0,988 | 0,994 | 0,976 | 0,98 | 0,995 | 0,987 | 0,994 |
| Суммарный коэффициент использования СС | 0,987 | 0,986 | ||||||||
| Вариант 6: ССР2 = 6, мастеров-ремонтников = 4 | ||||||||||
| Коэффициент прибыли по типам СС | 0,885 | 0,89 | 0,93 | 0,886 | 0,909 | 0,887 | 0,89 | 0,93 | 0,887 | 0,91 |
| Суммарный коэффициент прибыли | 0,9 | 0,903 | ||||||||
| Коэффициент использования по типам СС | 0,977 | 0,984 | 0,995 | 0,987 | 0,994 | 0,977 | 0,984 | 0,996 | 0,988 | 0,994 |
| Суммарный коэффициент использования СС | 0,987 | 0,987 | ||||||||
| Вариант 7: ССР2 = 4, мастеров-ремонтников = 5 | ||||||||||
| Коэффициент прибыли по типам СС | 0,935 | 0,944 | 0,939 | 0,914 | 0,922 | 0,936 | 0,945 | 0,94 | 0,915 | 0,923 |
| Суммарный коэффициент прибыли | 0,931 | 0,934 | ||||||||
| Коэффициент использования по типам СС | 0,996 | 0,998 | 1 | 0,999 | 1 | 0,996 | 0,998 | 1 | 0,999 | 1 |
| Суммарный коэффициент использования СС | 0,998 | 0,998 | ||||||||
| Вариант 8: ССР2 = 5, мастеров-ремонтников = 5 | ||||||||||
| Коэффициент прибыли по типам СС | 0,936 | 0,936 | 0,939 | 0,915 | 0,922 | 0,936 | 0,936 | 0,94 | 0,915 | 0,923 |
| Суммарный коэффициент прибыли | 0,93 | 0,932 | ||||||||
| Коэффициент использования по типам СС | 0,996 | 0,999 | 1 | 0,999 | 1 | 0,996 | 0,999 | 1 | 0,999 | 1 |
| Суммарный коэффициент использования СС | 0,998 | 0,998 | ||||||||
| Вариант 9: ССР2 = 6, мастеров-ремонтников = 5 | ||||||||||
| Коэффициент прибыли по типам СС | 0,936 | 0,927 | 0,939 | 0,915 | 0,922 | 0,936 | 0,928 | 0,94 | 0,915 | 0,923 |
| Суммарный коэффициент прибыли | 0,928 | 0,929 | ||||||||
| Коэффициент использования по типам СС | 0,996 | 0,999 | 1 | 0,999 | 1 | 0,996 | 0,999 | 1 | 0,999 | 1 |
| Суммарный коэффициент использования СС | 0,998 | 0,998 | ||||||||
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.