Концептуальное проектирование систем в AnyLogic и GPSS World

Модель функционирования системы связи

Разбить на страницы
Показывать лекцию целиком

Модель в AnyLogic

Постановка задачи

На дежурстве находятся 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 - код типа СС;
  • timeMeanOtkaz - среднее время между отказами СС;
  • timeMeanRem - среднее время ремонта одного СС;
  • nach - время начала ремонта в ремонтном подразделении;
  • nach1 - время начала дежурства.
  • Возьмём, например, $$n_2=5$$. Код типа СС в виде чисел 1, 2, 3, 4, 5 определяется в самом начале моделирования и остаётся неизменным. Для его определения используются следующие исходные данные:

  • KCC1 … KCC5 - количество СС первого … пятого типов соответственно;
  • KCCР1 … KCCР5 - количество резервных СС первого … пятого типов соответственно.
  • По этим же данным определяются количества всех СС по типам KolCC1 … KolCC5, а также общее количество СС всех типов KolCC.

    В параметр timeMeanOtkaz заносится интенсивность выхода из строя соответствующего типа СС. Интенсивность рассчитывается по средним значениям интервалов выхода из строя СС первого … пятого типов timeOtkaz1 … timeOtkaz5.

    В параметр timeMeanRem заносится интенсивность ремонта соответствующего типа СС. Интенсивность рассчитывается по средним значениям времени ремонта СС соответственно первого … пятого типов timeRem1 … timeRem5.

    Рассчитанные интенсивности, например, timeMeanOtkaz = 1/timeOtkaz1 используются для обращения к генератору exponential(timeMeanOtkaz).

    Параметры 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)*
    get_Main().doxDegCC1;

    где (time()-entity.nach1) - время нахождения СС первого типа на дежурстве.

    При отсутствии на дежурстве СС первого типа убыток составит:

    UbitokCC1=(1-degCC1.statsUtilization.mean())*
    get_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 - соответствующие доходы и затраты за систему.

    Сегмент Постановка на дежурство

    Сегмент предназначен для имитации поступления основных и резервных СС всех типов и постановки их на дежурство.

  • Выполните команду Файл/Создать/Модель на панели инструментов. Появится диалоговое окно Новая модель.
  • Задайте имя новой модели. В поле Имя модели введите ComSystem. Выберите каталог для сохранения файлов модели.
  • Щелкните кнопку Далее. Откроется вторая страница Мастера создания модели. Выберите Начать создание модели "с нуля". Щелкните кнопку Далее.
  • Область просмотра

    Используем три области просмотра. В первой области просмотра разместим объекты и элементы сегмента Постановка на дежурство, во второй - сегмента Имитация дежурства СС и сегмента имитации функционирования ремонтного подразделения, в третьей - сегмента Статистика.

    Первую область просмотра поместим на диаграмму класса Main, а для второй и третьей областей просмотра создадим новый класс активного объекта Degurstvo.

    Создайте область просмотра на диаграмме класса Main для размещения объектов сегмента Постановка на дежурство.

  • В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  • Перейдите на страницу Основные панели Свойства.
  • В поле Имя: введите Postanovka.
  • Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 0, Ширина: 700, Высота: 970.
  • Перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой. В нём мы разместим объекты сегмента Постановка на дежурство.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 38, Y: 62, Ширина: 642, Высота: 268.
  • Ввод исходных данных

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

    Организуйте ввод исходных данных для сегмента Постановка на дежурство.

  • Перетащите элемент Прямоугольник на элемент Область просмотра, если вы хотите видеть данные в ходе моделирования. Если нет, поместите этот элемент вне области просмотра.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 20, Y: 350, Ширина: 390, Высота: 300.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Initial_data_PD (здесь PD - постановка на дежурство).
  • В Палитре выделите Основная. Перетащите элементы Параметр и Простая переменная на элемент с именем Initial_data_PD и разместите их так, как показано на рис. 5.3.
  • Значения свойств установите согласно табл. 5.1.
  • Простые переменные с именами KolCC1…KolCC5 - количество СС по типам, а KolCC - количество СС всех типов. Эти переменные мы будем вычислять по исходным значениям КСС1 … КСС5 и КССР1 … КССР5 и использовать при генерации равного значению КolСС заявок, имитирующих СС. Количество СС изменять можно только перед началом моделирования, так как заявки, имитирующие СС, генерируются только один раз.

    (рис 5.3) Размещение элементов Параметр и Простая переменная

    Имитация поступления средств связи

  • На Область просмотра мы уже перетащили Скругленный прямоугольник. На нём мы будем размещать, как отмечалось ранее, объекты сегмента Постановка на дежурство.
  • Перетащите на него элемент text и на странице Основные панели Свойства в поле Текст: введите Постановка на дежурство. Поместите этот текст посредине в верхней части элемента Скругленный прямоугольник.
  • Перетащите элемент Прямоугольник на Область просмотра. Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 50, Y: 100, Ширина: 160, Высота: 140.
  • Перетащите элемент text на Прямоугольник и на странице Основные панели Свойства в поле Текст: введите Имитация поступления СС.
  • Перетащите объект source на Прямоугольник. Для записи и хранения параметров СС в дополнительные поля заявок необходимо создать нестандартный класс заявки. Создайте класс заявки ComFacility.
    Свойства элементов на Initial_data_PD
    ИмяТипЗначение по умолчаниюОтображать имя
    KolCC1int0Установить флажок во всех элементах
    KolCC2int0
    KolCC3int0
    KolCC4int0
    KolCC5int0
    KolCCint0
    NumCCint0
    doxdegCC1double20
    doxdegCC2double24,2
    doxdegCC3double32,8
    doxdegCC4double23
    doxdegCC5double25,5
    zatrResCC1double21
    zatrResCC2double24,2
    zatrResCC3double28
    zatrResCC4double26
    zatrResCC5double25,5
    ubitokCC1double32
    ubitokCC2double34,2
    ubitokCC3double37
    ubitokCC4double31
    ubitokCC5double32,5
    ВремяРабСистdouble1000
  • В панели Проект щелкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
  • Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса ComFacility.
  • В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щелкните кнопку Далее.
  • Появится вторая страница Мастера создания Java класса. Добавьте следующие поля Java класса:
    int tipCC;
    double timeMeanRem;
    double nach;
    double nach1;
    double timeMeanOtkaz;
  • Оставьте выбранными флажки Создать конструктор и Создать метод toString ().
  • Щелкните кнопку Готово. Вы увидите редактор кода и в автоматически созданный код вашего Java класса. Закройте код.
  • Выделите объект source. На странице Основные панели Свойства уберите флажок Отображать имя. В полях Класс заявки: и Новая заявка Entity замените ComFacility.

    Установите:

  • Заявки прибывают согласно Интенсивности.
  • Интенсивность прибытия 1
  • Количество заявок, прибывающих за один раз 1
  • Ограниченное количество прибытий установите флажок
  • Максимальное количество прибытий 1
  • В поле Действие при выходе введите Java код:

    KolCC1=degyrstvo.KCC1+degyrstvo.KCCP1;
    degyrstvo.DoxMaxCC1=
    round((degyrstvo.KCC1*doxDegCC1)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC1=degyrstvo.DoxMaxCC1/100;
    degyrstvo.ZatrResCC1=
    round((degyrstvo.KCCP1*zatrResCC1)*ВремяРабСист*100);
    degyrstvo.ZatrResCC1=degyrstvo.ZatrResCC1/100;
    KolCC2=degyrstvo.KCC2+degyrstvo.KCCP2;
    degyrstvo.DoxMaxCC2=
    round((degyrstvo.KCC2*doxDegCC2)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC2=degyrstvo.DoxMaxCC2/100;
    degyrstvo.ZatrResCC2=
    round((degyrstvo.KCCP2*zatrResCC2)*ВремяРабСист*100);
    degyrstvo.ZatrResCC2=degyrstvo.ZatrResCC2/100;
    KolCC3=degyrstvo.KCC3+degyrstvo.KCCP3;
    degyrstvo.DoxMaxCC3=
    round((degyrstvo.KCC3*doxDegCC3)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC3=degyrstvo.DoxMaxCC3/100;
    degyrstvo.ZatrResCC3=
    round((degyrstvo.KCCP3*zatrResCC3)*ВремяРабСист*100);
    degyrstvo.ZatrResCC3=degyrstvo.ZatrResCC3/100;
    KolCC4=degyrstvo.KCC4+degyrstvo.KCCP4;
    degyrstvo.DoxMaxCC4=
    round((degyrstvo.KCC4*doxDegCC4)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC4=degyrstvo.DoxMaxCC4/100;
    degyrstvo.ZatrResCC4=
    round((degyrstvo.KCCP4*zatrResCC4)*ВремяРабСист*100);
    degyrstvo.ZatrResCC4=degyrstvo.ZatrResCC4/100;
    KolCC5=degyrstvo.KCC5+degyrstvo.KCCP5;
    degyrstvo.DoxMaxCC5=
    round((degyrstvo.KCC5*doxDegCC5)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC5=degyrstvo.DoxMaxCC5/100;
    KolCC=KolCC1+KolCC2+KolCC3+KolCC4+KolCC5;
    degyrstvo.ZatrResCC5=
    round((degyrstvo.KCCP5*zatrResCC5)*ВремяРабСист*100);
    degyrstvo.ZatrResCC5=degyrstvo.ZatrResCC5/100;
    degyrstvo.SumDoxMax=degyrstvo.DoxMaxCC1+
    degyrstvo.DoxMaxCC2+degyrstvo.DoxMaxCC3+
    degyrstvo.DoxMaxCC4+degyrstvo.DoxMaxCC5;
    degyrstvo.SumZatrRes=degyrstvo.ZatrResCC1+
    degyrstvo.ZatrResCC2+degyrstvo.ZatrResCC3+
    degyrstvo.ZatrResCC4+degyrstvo.ZatrResCC5;

    Введённым кодом определяется количество СС всех типов, включая и резервные средства связи. Эти данные необходимы в последующем в объекте split. Количества СС как исходные данные будут размещены на активном классе Degyrstvo, который мы создадим позже, поэтому в коде используется доступ к ним в виде, например, degyrstvo.KCC1.

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

    Такой подход к расчётам максимального дохода и затрат на содержание резервных СС принят для экономии машинного времени, поскольку эти показатели зависят только от продолжительности времени моделирования (ВремяРабСист), дохода от дежурства одного СС и затрат на содержание одного резервного СС. То есть данные для их расчёта не носят стохастический характер. Поэтому указанные показатели целесообразно рассчитать здесь, а затем использовать в конце моделирования при обработке накопленных статистических данных.

    Для вывода результатов моделирования с двумя знаками после запятой использовался метод round(). Предварительно результат умножался на 100, а потом делился на эту же величину. Например:

    degyrstvo.DoxMaxCC1=
    round((degyrstvo.KCC1*doxDegCC1)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC1=degyrstvo.DoxMaxCC1/100;
  • Добавьте объекты split и sink (Рис. 5.4). (рис 5.4) Добавлены объекты split и sink
  • Выделите объект split. Установите свойства как на рис. 5.5. Так как копии не унаследуют свойств от оригинала, поэтому в поле Действие при выходе копии введите Java код:
    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;

    В поле entity.tipCC запоминается соответствующий код типа СС, например, entity.tipCC = 5, который необходим для нормального функционирования модели, то есть отличия СС по типам.

  • Объект sink уничтожает заявку-оригинал.
  • (рис 5.5) Элемент source с установленными свойствами

    Распределитель средств связи

    Блок Распределитель средств связи предназначен для распределения СС согласно их типам, т. е. общее количество поступивших СС он должен разделить по типам.

    Данный блок реализуется четырьмя объектами selectOutput и одним объектом queue (Рис. 5.6). Возможна реализация этого блока и одним объектом selectOutput5 совместно также с объектом queue.

    Объект queue предназначен для приема, хранения и отправки на дежурство исправных СС, поступающих из ремонта.

  • Перетащите четыре объекта selectOutput и один объект queue из библиотеки Enterprise Library на диаграмму класса Main. Соедините их так, как показано на рис. 5.6.
  • Установите на странице Основные панели Свойства свойства объектов selectOutput согласно табл. 5.2(при использовании объекта selectOutput5 условия разделения СС по типам останутся такими же). (рис 5.6) Добавлены объекты SelectOutput и queue
    ИмяОтображать имяКласс заявки:Выход true выбираетсяУсловие
    СС1Установите флажкиComFacilityПри выполнении условияentity.tipCC==1
    СС2ComFacilityentity.tipCC==2
    СС3ComFacilityentity.tipCC==3
    СС4ComFacilityentity.tipCC==4
  • СС пятого типа будут направлены на выход false элемента СС4, поэтому пятый объект selectOutput не нужен.
  • Оставьте имя объекта queue и не устанавливайте флажок Отображать имя.
  • Установите Вместимость 100 и флажок Включить сбор статистики.
  • Перетащите из палитры Презентация три элемента text и в соответствующих полях Текст: введите текст, как на рис. 5.6.
  • Создание нового класса активного объекта

    На рис. 5.7 показан в окончательном виде сегмент Постановка на дежурство после добавления блока На дежурство. Для добавления этого блока, который должен выполнить "связь" между сегментом Постановка на дежурство и сегментом Имитация дежурства, создадим новый класс активного объекта.

  • На панели Проект щелкните правой кнопкой мыши Main, с которым вы работаете в данный момент, и выберите Создать/Класс активного объекта из контекстного меню.
  • Откроется окно Новый класс активного объекта.
  • Задайте в поле Имя: имя нового класса Degurstvo.
  • Если нужно, в поле Описание: введите описание сущности, моделируемой этим классом.
  • Щелкните кнопку Готово.

    Создайте область просмотра на диаграмме класса Degurstvo для размещения элементов сегмента Имитация дежурства и текущих результатов моделирования.

  • В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  • Перейдите на страницу Основные панели Свойства.
  • В поле Имя: введите degyr.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 40, Y: 0, Ширина: 730, Высота: 730.
  • Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • (рис 5.7) Сегмент Постановка на дежурство

    Создание элемента нового класса активного объекта

    Созданный новый класс активного объекта Degyrstvo является вложенным объектом. Как вы помните, нам нужно сделать так, чтобы СС передавались на дежурство в сегмент Имитация дежурства из сегмента Постановка на дежурство, а отремонтированные СС после ремонта из сегмента Имитация дежурства возвращались в сегмент Постановка на дежурство.

  • Перетащите элемент Прямоугольник. Установите только флажки На верхнем уровне и На презентации.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 110, Y: 150, Ширина: 100, Высота: 140.
  • Перетащите шесть элементов из палитры Основная и разместите так, как показано на рис. 5.8. Автоматически они будут объединены прямоугольником (с пунктирными линиями) и появится надпись Значок.
  • Возвратитесь на диаграмму класса Main. (рис 5.8) Добавлены на Degyrstvo шесть портов
  • На панели Проект выделите Degyrstvo, перетащите элемент класса и соедините так, как на рис. 5.7. При этом следует иметь в виду, что положение портов на элементе класса Degyrstvo изменить нельзя. Это можно сделать лишь на самом классе.
  • Переключение между областями просмотра

    Области просмотра используются как для навигации по графическому редактору во время создания модели, так и для навигации по окну презентации во время выполнения модели.

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

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

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

  • В Палитре выделите Презентация. Перетащите элемент text, разместите и введите в поле Текст: Постановка на дежурство, как на рис. 5.7.
  • Перетащите второй элемент text, разместите и введите в поле Текст: Имитация дежурства. Текущие результаты.
  • На панели Свойства выделите Динамические и в поле Действие по щелчку: введите следующий Java код:
    degyrstvo.degyr.navigateTo();
  • Проделайте то же для Статистика. Введите Java код:
    degyrstvo.statistika.navigateTo();
  • Сегмент Имитация дежурства

    Ввод исходных данных

    Организуйте ввод исходных данных для сегмента Имитация дежурства. Для ввода исходных данных используйте также элемент Параметр.

  • Перетащите элемент Прямоугольник. На нём мы разместим элементы для ввода исходных данных.
  • Оставьте имя, предложенное системой, а также установленным только один флажок На презентации.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 50, Y: 790, Ширина: 570, Высота: 190.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Initial_data_D (здесь D -дежурство).
  • В Палитре выделите Основная. Перетащите элементы Параметр на элемент с именем Initial_data_D и разместите их так, как показано на рис. 5.9.
  • На странице Основные панели Свойства каждого элемента Параметр установите свойства согласно табл. 5.3.
  • (рис 5.9) Размещение элементов Параметр для ввода данных
    Свойства элементов Параметр на Initial_data_D
    ИмяТипЗначение по умолчаниюОтображать имя
    KCC1int55Установить флажок во всех элементах
    KCC2int100
    KCC3int60
    KCC4int45
    KCC5int60
    KCCР1int2
    KCCР2int4
    KCCР3int4
    KCCР4int3
    KCCР5int4
    stoimRemCC1double17
    stoimRemCC2double18
    stoimRemCC3double16
    stoimRemCC4double20
    stoimRemCC5double21
    timeRem1double6,5
    timeRem2double4,2
    timeRem3double2,8
    timeRem4double3
    timeRem5double5,5
    timeOtkaz1double373
    timeOtkaz2double301
    timeOtkaz3double482
    timeOtkaz4double325
    timeOtkaz5double470
    kol_masterint3
    КолПрогонdouble1000
    ВремяРабСистdouble1000

    Вывод результатов моделирования

    Здесь выводятся все результаты моделирования (Рис. 5.10). Однако с целью экономии машинного времени, выводятся они по-разному. Рассчитанные ранее максимальные доходы от дежурства СС и затраты на содержание резервных СС не выводятся в ходе моделирования. Выводятся только текущие доходы от дежурства СС и текущие затраты на ремонт неисправных СС. Все обработанные результаты выводятся по окончании моделирования. Для организации вывода используется способ Событие (см. п. 5.1.7).

    (рис 5.10) Элементы Простая переменная для выводов результатов моделирования
  • Перетащите элемент Прямоугольник.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 54, Y: 436, Ширина: 696, Высота: 278.
  • Результаты разбиты на две группы: затраты и доходы. Перетащите два элемент text и на странице Основные панели Свойства в поле Текст: введите Затраты и Доходы соответственно.
  • В Палитре выделите Основная. Перетащите элементы Простая переменная. Разместите их, как показано на рис. 5.10.
  • У всех переменных установите флажки Отображать имя и тип double.
  • Событийная часть сегмента Имитация дежурства

    Реализация событийной части сегмента показана на рис. 5.11.

  • Перетащите элемент Скруглённый прямоугольник. На нём мы разместим все элементы сегмента Имитация дежурства.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 60, Y: 60, Ширина: 600, Высота: 350.
  • Перетащите элемент Прямоугольник. На нём мы разместим элементы, непосредственно имитирующие дежурство СС.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 250, Y: 70, Ширина: 170, Высота: 330.
  • Перетащите ещё один элемент Прямоугольник для размещения элементов, имитирующих ремонтное подразделение СС.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 440, Y: 70, Ширина: 190, Высота: 330.
  • Перетащите (или введя один элемент, остальные подобные ему скопируйте) на диаграмму класса Degyrstvo последовательно: пять объектов queue, пять объектов delay, один объект queue, один объект delay и соедините их так, как показано на рис. 5.11.
  • Перетащите три элемента text и введите названия в соответствующие поля Текст: согласно рис. 5.11.
  • На странице Основные панели Свойства каждого объекта установите свойства согласно табл. 5.4.
  • Замечание. Поскольку на входах каждого из объектов delay с именами degCC1 … degCC5 стоят объекты queue с именами rez1 … rez5 соответственно, то возникает желание поставить такие же объекты на выходах delay. Однако это приведёт к неправильной работе модели: некоторые СС не смогут поступать в ремонтное подразделение. (рис 5.11) Сегмент Имитация дежурства
    Объекты сегмента Имитация дежурства и их свойства
    queue
    ИмяВместимостьДействие при выходе
    rez1KCCP1entity.timeOtkaz=1/timeOtkaz1
    rez2KCCP2entity.timeOtkaz=1/timeOtkaz2
    rez3KCCP3entity.timeOtkaz=1/timeOtkaz3
    rez4KCCP4entity.timeOtkaz=1/timeOtkaz4
    rez5KCCP5entity.timeOtkaz=1/timeOtkaz5
    delay
    ИмяВремя задержкиВместимость
    degCC1exponential(entity.timeOtkaz)KCC1
    degCC2exponential(entity.timeOtkaz)KCC2
    degCC3exponential(entity.timeOtkaz)KCC3
    degCC4exponential(entity.timeOtkaz)KCC4
    degCC5exponential(entity.timeOtkaz)KCC5
    remontexponential(entity.timeMeanRem)3
    ИмяДействие при выходе
    degCC1DoxDegCC1+=(time()-entity.nach1)*get_Main().doxDegCC1;
    entity.timeMeanRem=1/timeRem1;
    degCC2DoxDegCC2+=(time()-entity.nach1)*get_Main().doxDegCC2;
    entity.timeMeanRem=1/timeRem2;
    degCC3DoxDegCC3+=(time()-entity.nach1)*get_Main().doxDegCC3;
    entity.timeMeanRem=1/timeRem3;
    degCC4DoxDegCC4+=(time()-entity.nach1)*get_Main().doxDegCC4;
    entity.timeMeanRem=1/timeRem4;
    degCC5DoxDegCC5+=(time()-entity.nach1)*get_Main().doxDegCC5;
    entity.timeMeanRem=1/timeRem5;

    Кроме свойств, указанных в табл. 5.4, нужно также:

  • во всех объектах в поле Класс заявки: Entity заменить 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);}
  • Переключение между областями просмотра

  • В Палитре выделите Презентация. Перетащите элемент text, разместите и введите в поле Текст: Постановка на дежурство, как на рис. 5.11.
  • На панели Свойства выделите Динамические и в поле Действие по щелчку: введите следующий Java код:
    get_Main().Postanovka.navigateTo();
  • Перетащите второй элемент text, разместите и введите в поле Текст: Имитация дежурства.
  • На панели Свойства выделите Динамические и в поле Действие по щелчку: введите следующий Java код:
    Degyr.navigateTo();
  • Проделайте то же для Статистика. Введите Java код:
    statistika.navigateTo();
  • Сегмент Статистика

    Результаты моделирования выводятся в сегменте Имитация дежурства. Тем не менее, организуем вывод результатов моделирования, можно сказать, в более презентабельном виде. Для этого создадим сегмент Статистика (Рис. 5.12).

    (рис 5.12) Сегмент Статистика
  • Создайте область просмотра для размещения элементов сегмента Статистика.
  • В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  • Перейдите на страницу Основные панели Свойства.
  • В поле Имя: введите statistika.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 1036, Ширина: 960, Высота: 630.
  • Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • Перетащите элемент Прямоугольник.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 20, Y: 1076, Ширина: 920, Высота: 580.
  • Перетащите элемент text и в поле Текст: введите Результаты моделирования. На странице Дополнительные панели Свойства введите в поля X: 360, Y: 1096.
  • Перетащите еще тринадцать элементов text, разместите и введите в соответствующие поля Текст: надписи, как на рис. 5.12. Например, при размещении надписи Максимальный доход по типам СС укажите в полях X: 48, Y: 1126, при размещении надписи Коэффициенты использования типов средств связи укажите в полях X: 468, Y: 1418, а при размещении надписи Затраты на содержание резервов по типам средств связи в полях X: 485, Y: 1385.
  • Использование элемента Текстовое поле

    Текстовое поле является простейшим текстовым элементом управления, позволяющим пользователю вводить небольшие объемы текста. Вы можете также связать этот элемент управления с переменной или параметром типа String, double или int.

  • Перетащите элемент из палитры Элементы управления и разместите согласно рис. 5.12.
  • Выделяя последовательно каждый элемент Текстовое поле, переходите на страницу Основные панели Свойства и в поле Имя: давайте имя элементу согласно табл. 5.5.
  • 5Имена элементов Текстовое поле
    123456
    Максимальный доход по типам СС
    editbox1editbox2editbox3editbox4editbox5editbox
    Доход от дежурства по типам СС и всего
    editbox11editbox12editbox13editbox14editbox15editbox16
    Стоимость ремонта по типам СС и всего
    editbox21editbox22editbox23editbox24editbox25editbox26
    Суммарная прибыль от использования СС и всего
    editbox31editbox32editbox33editbox34editbox35editbox36
    Коэффициенты прибыли по типам СС и всего
    editbox41editbox42editbox43editbox44editbox45editbox46
    Затраты на содержание резервов по типам СС и всего
    editbox6editbox7editbox8editbox9editbox10editbox17

    Использование элемента Диаграмма

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

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

    AnyLogic поддерживает несколько видов диаграмм.

    Простые диаграммы:

  • столбиковая диаграмма;
  • диаграмма с накоплением;
  • круговая диаграмма.
  • Диаграммы с историей (временные диаграммы):

  • график;
  • временной график;
  • временная диаграмма с накоплением;
  • временная цветовая диаграмма.
  • Используйте диаграмму с накоплением.

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

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

  • Перетащите элемент Диаграмма с накоплением из палитры Статистика и разместите согласно рис. 5.12.
  • Выделяя последовательно каждый элемент Диаграмма с накоплением, переходите на страницу Внешний вид панели Свойства и установите:
  • Смещение по оси X: 40
  • Смещение по оси Y: 20
  • Ширина: 92
  • Высота: 138
  • Относительная ширина: 52
  • Направление: вертикальное
  • Цвет текста, цвет фона и цвет границы установите по своему усмотрению.

  • После установки этих свойств выделите левый элемент.
  • Перейдите на страницу Основные панели Свойства.
  • Щелкните Добавить элемент данных.
  • В поле Заголовок: введите СС1.
  • В поле Значение: введите Java код
    degCC1.statsUtilization.mean()
  • Установите Масштаб: Фиксированный и Обновлять автоматически. Цвет столбика, который будет отображать коэффициент использования группы СС одного типа, установите по своему усмотрению.
  • Проделайте пп. 3…7 для остальных 2…5 элементов Диаграмма с накоплением. При этом в поле Заголовок: вводите: СС2, СС3, СС4, СС5 соответственно.
  • В поле Значение: вводите Java коды также для объектов 2…5 соответственно:
    degCC2.statsUtilization.mean()
    degCC3.statsUtilization.mean()
    degCC4.statsUtilization.mean()
    degCC5.statsUtilization.mean()
  • На этом реализация сегмента Статистика завершена. Осталось только организовать переключение между областями просмотра.

    Переключение между областями просмотра

  • В Палитре выделите Презентация. Перетащите элемент text, разместите и введите в поле Текст: Постановка на дежурство, как на рис. 5.12.
  • На панели Свойства выделите Динамические и в поле Действие по щелчку: введите следующий Java код:
    get_Main().Postanovka.navigateTo();
  • Перетащите второй элемент text, разместите и введите в поле Текст: Имитация дежурства.
  • На панели Свойства выделите Динамические и в поле Действие по щелчку: введите следующий Java код:
    degyrstvo.degyr.navigateTo();
  • Проделайте то же для Статистика. Введите Java код:
    statistika.navigateTo();
  • Все три сегмента модели построены. Теперь вернемся к выводу результатов моделирования с использованием способа событие.

    Использование способа Событие

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

    Есть три типа событий.

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

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

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

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

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

  • Перетащите элемент из палитры Модель на диаграмму класса активного объекта. Измените его имя на ResulsModeling. Нажмите 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())*get_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())*get_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())*
    get_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())*
    get_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())*
    get_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);
    editbox11.setText(DoxDegCC1);
    editbox2.setText(DoxMaxCC2);
    editbox12.setText(DoxDegCC2);
    editbox3.setText(DoxMaxCC3);
    editbox13.setText(DoxDegCC3);
    editbox4.setText(DoxMaxCC4);
    editbox14.setText(DoxDegCC4);
    editbox5.setText(DoxMaxCC5);
    editbox15.setText(DoxDegCC5);
    editbox.setText(SumDoxMax);
    editbox16.setText(SumDoxDeg);
    //вывод стоимости ремонта по типам СС и всего
    editbox21.setText(ZatrRemCC1);
    editbox22.setText(ZatrRemCC2);
    editbox23.setText(ZatrRemCC3);
    editbox24.setText(ZatrRemCC4);
    editbox25.setText(ZatrRemCC5);
    editbox26.setText(SumZatrRem);
    //вывод чистой прибыли от использования по типам СС и всего
    editbox31.setText(PribCC1);
    editbox32.setText(PribCC2);
    editbox33.setText(PribCC3);
    editbox34.setText(PribCC4);
    editbox35.setText(PribCC5);
    editbox36.setText(SumPribil);
    //вывод коэфициентов прибыли по типам СС и всего
    editbox41.setText(koefPribCC1);
    editbox42.setText(koefPribCC2);
    editbox43.setText(koefPribCC3);
    editbox44.setText(koefPribCC4);
    editbox45.setText(koefPribCC5);
    editbox46.setText(koefPribil);
    //вывод затрат на содержание резервов по типам СС и всего
    editbox6.setText(ZatrResCC1);
    editbox7.setText(ZatrResCC2);
    editbox8.setText(ZatrResCC3);
    editbox9.setText(ZatrResCC4);
    editbox10.setText(ZatrResCC5);
    editbox17.setText(SumZatrRes);
  • Из кода следует, что по окончании моделирования, которое длится 1 000 000 единиц модельного времени, сработает метод событие, будут рассчитаны и выведены результаты моделирования.

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

    Для вывода результатов моделирования в текстовые поля editbox используется функция setText(), в качестве аргумента которой указывается имя элемента Простая переменная, например, editbox1.setText(DoxMaxCC1);

    Запустите модель. На рис. 5.13 и рис. 5.14 показаны результаты моделирования.

    (рис 5.13) Результаты моделирования (рис 5.14) Результаты сегмента Статистика

    Проведение экспериментов

    AnyLogic предоставляет пользователю возможность провести следующие эксперименты:

  • простой эксперимент;
  • оптимизация;
  • варьирование переменных;
  • сравнение прогонов;
  • Монте-Карло;
  • анализ чувствительности;
  • калибровка;
  • нестандартный.
  • Последние пять экспериментов доступны только в AnyLogic Professional.

    Простой эксперимент

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

    При создании модели автоматически создается один простой эксперимент, названный Simulation. Именно такой эксперимент мы с вами и рассматривали до сих пор.

    Эксперимент этого типа используется в большинстве случаев. Другие эксперименты нужны тогда, когда важную роль играют значения параметров модели. То есть вам нужно проанализировать, как они влияют на поведение или эффективность моделируемой системы или если вам нужно найти оптимальные параметры вашей модели.

    Далее в рамках данного пособия мы остановимся на доступных в версии AnyLogic University экспериментах оптимизации и варьирования переменных, овладев методиками проведения которых, вы самостоятельно сможете выполнять в AnyLogic Professional и другие эксперименты.

    Связывание параметров

    Начиная создавать модель в AnyLogic, мы ничего не говорили об экспериментах и особенностях их проведения. Поэтому все исходные данные разместили на Initial_data_PD (рис. 5.3) и Initial_data_D (рис. 5.9) так, как нам представлялось удобным для построения модели и управления ею в ходе проведения простого эксперимента.

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

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

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

    Разместите элементы, как показано на рис. 5.15. Внесите соответствующие изменения в модель. Обратите внимание на различие имён связываемых параметров, например, КССР_1.

    Свяжите параметры корневого объекта Main с параметрами вложенного объекта класса Degyrstvo.

  • Откройте диаграмму класса активного объекта Main.
  • Выберите на диаграмме вложенный объект degyrstvo.
  • Перейдите на страницу Параметры панели Свойства.
  • В таблице Параметры в поле Значение введите имя параметра класса объекта-владельца Main, значение которого нужно передавать этому параметру вложенного объекта. В результате у вас должно быть так, как на рис. 5.16.
  • (рис 5.15) Размещение элементов на Initial_data_ PD (рис 5.16) Фрагмент страницы Параметры после связывания параметров

    Эксперимент Оптимизация стохастических моделей

    Эксперимент Оптимизация может проводиться в AnyLogic оптимизатором OptQuest для детерминированных и стохастических моделей.

    Наша модель ComSystem стохастическая. Создайте оптимизационный эксперимент стохастической модели с целью определения максимального коэффициента прибыли в зависимости от количества резервных СС и мастеров-ремонтников.

  • В панели Проект щелкните правой кнопкой мыши элемент модели ComSystem и из контекстного меню выберите Coздать/ Эксперимент.
  • В появившемся диалоговом окне из списка Тип эксперимента: выберите Оптимизация (рис. 5.17). (рис 5.17) Диалоговое окно Новый эксперимент
  • В поле Имя введите имя эксперимента, например, OptComSystem. Имя эксперимента должно начинаться с заглавной буквы - таково правило названия классов в Java.
  • В поле Корневой класс модели: выберите Main. Этим действием вы задали корневой (главный) класс эксперимента. Объект этого класса будет играть роль корня иерархического дерева объектов модели, запускаемой оптимизационным экспериментом.
  • Если вы хотите применить к создаваемому эксперименту временные установки другого эксперимента, оставьте установленным флажок Копировать установки модельного времени из: и выберите эксперимент из расположенного справа выпадающего списка. В данном случае оставьте, так как есть: Simulation.
  • Щелкните кнопку Готово. Появится страница Основные панели Свойства (рис. 5.18).
  • Установите опцию максимизировать.
  • Установите Фиксированное начальное число (воспроизводимые прогоны).
  • В поле Начальное число введите 5672.
  • Целевая функция доступна как root.Поэтому в поле Целевая функция введите root.degyrstvo.koefPribil.
  • Оставьте установленным флажок Количество итераций:. Под итерацией понимается один опыт (одно наблюдение). Количество итераций - это цель стратегического планирования эксперимента - определение количества наблюдений и уровней факторов в них для получения полной и достоверной информации о модели.
  • Число итераций модели при полном факторном эксперименте, то есть число всех возможных сочетаний факторов, определяется по формуле: $$I=k_1 \cdot k_2 \cdot … \cdot k_i\cdot … \cdot k_m,$$ где $$k_i$$ - число уровней i-го фактора, $$i=\overline{1,m}$$.
  • В нашей модели нужно менять количество резервных средств связи КССР_1…КССР_5 и количество мастеров-ремонтников Kol_masterov, то есть всего 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=3 \cdot 6 \cdot 6 \cdot 6 \cdot 5 \cdot 5 =16200$$ (рис 5.18) Вкладка Основные оптимизационного эксперимента
  • Оставьте 500 в поле Количество итераций:, так как данная версия AnyLogic ограничена этим количеством итераций.
  • Задайте параметры, значения которых будут меняться. В таблице на рис. 5.18 перечислены все параметры корневого объекта Main.
  • Чтобы разрешить варьирование параметров оптимизатором, перейдите на строку с параметром КССР_1. Щелкните мышью в ячейке Тип. Выберите тип параметра, отличный от значения фиксированный. Так как параметр KCCР_1 целочисленный типа int, выберите дискретный.
  • Задайте диапазон допустимых значений параметра. Для чего введите в ячейку Мин минимальное значение 1, в ячейку Макс максимальное значение, например, для КССР1, 3. Так как параметр дискретный, в ячейке Шаг укажите величину шага 1.
  • Задайте так же остальные параметры, как на рис. 5.18.
  • Перейдите на страницу Репликации панели Свойства (рис. 5.19).
  • Установите флажок Использовать репликации.
  • Число репликаций (прогонов) в одной итерации (наблюдении) может быть фиксированным или переменным. Фиксированное число репликаций, например, при доверительной вероятности $$\alpha = 0,95$$, точности $$\varepsilon =0,1$$ и стандартном отклонении $$\sigma=0,1$$ может быть определено по формуле [1]: $$N=t^{2}_{\alpha}\frac{\sigma^2}{\varepsilon^2}=1,96^2\frac{0,1^2}{0,1^2}=3,8416\approx4,$$ где$$t_{\alpha}$$ - табулированный аргумент функции Лапласа.

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

  • Выберите опцию Фиксированное количество репликаций и в соответствующем поле установите 4. (рис 5.19) Страница Репликации оптимизационного эксперимента
  • Вернитесь на страницу Основные и щелкните кнопку Создать интерфейс. Кнопка находится в правом верхнем углу страницы Основные. После щелчка удаляется содержимое презентации эксперимента и создается интерфейс эксперимента заново (рис. 5.20) согласно его текущим установкам (набору оптимизационных параметров и их свойствам и т. д.). Поэтому создавать интерфейс нужно только после окончания задания параметров эксперимента. На интерфейсе видны знаки вопросов напротив оптимизационных параметров.
  • В меню запуск выполните ComSystem/OptComSystem.
  • Щелкните Запустить оптимизацию. Начнет выполняться эксперимент. Во время эксперимента можно видеть на графике изменение значения целевой функции. После 500*4=2 000 прогонов (см. рис. 5.21) эксперимент остановится.
  • Результаты оптимизационного эксперимента приведены на рис. 5.21. Наилучшее значение целевой функции - коэффициент прибыли - равно 0,959. Получено оно на 154 итерации при следующих оптимальных значениях параметров: КССР_1=2, КССР_2= КССР_3= КССР_4=КССР_5=1, Kol_master=5.
  • Вернитесь к простому эксперименту. Измените значения КССР_1… КССР_5 и Kol_master на Initial_data_PD на значения, полученные в оптимизационном эксперименте. (рис 5.20) Интерфейс оптимизационного эксперимента
  • Запустите простой эксперимент. Вы получите коэффициент прибыли 0,949, то есть такой же, как и в оптимизационном эксперименте. При этом уменьшатся затраты на содержание резервных СС и возрастут коэффициенты использования СС.
  • Замечание. Возможно, что результат оптимизационного эксперимента будет отличаться по коэффициенту прибыли в большую сторону при снятии ограничения в 500 итераций. (рис 5.21) Результаты оптимизационного эксперимента

    Обратите внимание на интерфейс оптимизационного эксперимента (рис. 5.20): заготовка для графика относительного коэффициента прибыли расположена в первом квадранте, то есть коэффициент предполагается положительным. Однако при некоторых параметрах система предоставления услуг связи оказывается убыточной. Поэтому появляется четвёртый квадрант (рис. 5.21), в котором искомый коэффициент отрицательный.

    Эксперимент Варьирование параметров

    Эксперимент Варьирование параметров также может проводиться для детерминированных и стохастических моделей.

    Создайте эксперимент Варьирование параметров для стохастической модели ComSystem с целью наблюдения за изменением коэффициента прибыли в зависимости от дохода за дежурство средств связи.

  • В панели Проект щелкните правой кнопкой мыши элемент модели ComSystem и из контекстного меню выберите Создать эксперимент.
  • В появившемся диалоговом окне из списка Тип эксперимента: выберите Варьирование параметров (рис. 5.22).
  • В поле Имя введите имя эксперимента, например, ParVarComSystem.
  • Остальные установки оставьте такими, как на рис. 5.18. Назначение их тоже, что и в оптимизационном эксперименте. (рис 5.22) Окно Новый эксперимент с выбранным экспериментом (рис 5.23) Страница Основные эксперимента варьирования параметров
  • Щелкните кнопку Готово. Появится страница Основные панели Свойства (рис. 5.23).
  • Обратите внимание, что на странице Основные по сравнению с оптимизационным экспериментом отсутствуют опции минимизировать, максимизировать, Количество итераций. Последнее определяется AnyLogic в зависимости от диапазонов и шагов изменения параметров.
  • Задайте диапазон допустимых значений параметра doxDegCC1. Перейдите в таблице на рис. 5.23 на строку с этим параметром. Щелкните мышью в ячейке Тип. Выберите тип параметра, отличный от значения фиксированный. Параметр doxDegCC1 типа double, поэтому он может изменяться в диапазоне. Выберите Диапазон. В ячейку Мин введите минимальное значение 18, в ячейку Макс - максимальное значение 24, в ячейке Шаг укажите величину шага 0.5.
  • Задайте также остальные параметры, как на рис. 5.23.
  • Перейдите на страницу Репликации панели Свойства и установите флажок Использовать репликации. В поле Кол-во репликаций за итерацию, установите, как и в предыдущем эксперименте, 4.
  • Вернитесь на страницу Основные и щелкните кнопку Создать интерфейс.
  • В эксперименте Варьирование параметров в отличие от эксперимента Оптимизация интерфейс создает пользователь. Связано это с тем, что выходными результатами данного эксперимента могут быть любые показатели моделируемой системы.
  • Создайте интерфейс, показанный на рис. 5.24. Здесь вы видите график, который будет отображать значение коэффициента прибыли для каждой итерации.
  • Перетащите элемент График из палитры Статистика на диаграмму активного класса.
  • Щелкните Добавить набор данных.
  • Установите опцию Набор данных. Заголовок: KoefPribil. Набор данных: dataset. Установите Не обновлять автоматически.
  • Перейдите на страницу Дополнительные и установите: X: 260, Y: 100, Ширина: 510, Высота: 400, Цвет фона: Нет заливки, Цвет границы: Нет линии.
  • Перейдите на страницу Внешний вид. Установите: Смещение по Х: 40, Смещение по Y: 20, Ширина: 450, Высота: 330.
  • Также из палитры Статистика перетащите элемент Набор данных. Установите опцию Не обновлять автоматически.
  • Из палитры Основная перетащите элемент Простая переменная. На странице Основные панели Свойства в поле Имя: введите valueOfKoefPribil. Установите Уровень доступа: public. Тип: double.
  • Щелкните диаграмму класса. Перейдите на страницу Дополнительные панели Свойства и введите коды:
  • в поле Действие после прогона модели:
    valueOfKoefPribil = root.degyrstvo.koefPribil;
  • в поле Действие после итерации
    dataset.add(getCurrentIteration(), valueOfKoefPribil);
  • Выполните ComSystem2/VarParComSystem. (рис 5.24) Интерфейс эксперимента варьирования параметров
  • Щелкните Запустить эксперимент. Начнет выполняться эксперимент. Во время эксперимента можно видеть на графике изменение значения коэффициента прибыли. Фрагмент результатов выполнения эксперимента Варьирование параметров приведен на рис. 5.25.
  • Эксперимент был приостановлен после 74 прогона, то есть на 74/4 $$\rightarrow$$ 19-й итерации. (рис 5.25) Фрагмент результатов выполнения эксперимента Варьирование параметров
  • Коэффициент прибыли составляет 0,954 при doxDegCC1 = 21,5, doxDegCC2 = 20,5, doxDegCC3 = 28, doxDegCC4 = 19, doxDegCC5 = 23.
  • Поскольку вы оставили значения КССР_1… КССР_5 и Kol_master на Initial_data_PD, полученные в оптимизационном эксперименте (см. рис. 5.25), то значения коэффициентов прибыли в эксперименте варьирования параметрами близки к 0,949.
  • В обоих экспериментах мы использовали опцию Фиксированное начальное число (воспроизводимые прогоны), поэтому генератор случайных чисел модели всегда инициализировался одним и тем же начальным числом 5672, заданным нами в поле Начальное число. Все запуски модели были идентичными и воспроизводимыми, что полезно при отладке модели.

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

    Создайте оптимизационный эксперимент OptComSystem1, который будет отличаться от OptComSystem лишь выбранной опцией Случайное начальное число (уникальные прогоны).

    Запустите эксперимент. Вы получите следующие результаты. Наилучшее значение целевой функции - коэффициент прибыли - равно 0,957. Получено оно на 172 итерации при следующих оптимальных значениях параметров: КССР_1=1, КССР_2=2, КССР_3=1, КССР_4=1, КССР_5=2, Kol_master=5. Таким образом, получен другой коэффициент прибыли, при этом другое значение оптимального параметра КССР_5=2.

    Оптимизационный эксперимент OptComSystem1 выполнялся 4839,2 сек (80,66 мин). Это при том, что эксперимент проводился на компьютере с четырёхядерным процессором и одновременно выполнялись четыре прогона модели.

    Экспорт модели как Java апплета

    Модели AnyLogic являются приложением Java, поэтому их можно запускать на большинстве современных платформ, а также помещать на веб-сайты в виде апплетов.

    Наличие такой возможности позволяет удалённым пользователям запускать интерактивные модели в веб-браузере при отсутствии AnyLogic или какого-либо другого программного обеспечения. В этом случае на клиентской машине будут запускаться скопированные из сети файлы модели с такой же поддержкой интерактивной работы, что и при запуске из среды AnyLogic.

    Экспортируйте модель ComSystem в виде Java апплета.

  • Щелкните в панели Экспорт/В Java апплет (запускается в веб браузере) из контекстного меню.
  • Откроется диалоговое окно Экспорт модели (рис. 5.26). Щелчком мыши раскройте список Экспортировать эксперимент и выберите в нем Simulation. Настройки этого эксперимента будут применены к экспортируемой модели.
  • В поле Каталог для создаваемых файлов укажите каталог, в который вы хотите поместить файлы экспортируемой модели. Можно также выбрать каталог с помощью диалогового окна навигации, которое становится доступным при нажатии кнопки Выбрать.
  • По умолчанию кнопки панели инструментов и другие элементы пользовательского интерфейса апплета будут на том языке, который выбран в настройках вашего компьютера (Язык: <системный по-умолчанию>). При необходимости можно выбрать для интерфейса апплета другой язык из выпадающего списка Язык: (на данный момент AnyLogic поддерживает русский, английский, китайский, немецкий и итальянский языки). (рис 5.26) Диалоговое окно Экспорт модели (рис 5.27) Набор файлов Java апплет
  • Оставьте установленным флажок Открыть апплет модели в веб браузере.
  • Щелкните кнопку Готово. Откроется диалоговое окно, в котором будет сообщение об успешном завершении экспортирования модели ComSystem: Модель ComSystem была экспортирована в G:\BOEV.
  • Щелкните OK.
  • Модель, экспортированная как Java апплет, представляет собой набор следующих файлов (рис. 5.28):

  • файл .html, используемый для запуска Java апплета;
  • файл com.xj.anylogic.engine.jar исполняющего модуля AnyLogic;
  • скомпилированный .jar файл модели (model.jar);
  • .jar файлы и классы, необходимые для построения модели.
  • При публикации апплета модели в сети Интернет нужно предоставить доступ ко всем этим файлам из кода апплета. Это значит, что если вы добавляете ссылку на .html файл модели на веб страницу, то необходимо разместить все эти файлы в той же директории, где и этот .html файл. Для показа апплета на своей веб странице следует скопировать код апплета из .html файла модели в код своей страницы, и добавить все файлы, сгенерированные при экспорте модели, в тот же каталог, где находится ваша страница.

    Запустите апплет модели, дважды щелкнув ComSystem.html. Результаты работы апплета модели показаны на рис. 5.28. Коэффициент прибыли равен 0,949 (см. п. 5.1.8.3).

    (рис 5.28) Результаты работы апплета модели ComSystem

    Модель в GPSS World

    Состав модели в GPSS World

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

    Какие ограничения в системе?

  • Число мастеров-ремонтников в ремонтном подразделении.
  • Максимальное число одновременно находящихся СС на дежурстве.
  • Максимальное число резервных СС.
  • Общее число СС в системе.
  • Для моделирования двух первых ограничений целесообразно использовать МКУ, а для третьего и четвертого ограничений - транзакты.

    Модель системы связи должна состоять из следующих сегментов:

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

    Программа GPSS-модели

    Предполагается, что количество типов СС в системе предоставления услуг связи может изменяться от одного до максимального значения 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 WorldAnyLogic
    Типы средств связи
    СС1СС2СС3СС4СС5СС1СС2СС3СС4СС5
    Вариант 1: ССР2 = 4, мастеров-ремонтников = 3
    Коэффициент прибыли по типам СС0,3740,3270,6270,40,5730,380,3320,6330,4050,576
    Суммарный коэффициент прибыли0,460,468
    Коэффициент использования по типам СС0,7790,7410,8530,780,8460,7810,7430,8560,7810,847
    Суммарный коэффициент использования СС0,7990,8
    Вариант 2: ССР2 = 5, мастеров-ремонтников = 3
    Коэффициент прибыли по типам СС0,3770,3360,6260,3970,5710,3690,3320,6240,3930,57
    Суммарный коэффициент прибыли0,4620,462
    Коэффициент использования по типам СС0,7790,7490,8520,7780,8450,7770,7470,8510,7760,844
    Суммарный коэффициент использования СС0,8010,8
    Вариант 3: ССР2 = 6, мастеров-ремонтников = 3
    Коэффициент прибыли по типам СС0,3640,330,6190,3850,5640,3610,3310,620,390,563
    Суммарный коэффициент прибыли0,4530,457
    Коэффициент использования по типам СС0,7740,7510,8490,7730,8420,7740,7510,850,7750,841
    Суммарный коэффициент использования СС0,7970,797
    Вариант 4: ССР2 = 4, мастеров-ремонтников = 4
    Коэффициент прибыли по типам СС0,890,8950,9310,890,9110,8890,8920,9310,8890,91
    Суммарный коэффициент прибыли0,9030,905
    Коэффициент использования по типам СС0,9780,9770,9960,9880,9950,9780,9770,9960,9880,994
    Суммарный коэффициент использования СС0,9870,987
    Вариант 5: ССР2 = 5, мастеров-ремонтников = 4
    Коэффициент прибыли по типам СС0,8870,8920,930,8870,9090,8850,890,930,8860,909
    Суммарный коэффициент прибыли0,9010,902
    Коэффициент использования по типам СС0,9770,9810,9960,9880,9940,9760,980,9950,9870,994
    Суммарный коэффициент использования СС0,9870,986
    Вариант 6: ССР2 = 6, мастеров-ремонтников = 4
    Коэффициент прибыли по типам СС0,8850,890,930,8860,9090,8870,890,930,8870,91
    Суммарный коэффициент прибыли0,90,903
    Коэффициент использования по типам СС0,9770,9840,9950,9870,9940,9770,9840,9960,9880,994
    Суммарный коэффициент использования СС0,9870,987
    Вариант 7: ССР2 = 4, мастеров-ремонтников = 5
    Коэффициент прибыли по типам СС0,9350,9440,9390,9140,9220,9360,9450,940,9150,923
    Суммарный коэффициент прибыли0,9310,934
    Коэффициент использования по типам СС0,9960,99810,99910,9960,99810,9991
    Суммарный коэффициент использования СС0,9980,998
    Вариант 8: ССР2 = 5, мастеров-ремонтников = 5
    Коэффициент прибыли по типам СС0,9360,9360,9390,9150,9220,9360,9360,940,9150,923
    Суммарный коэффициент прибыли0,930,932
    Коэффициент использования по типам СС0,9960,99910,99910,9960,99910,9991
    Суммарный коэффициент использования СС0,9980,998
    Вариант 9: ССР2 = 6, мастеров-ремонтников = 5
    Коэффициент прибыли по типам СС0,9360,9270,9390,9150,9220,9360,9280,940,9150,923
    Суммарный коэффициент прибыли0,9280,929
    Коэффициент использования по типам СС0,9960,99910,99910,9960,99910,9991
    Суммарный коэффициент использования СС0,9980,998
    Страницы:

    Модель в AnyLogic

    Постановка задачи

    На дежурстве находятся 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 - код типа СС;
  • timeMeanOtkaz - среднее время между отказами СС;
  • timeMeanRem - среднее время ремонта одного СС;
  • nach - время начала ремонта в ремонтном подразделении;
  • nach1 - время начала дежурства.
  • Возьмём, например, $$n_2=5$$. Код типа СС в виде чисел 1, 2, 3, 4, 5 определяется в самом начале моделирования и остаётся неизменным. Для его определения используются следующие исходные данные:

  • KCC1 … KCC5 - количество СС первого … пятого типов соответственно;
  • KCCР1 … KCCР5 - количество резервных СС первого … пятого типов соответственно.
  • По этим же данным определяются количества всех СС по типам KolCC1 … KolCC5, а также общее количество СС всех типов KolCC.

    В параметр timeMeanOtkaz заносится интенсивность выхода из строя соответствующего типа СС. Интенсивность рассчитывается по средним значениям интервалов выхода из строя СС первого … пятого типов timeOtkaz1 … timeOtkaz5.

    В параметр timeMeanRem заносится интенсивность ремонта соответствующего типа СС. Интенсивность рассчитывается по средним значениям времени ремонта СС соответственно первого … пятого типов timeRem1 … timeRem5.

    Рассчитанные интенсивности, например, timeMeanOtkaz = 1/timeOtkaz1 используются для обращения к генератору exponential(timeMeanOtkaz).

    Параметры 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)*
    get_Main().doxDegCC1;

    где (time()-entity.nach1) - время нахождения СС первого типа на дежурстве.

    При отсутствии на дежурстве СС первого типа убыток составит:

    UbitokCC1=(1-degCC1.statsUtilization.mean())*
    get_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 - соответствующие доходы и затраты за систему.

    Сегмент Постановка на дежурство

    Сегмент предназначен для имитации поступления основных и резервных СС всех типов и постановки их на дежурство.

  • Выполните команду Файл/Создать/Модель на панели инструментов. Появится диалоговое окно Новая модель.
  • Задайте имя новой модели. В поле Имя модели введите ComSystem. Выберите каталог для сохранения файлов модели.
  • Щелкните кнопку Далее. Откроется вторая страница Мастера создания модели. Выберите Начать создание модели "с нуля". Щелкните кнопку Далее.
  • Область просмотра

    Используем три области просмотра. В первой области просмотра разместим объекты и элементы сегмента Постановка на дежурство, во второй - сегмента Имитация дежурства СС и сегмента имитации функционирования ремонтного подразделения, в третьей - сегмента Статистика.

    Первую область просмотра поместим на диаграмму класса Main, а для второй и третьей областей просмотра создадим новый класс активного объекта Degurstvo.

    Создайте область просмотра на диаграмме класса Main для размещения объектов сегмента Постановка на дежурство.

  • В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  • Перейдите на страницу Основные панели Свойства.
  • В поле Имя: введите Postanovka.
  • Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 0, Ширина: 700, Высота: 970.
  • Перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой. В нём мы разместим объекты сегмента Постановка на дежурство.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 38, Y: 62, Ширина: 642, Высота: 268.
  • Ввод исходных данных

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

    Организуйте ввод исходных данных для сегмента Постановка на дежурство.

  • Перетащите элемент Прямоугольник на элемент Область просмотра, если вы хотите видеть данные в ходе моделирования. Если нет, поместите этот элемент вне области просмотра.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 20, Y: 350, Ширина: 390, Высота: 300.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Initial_data_PD (здесь PD - постановка на дежурство).
  • В Палитре выделите Основная. Перетащите элементы Параметр и Простая переменная на элемент с именем Initial_data_PD и разместите их так, как показано на рис. 5.3.
  • Значения свойств установите согласно табл. 5.1.
  • Простые переменные с именами KolCC1…KolCC5 - количество СС по типам, а KolCC - количество СС всех типов. Эти переменные мы будем вычислять по исходным значениям КСС1 … КСС5 и КССР1 … КССР5 и использовать при генерации равного значению КolСС заявок, имитирующих СС. Количество СС изменять можно только перед началом моделирования, так как заявки, имитирующие СС, генерируются только один раз.

    (рис 5.3) Размещение элементов Параметр и Простая переменная

    Имитация поступления средств связи

  • На Область просмотра мы уже перетащили Скругленный прямоугольник. На нём мы будем размещать, как отмечалось ранее, объекты сегмента Постановка на дежурство.
  • Перетащите на него элемент text и на странице Основные панели Свойства в поле Текст: введите Постановка на дежурство. Поместите этот текст посредине в верхней части элемента Скругленный прямоугольник.
  • Перетащите элемент Прямоугольник на Область просмотра. Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 50, Y: 100, Ширина: 160, Высота: 140.
  • Перетащите элемент text на Прямоугольник и на странице Основные панели Свойства в поле Текст: введите Имитация поступления СС.
  • Перетащите объект source на Прямоугольник. Для записи и хранения параметров СС в дополнительные поля заявок необходимо создать нестандартный класс заявки. Создайте класс заявки ComFacility.
    Свойства элементов на Initial_data_PD
    ИмяТипЗначение по умолчаниюОтображать имя
    KolCC1int0Установить флажок во всех элементах
    KolCC2int0
    KolCC3int0
    KolCC4int0
    KolCC5int0
    KolCCint0
    NumCCint0
    doxdegCC1double20
    doxdegCC2double24,2
    doxdegCC3double32,8
    doxdegCC4double23
    doxdegCC5double25,5
    zatrResCC1double21
    zatrResCC2double24,2
    zatrResCC3double28
    zatrResCC4double26
    zatrResCC5double25,5
    ubitokCC1double32
    ubitokCC2double34,2
    ubitokCC3double37
    ubitokCC4double31
    ubitokCC5double32,5
    ВремяРабСистdouble1000
  • В панели Проект щелкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
  • Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса ComFacility.
  • В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щелкните кнопку Далее.
  • Появится вторая страница Мастера создания Java класса. Добавьте следующие поля Java класса:
    int tipCC;
    double timeMeanRem;
    double nach;
    double nach1;
    double timeMeanOtkaz;
  • Оставьте выбранными флажки Создать конструктор и Создать метод toString ().
  • Щелкните кнопку Готово. Вы увидите редактор кода и в автоматически созданный код вашего Java класса. Закройте код.
  • Выделите объект source. На странице Основные панели Свойства уберите флажок Отображать имя. В полях Класс заявки: и Новая заявка Entity замените ComFacility.

    Установите:

  • Заявки прибывают согласно Интенсивности.
  • Интенсивность прибытия 1
  • Количество заявок, прибывающих за один раз 1
  • Ограниченное количество прибытий установите флажок
  • Максимальное количество прибытий 1
  • В поле Действие при выходе введите Java код:

    KolCC1=degyrstvo.KCC1+degyrstvo.KCCP1;
    degyrstvo.DoxMaxCC1=
    round((degyrstvo.KCC1*doxDegCC1)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC1=degyrstvo.DoxMaxCC1/100;
    degyrstvo.ZatrResCC1=
    round((degyrstvo.KCCP1*zatrResCC1)*ВремяРабСист*100);
    degyrstvo.ZatrResCC1=degyrstvo.ZatrResCC1/100;
    KolCC2=degyrstvo.KCC2+degyrstvo.KCCP2;
    degyrstvo.DoxMaxCC2=
    round((degyrstvo.KCC2*doxDegCC2)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC2=degyrstvo.DoxMaxCC2/100;
    degyrstvo.ZatrResCC2=
    round((degyrstvo.KCCP2*zatrResCC2)*ВремяРабСист*100);
    degyrstvo.ZatrResCC2=degyrstvo.ZatrResCC2/100;
    KolCC3=degyrstvo.KCC3+degyrstvo.KCCP3;
    degyrstvo.DoxMaxCC3=
    round((degyrstvo.KCC3*doxDegCC3)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC3=degyrstvo.DoxMaxCC3/100;
    degyrstvo.ZatrResCC3=
    round((degyrstvo.KCCP3*zatrResCC3)*ВремяРабСист*100);
    degyrstvo.ZatrResCC3=degyrstvo.ZatrResCC3/100;
    KolCC4=degyrstvo.KCC4+degyrstvo.KCCP4;
    degyrstvo.DoxMaxCC4=
    round((degyrstvo.KCC4*doxDegCC4)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC4=degyrstvo.DoxMaxCC4/100;
    degyrstvo.ZatrResCC4=
    round((degyrstvo.KCCP4*zatrResCC4)*ВремяРабСист*100);
    degyrstvo.ZatrResCC4=degyrstvo.ZatrResCC4/100;
    KolCC5=degyrstvo.KCC5+degyrstvo.KCCP5;
    degyrstvo.DoxMaxCC5=
    round((degyrstvo.KCC5*doxDegCC5)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC5=degyrstvo.DoxMaxCC5/100;
    KolCC=KolCC1+KolCC2+KolCC3+KolCC4+KolCC5;
    degyrstvo.ZatrResCC5=
    round((degyrstvo.KCCP5*zatrResCC5)*ВремяРабСист*100);
    degyrstvo.ZatrResCC5=degyrstvo.ZatrResCC5/100;
    degyrstvo.SumDoxMax=degyrstvo.DoxMaxCC1+
    degyrstvo.DoxMaxCC2+degyrstvo.DoxMaxCC3+
    degyrstvo.DoxMaxCC4+degyrstvo.DoxMaxCC5;
    degyrstvo.SumZatrRes=degyrstvo.ZatrResCC1+
    degyrstvo.ZatrResCC2+degyrstvo.ZatrResCC3+
    degyrstvo.ZatrResCC4+degyrstvo.ZatrResCC5;

    Введённым кодом определяется количество СС всех типов, включая и резервные средства связи. Эти данные необходимы в последующем в объекте split. Количества СС как исходные данные будут размещены на активном классе Degyrstvo, который мы создадим позже, поэтому в коде используется доступ к ним в виде, например, degyrstvo.KCC1.

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

    Такой подход к расчётам максимального дохода и затрат на содержание резервных СС принят для экономии машинного времени, поскольку эти показатели зависят только от продолжительности времени моделирования (ВремяРабСист), дохода от дежурства одного СС и затрат на содержание одного резервного СС. То есть данные для их расчёта не носят стохастический характер. Поэтому указанные показатели целесообразно рассчитать здесь, а затем использовать в конце моделирования при обработке накопленных статистических данных.

    Для вывода результатов моделирования с двумя знаками после запятой использовался метод round(). Предварительно результат умножался на 100, а потом делился на эту же величину. Например:

    degyrstvo.DoxMaxCC1=
    round((degyrstvo.KCC1*doxDegCC1)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC1=degyrstvo.DoxMaxCC1/100;
  • Добавьте объекты split и sink (Рис. 5.4). (рис 5.4) Добавлены объекты split и sink
  • Выделите объект split. Установите свойства как на рис. 5.5. Так как копии не унаследуют свойств от оригинала, поэтому в поле Действие при выходе копии введите Java код:
    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;

    В поле entity.tipCC запоминается соответствующий код типа СС, например, entity.tipCC = 5, который необходим для нормального функционирования модели, то есть отличия СС по типам.

  • Объект sink уничтожает заявку-оригинал.
  • (рис 5.5) Элемент source с установленными свойствами

    Распределитель средств связи

    Блок Распределитель средств связи предназначен для распределения СС согласно их типам, т. е. общее количество поступивших СС он должен разделить по типам.

    Данный блок реализуется четырьмя объектами selectOutput и одним объектом queue (Рис. 5.6). Возможна реализация этого блока и одним объектом selectOutput5 совместно также с объектом queue.

    Объект queue предназначен для приема, хранения и отправки на дежурство исправных СС, поступающих из ремонта.

  • Перетащите четыре объекта selectOutput и один объект queue из библиотеки Enterprise Library на диаграмму класса Main. Соедините их так, как показано на рис. 5.6.
  • Установите на странице Основные панели Свойства свойства объектов selectOutput согласно табл. 5.2(при использовании объекта selectOutput5 условия разделения СС по типам останутся такими же). (рис 5.6) Добавлены объекты SelectOutput и queue
    ИмяОтображать имяКласс заявки:Выход true выбираетсяУсловие
    СС1Установите флажкиComFacilityПри выполнении условияentity.tipCC==1
    СС2ComFacilityentity.tipCC==2
    СС3ComFacilityentity.tipCC==3
    СС4ComFacilityentity.tipCC==4
  • СС пятого типа будут направлены на выход false элемента СС4, поэтому пятый объект selectOutput не нужен.
  • Оставьте имя объекта queue и не устанавливайте флажок Отображать имя.
  • Установите Вместимость 100 и флажок Включить сбор статистики.
  • Перетащите из палитры Презентация три элемента text и в соответствующих полях Текст: введите текст, как на рис. 5.6.
  • Создание нового класса активного объекта

    На рис. 5.7 показан в окончательном виде сегмент Постановка на дежурство после добавления блока На дежурство. Для добавления этого блока, который должен выполнить "связь" между сегментом Постановка на дежурство и сегментом Имитация дежурства, создадим новый класс активного объекта.

  • На панели Проект щелкните правой кнопкой мыши Main, с которым вы работаете в данный момент, и выберите Создать/Класс активного объекта из контекстного меню.
  • Откроется окно Новый класс активного объекта.
  • Задайте в поле Имя: имя нового класса Degurstvo.
  • Если нужно, в поле Описание: введите описание сущности, моделируемой этим классом.
  • Щелкните кнопку Готово.

    Создайте область просмотра на диаграмме класса Degurstvo для размещения элементов сегмента Имитация дежурства и текущих результатов моделирования.

  • В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  • Перейдите на страницу Основные панели Свойства.
  • В поле Имя: введите degyr.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 40, Y: 0, Ширина: 730, Высота: 730.
  • Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • (рис 5.7) Сегмент Постановка на дежурство

    Создание элемента нового класса активного объекта

    Созданный новый класс активного объекта Degyrstvo является вложенным объектом. Как вы помните, нам нужно сделать так, чтобы СС передавались на дежурство в сегмент Имитация дежурства из сегмента Постановка на дежурство, а отремонтированные СС после ремонта из сегмента Имитация дежурства возвращались в сегмент Постановка на дежурство.

  • Перетащите элемент Прямоугольник. Установите только флажки На верхнем уровне и На презентации.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 110, Y: 150, Ширина: 100, Высота: 140.
  • Перетащите шесть элементов из палитры Основная и разместите так, как показано на рис. 5.8. Автоматически они будут объединены прямоугольником (с пунктирными линиями) и появится надпись Значок.
  • Возвратитесь на диаграмму класса Main. (рис 5.8) Добавлены на Degyrstvo шесть портов
  • На панели Проект выделите Degyrstvo, перетащите элемент класса и соедините так, как на рис. 5.7. При этом следует иметь в виду, что положение портов на элементе класса Degyrstvo изменить нельзя. Это можно сделать лишь на самом классе.
  • Переключение между областями просмотра

    Области просмотра используются как для навигации по графическому редактору во время создания модели, так и для навигации по окну презентации во время выполнения модели.

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

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

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

  • В Палитре выделите Презентация. Перетащите элемент text, разместите и введите в поле Текст: Постановка на дежурство, как на рис. 5.7.
  • Перетащите второй элемент text, разместите и введите в поле Текст: Имитация дежурства. Текущие результаты.
  • На панели Свойства выделите Динамические и в поле Действие по щелчку: введите следующий Java код:
    degyrstvo.degyr.navigateTo();
  • Проделайте то же для Статистика. Введите Java код:
    degyrstvo.statistika.navigateTo();
  • Сегмент Имитация дежурства

    Ввод исходных данных

    Организуйте ввод исходных данных для сегмента Имитация дежурства. Для ввода исходных данных используйте также элемент Параметр.

  • Перетащите элемент Прямоугольник. На нём мы разместим элементы для ввода исходных данных.
  • Оставьте имя, предложенное системой, а также установленным только один флажок На презентации.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 50, Y: 790, Ширина: 570, Высота: 190.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Initial_data_D (здесь D -дежурство).
  • В Палитре выделите Основная. Перетащите элементы Параметр на элемент с именем Initial_data_D и разместите их так, как показано на рис. 5.9.
  • На странице Основные панели Свойства каждого элемента Параметр установите свойства согласно табл. 5.3.
  • (рис 5.9) Размещение элементов Параметр для ввода данных
    Свойства элементов Параметр на Initial_data_D
    ИмяТипЗначение по умолчаниюОтображать имя
    KCC1int55Установить флажок во всех элементах
    KCC2int100
    KCC3int60
    KCC4int45
    KCC5int60
    KCCР1int2
    KCCР2int4
    KCCР3int4
    KCCР4int3
    KCCР5int4
    stoimRemCC1double17
    stoimRemCC2double18
    stoimRemCC3double16
    stoimRemCC4double20
    stoimRemCC5double21
    timeRem1double6,5
    timeRem2double4,2
    timeRem3double2,8
    timeRem4double3
    timeRem5double5,5
    timeOtkaz1double373
    timeOtkaz2double301
    timeOtkaz3double482
    timeOtkaz4double325
    timeOtkaz5double470
    kol_masterint3
    КолПрогонdouble1000
    ВремяРабСистdouble1000

    Вывод результатов моделирования

    Здесь выводятся все результаты моделирования (Рис. 5.10). Однако с целью экономии машинного времени, выводятся они по-разному. Рассчитанные ранее максимальные доходы от дежурства СС и затраты на содержание резервных СС не выводятся в ходе моделирования. Выводятся только текущие доходы от дежурства СС и текущие затраты на ремонт неисправных СС. Все обработанные результаты выводятся по окончании моделирования. Для организации вывода используется способ Событие (см. п. 5.1.7).

    (рис 5.10) Элементы Простая переменная для выводов результатов моделирования
  • Перетащите элемент Прямоугольник.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 54, Y: 436, Ширина: 696, Высота: 278.
  • Результаты разбиты на две группы: затраты и доходы. Перетащите два элемент text и на странице Основные панели Свойства в поле Текст: введите Затраты и Доходы соответственно.
  • В Палитре выделите Основная. Перетащите элементы Простая переменная. Разместите их, как показано на рис. 5.10.
  • У всех переменных установите флажки Отображать имя и тип double.
  • Событийная часть сегмента Имитация дежурства

    Реализация событийной части сегмента показана на рис. 5.11.

  • Перетащите элемент Скруглённый прямоугольник. На нём мы разместим все элементы сегмента Имитация дежурства.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 60, Y: 60, Ширина: 600, Высота: 350.
  • Перетащите элемент Прямоугольник. На нём мы разместим элементы, непосредственно имитирующие дежурство СС.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 250, Y: 70, Ширина: 170, Высота: 330.
  • Перетащите ещё один элемент Прямоугольник для размещения элементов, имитирующих ремонтное подразделение СС.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 440, Y: 70, Ширина: 190, Высота: 330.
  • Перетащите (или введя один элемент, остальные подобные ему скопируйте) на диаграмму класса Degyrstvo последовательно: пять объектов queue, пять объектов delay, один объект queue, один объект delay и соедините их так, как показано на рис. 5.11.
  • Перетащите три элемента text и введите названия в соответствующие поля Текст: согласно рис. 5.11.
  • На странице Основные панели Свойства каждого объекта установите свойства согласно табл. 5.4.
  • Замечание. Поскольку на входах каждого из объектов delay с именами degCC1 … degCC5 стоят объекты queue с именами rez1 … rez5 соответственно, то возникает желание поставить такие же объекты на выходах delay. Однако это приведёт к неправильной работе модели: некоторые СС не смогут поступать в ремонтное подразделение. (рис 5.11) Сегмент Имитация дежурства
    Объекты сегмента Имитация дежурства и их свойства
    queue
    ИмяВместимостьДействие при выходе
    rez1KCCP1entity.timeOtkaz=1/timeOtkaz1
    rez2KCCP2entity.timeOtkaz=1/timeOtkaz2
    rez3KCCP3entity.timeOtkaz=1/timeOtkaz3
    rez4KCCP4entity.timeOtkaz=1/timeOtkaz4
    rez5KCCP5entity.timeOtkaz=1/timeOtkaz5
    delay
    ИмяВремя задержкиВместимость
    degCC1exponential(entity.timeOtkaz)KCC1
    degCC2exponential(entity.timeOtkaz)KCC2
    degCC3exponential(entity.timeOtkaz)KCC3
    degCC4exponential(entity.timeOtkaz)KCC4
    degCC5exponential(entity.timeOtkaz)KCC5
    remontexponential(entity.timeMeanRem)3
    ИмяДействие при выходе
    degCC1DoxDegCC1+=(time()-entity.nach1)*get_Main().doxDegCC1;
    entity.timeMeanRem=1/timeRem1;
    degCC2DoxDegCC2+=(time()-entity.nach1)*get_Main().doxDegCC2;
    entity.timeMeanRem=1/timeRem2;
    degCC3DoxDegCC3+=(time()-entity.nach1)*get_Main().doxDegCC3;
    entity.timeMeanRem=1/timeRem3;
    degCC4DoxDegCC4+=(time()-entity.nach1)*get_Main().doxDegCC4;
    entity.timeMeanRem=1/timeRem4;
    degCC5DoxDegCC5+=(time()-entity.nach1)*get_Main().doxDegCC5;
    entity.timeMeanRem=1/timeRem5;

    Кроме свойств, указанных в табл. 5.4, нужно также:

  • во всех объектах в поле Класс заявки: Entity заменить 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);}
  • Переключение между областями просмотра

  • В Палитре выделите Презентация. Перетащите элемент text, разместите и введите в поле Текст: Постановка на дежурство, как на рис. 5.11.
  • На панели Свойства выделите Динамические и в поле Действие по щелчку: введите следующий Java код:
    get_Main().Postanovka.navigateTo();
  • Перетащите второй элемент text, разместите и введите в поле Текст: Имитация дежурства.
  • На панели Свойства выделите Динамические и в поле Действие по щелчку: введите следующий Java код:
    Degyr.navigateTo();
  • Проделайте то же для Статистика. Введите Java код:
    statistika.navigateTo();
  • Сегмент Статистика

    Результаты моделирования выводятся в сегменте Имитация дежурства. Тем не менее, организуем вывод результатов моделирования, можно сказать, в более презентабельном виде. Для этого создадим сегмент Статистика (Рис. 5.12).

    (рис 5.12) Сегмент Статистика
  • Создайте область просмотра для размещения элементов сегмента Статистика.
  • В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  • Перейдите на страницу Основные панели Свойства.
  • В поле Имя: введите statistika.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 1036, Ширина: 960, Высота: 630.
  • Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • Перетащите элемент Прямоугольник.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 20, Y: 1076, Ширина: 920, Высота: 580.
  • Перетащите элемент text и в поле Текст: введите Результаты моделирования. На странице Дополнительные панели Свойства введите в поля X: 360, Y: 1096.
  • Перетащите еще тринадцать элементов text, разместите и введите в соответствующие поля Текст: надписи, как на рис. 5.12. Например, при размещении надписи Максимальный доход по типам СС укажите в полях X: 48, Y: 1126, при размещении надписи Коэффициенты использования типов средств связи укажите в полях X: 468, Y: 1418, а при размещении надписи Затраты на содержание резервов по типам средств связи в полях X: 485, Y: 1385.
  • Использование элемента Текстовое поле

    Текстовое поле является простейшим текстовым элементом управления, позволяющим пользователю вводить небольшие объемы текста. Вы можете также связать этот элемент управления с переменной или параметром типа String, double или int.

  • Перетащите элемент из палитры Элементы управления и разместите согласно рис. 5.12.
  • Выделяя последовательно каждый элемент Текстовое поле, переходите на страницу Основные панели Свойства и в поле Имя: давайте имя элементу согласно табл. 5.5.
  • 5Имена элементов Текстовое поле
    123456
    Максимальный доход по типам СС
    editbox1editbox2editbox3editbox4editbox5editbox
    Доход от дежурства по типам СС и всего
    editbox11editbox12editbox13editbox14editbox15editbox16
    Стоимость ремонта по типам СС и всего
    editbox21editbox22editbox23editbox24editbox25editbox26
    Суммарная прибыль от использования СС и всего
    editbox31editbox32editbox33editbox34editbox35editbox36
    Коэффициенты прибыли по типам СС и всего
    editbox41editbox42editbox43editbox44editbox45editbox46
    Затраты на содержание резервов по типам СС и всего
    editbox6editbox7editbox8editbox9editbox10editbox17

    Использование элемента Диаграмма

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

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

    AnyLogic поддерживает несколько видов диаграмм.

    Простые диаграммы:

  • столбиковая диаграмма;
  • диаграмма с накоплением;
  • круговая диаграмма.
  • Диаграммы с историей (временные диаграммы):

  • график;
  • временной график;
  • временная диаграмма с накоплением;
  • временная цветовая диаграмма.
  • Используйте диаграмму с накоплением.

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

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

  • Перетащите элемент Диаграмма с накоплением из палитры Статистика и разместите согласно рис. 5.12.
  • Выделяя последовательно каждый элемент Диаграмма с накоплением, переходите на страницу Внешний вид панели Свойства и установите:
  • Смещение по оси X: 40
  • Смещение по оси Y: 20
  • Ширина: 92
  • Высота: 138
  • Относительная ширина: 52
  • Направление: вертикальное
  • Цвет текста, цвет фона и цвет границы установите по своему усмотрению.

  • После установки этих свойств выделите левый элемент.
  • Перейдите на страницу Основные панели Свойства.
  • Щелкните Добавить элемент данных.
  • В поле Заголовок: введите СС1.
  • В поле Значение: введите Java код
    degCC1.statsUtilization.mean()
  • Установите Масштаб: Фиксированный и Обновлять автоматически. Цвет столбика, который будет отображать коэффициент использования группы СС одного типа, установите по своему усмотрению.
  • Проделайте пп. 3…7 для остальных 2…5 элементов Диаграмма с накоплением. При этом в поле Заголовок: вводите: СС2, СС3, СС4, СС5 соответственно.
  • В поле Значение: вводите Java коды также для объектов 2…5 соответственно:
    degCC2.statsUtilization.mean()
    degCC3.statsUtilization.mean()
    degCC4.statsUtilization.mean()
    degCC5.statsUtilization.mean()
  • На этом реализация сегмента Статистика завершена. Осталось только организовать переключение между областями просмотра.

    Переключение между областями просмотра

  • В Палитре выделите Презентация. Перетащите элемент text, разместите и введите в поле Текст: Постановка на дежурство, как на рис. 5.12.
  • На панели Свойства выделите Динамические и в поле Действие по щелчку: введите следующий Java код:
    get_Main().Postanovka.navigateTo();
  • Перетащите второй элемент text, разместите и введите в поле Текст: Имитация дежурства.
  • На панели Свойства выделите Динамические и в поле Действие по щелчку: введите следующий Java код:
    degyrstvo.degyr.navigateTo();
  • Проделайте то же для Статистика. Введите Java код:
    statistika.navigateTo();
  • Все три сегмента модели построены. Теперь вернемся к выводу результатов моделирования с использованием способа событие.

    Использование способа Событие

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

    Есть три типа событий.

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

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

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

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

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

  • Перетащите элемент из палитры Модель на диаграмму класса активного объекта. Измените его имя на ResulsModeling. Нажмите 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())*get_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())*get_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())*
    get_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())*
    get_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())*
    get_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);
    editbox11.setText(DoxDegCC1);
    editbox2.setText(DoxMaxCC2);
    editbox12.setText(DoxDegCC2);
    editbox3.setText(DoxMaxCC3);
    editbox13.setText(DoxDegCC3);
    editbox4.setText(DoxMaxCC4);
    editbox14.setText(DoxDegCC4);
    editbox5.setText(DoxMaxCC5);
    editbox15.setText(DoxDegCC5);
    editbox.setText(SumDoxMax);
    editbox16.setText(SumDoxDeg);
    //вывод стоимости ремонта по типам СС и всего
    editbox21.setText(ZatrRemCC1);
    editbox22.setText(ZatrRemCC2);
    editbox23.setText(ZatrRemCC3);
    editbox24.setText(ZatrRemCC4);
    editbox25.setText(ZatrRemCC5);
    editbox26.setText(SumZatrRem);
    //вывод чистой прибыли от использования по типам СС и всего
    editbox31.setText(PribCC1);
    editbox32.setText(PribCC2);
    editbox33.setText(PribCC3);
    editbox34.setText(PribCC4);
    editbox35.setText(PribCC5);
    editbox36.setText(SumPribil);
    //вывод коэфициентов прибыли по типам СС и всего
    editbox41.setText(koefPribCC1);
    editbox42.setText(koefPribCC2);
    editbox43.setText(koefPribCC3);
    editbox44.setText(koefPribCC4);
    editbox45.setText(koefPribCC5);
    editbox46.setText(koefPribil);
    //вывод затрат на содержание резервов по типам СС и всего
    editbox6.setText(ZatrResCC1);
    editbox7.setText(ZatrResCC2);
    editbox8.setText(ZatrResCC3);
    editbox9.setText(ZatrResCC4);
    editbox10.setText(ZatrResCC5);
    editbox17.setText(SumZatrRes);
  • Из кода следует, что по окончании моделирования, которое длится 1 000 000 единиц модельного времени, сработает метод событие, будут рассчитаны и выведены результаты моделирования.

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

    Для вывода результатов моделирования в текстовые поля editbox используется функция setText(), в качестве аргумента которой указывается имя элемента Простая переменная, например, editbox1.setText(DoxMaxCC1);

    Запустите модель. На рис. 5.13 и рис. 5.14 показаны результаты моделирования.

    (рис 5.13) Результаты моделирования (рис 5.14) Результаты сегмента Статистика

    Проведение экспериментов

    AnyLogic предоставляет пользователю возможность провести следующие эксперименты:

  • простой эксперимент;
  • оптимизация;
  • варьирование переменных;
  • сравнение прогонов;
  • Монте-Карло;
  • анализ чувствительности;
  • калибровка;
  • нестандартный.
  • Последние пять экспериментов доступны только в AnyLogic Professional.

    Простой эксперимент

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

    При создании модели автоматически создается один простой эксперимент, названный Simulation. Именно такой эксперимент мы с вами и рассматривали до сих пор.

    Эксперимент этого типа используется в большинстве случаев. Другие эксперименты нужны тогда, когда важную роль играют значения параметров модели. То есть вам нужно проанализировать, как они влияют на поведение или эффективность моделируемой системы или если вам нужно найти оптимальные параметры вашей модели.

    Далее в рамках данного пособия мы остановимся на доступных в версии AnyLogic University экспериментах оптимизации и варьирования переменных, овладев методиками проведения которых, вы самостоятельно сможете выполнять в AnyLogic Professional и другие эксперименты.

    Связывание параметров

    Начиная создавать модель в AnyLogic, мы ничего не говорили об экспериментах и особенностях их проведения. Поэтому все исходные данные разместили на Initial_data_PD (рис. 5.3) и Initial_data_D (рис. 5.9) так, как нам представлялось удобным для построения модели и управления ею в ходе проведения простого эксперимента.

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

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

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

    Разместите элементы, как показано на рис. 5.15. Внесите соответствующие изменения в модель. Обратите внимание на различие имён связываемых параметров, например, КССР_1.

    Свяжите параметры корневого объекта Main с параметрами вложенного объекта класса Degyrstvo.

  • Откройте диаграмму класса активного объекта Main.
  • Выберите на диаграмме вложенный объект degyrstvo.
  • Перейдите на страницу Параметры панели Свойства.
  • В таблице Параметры в поле Значение введите имя параметра класса объекта-владельца Main, значение которого нужно передавать этому параметру вложенного объекта. В результате у вас должно быть так, как на рис. 5.16.
  • (рис 5.15) Размещение элементов на Initial_data_ PD (рис 5.16) Фрагмент страницы Параметры после связывания параметров

    Эксперимент Оптимизация стохастических моделей

    Эксперимент Оптимизация может проводиться в AnyLogic оптимизатором OptQuest для детерминированных и стохастических моделей.

    Наша модель ComSystem стохастическая. Создайте оптимизационный эксперимент стохастической модели с целью определения максимального коэффициента прибыли в зависимости от количества резервных СС и мастеров-ремонтников.

  • В панели Проект щелкните правой кнопкой мыши элемент модели ComSystem и из контекстного меню выберите Coздать/ Эксперимент.
  • В появившемся диалоговом окне из списка Тип эксперимента: выберите Оптимизация (рис. 5.17). (рис 5.17) Диалоговое окно Новый эксперимент
  • В поле Имя введите имя эксперимента, например, OptComSystem. Имя эксперимента должно начинаться с заглавной буквы - таково правило названия классов в Java.
  • В поле Корневой класс модели: выберите Main. Этим действием вы задали корневой (главный) класс эксперимента. Объект этого класса будет играть роль корня иерархического дерева объектов модели, запускаемой оптимизационным экспериментом.
  • Если вы хотите применить к создаваемому эксперименту временные установки другого эксперимента, оставьте установленным флажок Копировать установки модельного времени из: и выберите эксперимент из расположенного справа выпадающего списка. В данном случае оставьте, так как есть: Simulation.
  • Щелкните кнопку Готово. Появится страница Основные панели Свойства (рис. 5.18).
  • Установите опцию максимизировать.
  • Установите Фиксированное начальное число (воспроизводимые прогоны).
  • В поле Начальное число введите 5672.
  • Целевая функция доступна как root.Поэтому в поле Целевая функция введите root.degyrstvo.koefPribil.
  • Оставьте установленным флажок Количество итераций:. Под итерацией понимается один опыт (одно наблюдение). Количество итераций - это цель стратегического планирования эксперимента - определение количества наблюдений и уровней факторов в них для получения полной и достоверной информации о модели.
  • Число итераций модели при полном факторном эксперименте, то есть число всех возможных сочетаний факторов, определяется по формуле: $$I=k_1 \cdot k_2 \cdot … \cdot k_i\cdot … \cdot k_m,$$ где $$k_i$$ - число уровней i-го фактора, $$i=\overline{1,m}$$.
  • В нашей модели нужно менять количество резервных средств связи КССР_1…КССР_5 и количество мастеров-ремонтников Kol_masterov, то есть всего 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=3 \cdot 6 \cdot 6 \cdot 6 \cdot 5 \cdot 5 =16200$$ (рис 5.18) Вкладка Основные оптимизационного эксперимента
  • Оставьте 500 в поле Количество итераций:, так как данная версия AnyLogic ограничена этим количеством итераций.
  • Задайте параметры, значения которых будут меняться. В таблице на рис. 5.18 перечислены все параметры корневого объекта Main.
  • Чтобы разрешить варьирование параметров оптимизатором, перейдите на строку с параметром КССР_1. Щелкните мышью в ячейке Тип. Выберите тип параметра, отличный от значения фиксированный. Так как параметр KCCР_1 целочисленный типа int, выберите дискретный.
  • Задайте диапазон допустимых значений параметра. Для чего введите в ячейку Мин минимальное значение 1, в ячейку Макс максимальное значение, например, для КССР1, 3. Так как параметр дискретный, в ячейке Шаг укажите величину шага 1.
  • Задайте так же остальные параметры, как на рис. 5.18.
  • Перейдите на страницу Репликации панели Свойства (рис. 5.19).
  • Установите флажок Использовать репликации.
  • Число репликаций (прогонов) в одной итерации (наблюдении) может быть фиксированным или переменным. Фиксированное число репликаций, например, при доверительной вероятности $$\alpha = 0,95$$, точности $$\varepsilon =0,1$$ и стандартном отклонении $$\sigma=0,1$$ может быть определено по формуле [1]: $$N=t^{2}_{\alpha}\frac{\sigma^2}{\varepsilon^2}=1,96^2\frac{0,1^2}{0,1^2}=3,8416\approx4,$$ где$$t_{\alpha}$$ - табулированный аргумент функции Лапласа.

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

  • Выберите опцию Фиксированное количество репликаций и в соответствующем поле установите 4. (рис 5.19) Страница Репликации оптимизационного эксперимента
  • Вернитесь на страницу Основные и щелкните кнопку Создать интерфейс. Кнопка находится в правом верхнем углу страницы Основные. После щелчка удаляется содержимое презентации эксперимента и создается интерфейс эксперимента заново (рис. 5.20) согласно его текущим установкам (набору оптимизационных параметров и их свойствам и т. д.). Поэтому создавать интерфейс нужно только после окончания задания параметров эксперимента. На интерфейсе видны знаки вопросов напротив оптимизационных параметров.
  • В меню запуск выполните ComSystem/OptComSystem.
  • Щелкните Запустить оптимизацию. Начнет выполняться эксперимент. Во время эксперимента можно видеть на графике изменение значения целевой функции. После 500*4=2 000 прогонов (см. рис. 5.21) эксперимент остановится.
  • Результаты оптимизационного эксперимента приведены на рис. 5.21. Наилучшее значение целевой функции - коэффициент прибыли - равно 0,959. Получено оно на 154 итерации при следующих оптимальных значениях параметров: КССР_1=2, КССР_2= КССР_3= КССР_4=КССР_5=1, Kol_master=5.
  • Вернитесь к простому эксперименту. Измените значения КССР_1… КССР_5 и Kol_master на Initial_data_PD на значения, полученные в оптимизационном эксперименте. (рис 5.20) Интерфейс оптимизационного эксперимента
  • Запустите простой эксперимент. Вы получите коэффициент прибыли 0,949, то есть такой же, как и в оптимизационном эксперименте. При этом уменьшатся затраты на содержание резервных СС и возрастут коэффициенты использования СС.
  • Замечание. Возможно, что результат оптимизационного эксперимента будет отличаться по коэффициенту прибыли в большую сторону при снятии ограничения в 500 итераций. (рис 5.21) Результаты оптимизационного эксперимента

    Обратите внимание на интерфейс оптимизационного эксперимента (рис. 5.20): заготовка для графика относительного коэффициента прибыли расположена в первом квадранте, то есть коэффициент предполагается положительным. Однако при некоторых параметрах система предоставления услуг связи оказывается убыточной. Поэтому появляется четвёртый квадрант (рис. 5.21), в котором искомый коэффициент отрицательный.

    Эксперимент Варьирование параметров

    Эксперимент Варьирование параметров также может проводиться для детерминированных и стохастических моделей.

    Создайте эксперимент Варьирование параметров для стохастической модели ComSystem с целью наблюдения за изменением коэффициента прибыли в зависимости от дохода за дежурство средств связи.

  • В панели Проект щелкните правой кнопкой мыши элемент модели ComSystem и из контекстного меню выберите Создать эксперимент.
  • В появившемся диалоговом окне из списка Тип эксперимента: выберите Варьирование параметров (рис. 5.22).
  • В поле Имя введите имя эксперимента, например, ParVarComSystem.
  • Остальные установки оставьте такими, как на рис. 5.18. Назначение их тоже, что и в оптимизационном эксперименте. (рис 5.22) Окно Новый эксперимент с выбранным экспериментом (рис 5.23) Страница Основные эксперимента варьирования параметров
  • Щелкните кнопку Готово. Появится страница Основные панели Свойства (рис. 5.23).
  • Обратите внимание, что на странице Основные по сравнению с оптимизационным экспериментом отсутствуют опции минимизировать, максимизировать, Количество итераций. Последнее определяется AnyLogic в зависимости от диапазонов и шагов изменения параметров.
  • Задайте диапазон допустимых значений параметра doxDegCC1. Перейдите в таблице на рис. 5.23 на строку с этим параметром. Щелкните мышью в ячейке Тип. Выберите тип параметра, отличный от значения фиксированный. Параметр doxDegCC1 типа double, поэтому он может изменяться в диапазоне. Выберите Диапазон. В ячейку Мин введите минимальное значение 18, в ячейку Макс - максимальное значение 24, в ячейке Шаг укажите величину шага 0.5.
  • Задайте также остальные параметры, как на рис. 5.23.
  • Перейдите на страницу Репликации панели Свойства и установите флажок Использовать репликации. В поле Кол-во репликаций за итерацию, установите, как и в предыдущем эксперименте, 4.
  • Вернитесь на страницу Основные и щелкните кнопку Создать интерфейс.
  • В эксперименте Варьирование параметров в отличие от эксперимента Оптимизация интерфейс создает пользователь. Связано это с тем, что выходными результатами данного эксперимента могут быть любые показатели моделируемой системы.
  • Создайте интерфейс, показанный на рис. 5.24. Здесь вы видите график, который будет отображать значение коэффициента прибыли для каждой итерации.
  • Перетащите элемент График из палитры Статистика на диаграмму активного класса.
  • Щелкните Добавить набор данных.
  • Установите опцию Набор данных. Заголовок: KoefPribil. Набор данных: dataset. Установите Не обновлять автоматически.
  • Перейдите на страницу Дополнительные и установите: X: 260, Y: 100, Ширина: 510, Высота: 400, Цвет фона: Нет заливки, Цвет границы: Нет линии.
  • Перейдите на страницу Внешний вид. Установите: Смещение по Х: 40, Смещение по Y: 20, Ширина: 450, Высота: 330.
  • Также из палитры Статистика перетащите элемент Набор данных. Установите опцию Не обновлять автоматически.
  • Из палитры Основная перетащите элемент Простая переменная. На странице Основные панели Свойства в поле Имя: введите valueOfKoefPribil. Установите Уровень доступа: public. Тип: double.
  • Щелкните диаграмму класса. Перейдите на страницу Дополнительные панели Свойства и введите коды:
  • в поле Действие после прогона модели:
    valueOfKoefPribil = root.degyrstvo.koefPribil;
  • в поле Действие после итерации
    dataset.add(getCurrentIteration(), valueOfKoefPribil);
  • Выполните ComSystem2/VarParComSystem. (рис 5.24) Интерфейс эксперимента варьирования параметров
  • Щелкните Запустить эксперимент. Начнет выполняться эксперимент. Во время эксперимента можно видеть на графике изменение значения коэффициента прибыли. Фрагмент результатов выполнения эксперимента Варьирование параметров приведен на рис. 5.25.
  • Эксперимент был приостановлен после 74 прогона, то есть на 74/4 $$\rightarrow$$ 19-й итерации. (рис 5.25) Фрагмент результатов выполнения эксперимента Варьирование параметров
  • Коэффициент прибыли составляет 0,954 при doxDegCC1 = 21,5, doxDegCC2 = 20,5, doxDegCC3 = 28, doxDegCC4 = 19, doxDegCC5 = 23.
  • Поскольку вы оставили значения КССР_1… КССР_5 и Kol_master на Initial_data_PD, полученные в оптимизационном эксперименте (см. рис. 5.25), то значения коэффициентов прибыли в эксперименте варьирования параметрами близки к 0,949.
  • В обоих экспериментах мы использовали опцию Фиксированное начальное число (воспроизводимые прогоны), поэтому генератор случайных чисел модели всегда инициализировался одним и тем же начальным числом 5672, заданным нами в поле Начальное число. Все запуски модели были идентичными и воспроизводимыми, что полезно при отладке модели.

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

    Создайте оптимизационный эксперимент OptComSystem1, который будет отличаться от OptComSystem лишь выбранной опцией Случайное начальное число (уникальные прогоны).

    Запустите эксперимент. Вы получите следующие результаты. Наилучшее значение целевой функции - коэффициент прибыли - равно 0,957. Получено оно на 172 итерации при следующих оптимальных значениях параметров: КССР_1=1, КССР_2=2, КССР_3=1, КССР_4=1, КССР_5=2, Kol_master=5. Таким образом, получен другой коэффициент прибыли, при этом другое значение оптимального параметра КССР_5=2.

    Оптимизационный эксперимент OptComSystem1 выполнялся 4839,2 сек (80,66 мин). Это при том, что эксперимент проводился на компьютере с четырёхядерным процессором и одновременно выполнялись четыре прогона модели.

    Экспорт модели как Java апплета

    Модели AnyLogic являются приложением Java, поэтому их можно запускать на большинстве современных платформ, а также помещать на веб-сайты в виде апплетов.

    Наличие такой возможности позволяет удалённым пользователям запускать интерактивные модели в веб-браузере при отсутствии AnyLogic или какого-либо другого программного обеспечения. В этом случае на клиентской машине будут запускаться скопированные из сети файлы модели с такой же поддержкой интерактивной работы, что и при запуске из среды AnyLogic.

    Экспортируйте модель ComSystem в виде Java апплета.

  • Щелкните в панели Экспорт/В Java апплет (запускается в веб браузере) из контекстного меню.
  • Откроется диалоговое окно Экспорт модели (рис. 5.26). Щелчком мыши раскройте список Экспортировать эксперимент и выберите в нем Simulation. Настройки этого эксперимента будут применены к экспортируемой модели.
  • В поле Каталог для создаваемых файлов укажите каталог, в который вы хотите поместить файлы экспортируемой модели. Можно также выбрать каталог с помощью диалогового окна навигации, которое становится доступным при нажатии кнопки Выбрать.
  • По умолчанию кнопки панели инструментов и другие элементы пользовательского интерфейса апплета будут на том языке, который выбран в настройках вашего компьютера (Язык: <системный по-умолчанию>). При необходимости можно выбрать для интерфейса апплета другой язык из выпадающего списка Язык: (на данный момент AnyLogic поддерживает русский, английский, китайский, немецкий и итальянский языки). (рис 5.26) Диалоговое окно Экспорт модели (рис 5.27) Набор файлов Java апплет
  • Оставьте установленным флажок Открыть апплет модели в веб браузере.
  • Щелкните кнопку Готово. Откроется диалоговое окно, в котором будет сообщение об успешном завершении экспортирования модели ComSystem: Модель ComSystem была экспортирована в G:\BOEV.
  • Щелкните OK.
  • Модель, экспортированная как Java апплет, представляет собой набор следующих файлов (рис. 5.28):

  • файл .html, используемый для запуска Java апплета;
  • файл com.xj.anylogic.engine.jar исполняющего модуля AnyLogic;
  • скомпилированный .jar файл модели (model.jar);
  • .jar файлы и классы, необходимые для построения модели.
  • При публикации апплета модели в сети Интернет нужно предоставить доступ ко всем этим файлам из кода апплета. Это значит, что если вы добавляете ссылку на .html файл модели на веб страницу, то необходимо разместить все эти файлы в той же директории, где и этот .html файл. Для показа апплета на своей веб странице следует скопировать код апплета из .html файла модели в код своей страницы, и добавить все файлы, сгенерированные при экспорте модели, в тот же каталог, где находится ваша страница.

    Запустите апплет модели, дважды щелкнув ComSystem.html. Результаты работы апплета модели показаны на рис. 5.28. Коэффициент прибыли равен 0,949 (см. п. 5.1.8.3).

    (рис 5.28) Результаты работы апплета модели ComSystem

    Модель в GPSS World

    Состав модели в GPSS World

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

    Какие ограничения в системе?

  • Число мастеров-ремонтников в ремонтном подразделении.
  • Максимальное число одновременно находящихся СС на дежурстве.
  • Максимальное число резервных СС.
  • Общее число СС в системе.
  • Для моделирования двух первых ограничений целесообразно использовать МКУ, а для третьего и четвертого ограничений - транзакты.

    Модель системы связи должна состоять из следующих сегментов:

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

    Программа GPSS-модели

    Предполагается, что количество типов СС в системе предоставления услуг связи может изменяться от одного до максимального значения 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 WorldAnyLogic
    Типы средств связи
    СС1СС2СС3СС4СС5СС1СС2СС3СС4СС5
    Вариант 1: ССР2 = 4, мастеров-ремонтников = 3
    Коэффициент прибыли по типам СС0,3740,3270,6270,40,5730,380,3320,6330,4050,576
    Суммарный коэффициент прибыли0,460,468
    Коэффициент использования по типам СС0,7790,7410,8530,780,8460,7810,7430,8560,7810,847
    Суммарный коэффициент использования СС0,7990,8
    Вариант 2: ССР2 = 5, мастеров-ремонтников = 3
    Коэффициент прибыли по типам СС0,3770,3360,6260,3970,5710,3690,3320,6240,3930,57
    Суммарный коэффициент прибыли0,4620,462
    Коэффициент использования по типам СС0,7790,7490,8520,7780,8450,7770,7470,8510,7760,844
    Суммарный коэффициент использования СС0,8010,8
    Вариант 3: ССР2 = 6, мастеров-ремонтников = 3
    Коэффициент прибыли по типам СС0,3640,330,6190,3850,5640,3610,3310,620,390,563
    Суммарный коэффициент прибыли0,4530,457
    Коэффициент использования по типам СС0,7740,7510,8490,7730,8420,7740,7510,850,7750,841
    Суммарный коэффициент использования СС0,7970,797
    Вариант 4: ССР2 = 4, мастеров-ремонтников = 4
    Коэффициент прибыли по типам СС0,890,8950,9310,890,9110,8890,8920,9310,8890,91
    Суммарный коэффициент прибыли0,9030,905
    Коэффициент использования по типам СС0,9780,9770,9960,9880,9950,9780,9770,9960,9880,994
    Суммарный коэффициент использования СС0,9870,987
    Вариант 5: ССР2 = 5, мастеров-ремонтников = 4
    Коэффициент прибыли по типам СС0,8870,8920,930,8870,9090,8850,890,930,8860,909
    Суммарный коэффициент прибыли0,9010,902
    Коэффициент использования по типам СС0,9770,9810,9960,9880,9940,9760,980,9950,9870,994
    Суммарный коэффициент использования СС0,9870,986
    Вариант 6: ССР2 = 6, мастеров-ремонтников = 4
    Коэффициент прибыли по типам СС0,8850,890,930,8860,9090,8870,890,930,8870,91
    Суммарный коэффициент прибыли0,90,903
    Коэффициент использования по типам СС0,9770,9840,9950,9870,9940,9770,9840,9960,9880,994
    Суммарный коэффициент использования СС0,9870,987
    Вариант 7: ССР2 = 4, мастеров-ремонтников = 5
    Коэффициент прибыли по типам СС0,9350,9440,9390,9140,9220,9360,9450,940,9150,923
    Суммарный коэффициент прибыли0,9310,934
    Коэффициент использования по типам СС0,9960,99810,99910,9960,99810,9991
    Суммарный коэффициент использования СС0,9980,998
    Вариант 8: ССР2 = 5, мастеров-ремонтников = 5
    Коэффициент прибыли по типам СС0,9360,9360,9390,9150,9220,9360,9360,940,9150,923
    Суммарный коэффициент прибыли0,930,932
    Коэффициент использования по типам СС0,9960,99910,99910,9960,99910,9991
    Суммарный коэффициент использования СС0,9980,998
    Вариант 9: ССР2 = 6, мастеров-ремонтников = 5
    Коэффициент прибыли по типам СС0,9360,9270,9390,9150,9220,9360,9280,940,9150,923
    Суммарный коэффициент прибыли0,9280,929
    Коэффициент использования по типам СС0,9960,99910,99910,9960,99910,9991
    Суммарный коэффициент использования СС0,9980,998
    Вернуться к учебному плану