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

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

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

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

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

    Параметры nach1 и nach изменяются при каждом поступлении СС на дежурство и в ремонтное подразделение соответственно. Они используются при расчётах дохода от дежурства и затрат на ремонт неисправного СС. В них заносится время начала дежурства и начала ремонта соответственно.

    Кроме рассмотренных, СС имеют еще следующие параметры (не заносимые в дополнительные поля заявок, имитирующих СС):

  • doxDegCC1 … doxDegCC5 - доход от дежурства одного СС первого … пятого типов соответственно;
  • zatrResCC1 … zatrResCC5 - затраты на содержание резерва одного СС первого … пятого типов соответственно;
  • stoimRem1 … stoimRem5 - стоимость ремонта одного СС первого … пятого типов соответственно.
  • В ходе моделирования, а также по завершении моделирования рассчитываются:

  • PribCC1 … PribCC5, SumPribil - абсолютные величины ожидаемой прибыли по каждому типу СС и в целом;
  • KoefPribCC1 … KoefPribCC5, KoefPribil - относительные коэффициенты ожидаемой прибыли по каждому типу СС и в целом.
  • Рассмотрим вычисление этих показателей на примере PribCC1 и KoefPribCC1.

    Предполагается, что максимальный доход DoxMaxCC1 от дежурства будет в случае, когда все СС первого типа будут постоянно находиться на дежурстве, то есть:

    DoxMaxCC1= KCC1*doxDegCC1*ВремяРабСист

    где ВремяРабСист - время работы моделируемой системы.

    Фактический доход DoxDegCC1 от дежурства СС первого типа составит:

    DoxDegCC1+=(time()-entity.nach1)*
    main.doxDegCC1;

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

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

    UbitokCC1=(1-degCC1.statsUtilization.mean())*
    main.ubitokCC1*ВремяРабСист*KCC1;

    где (1-degCC1.statsUtilization.mean()) - средний коэффициент отсутствия СС первого типа на дежурстве за всё время моделирования.

    Затраты на ремонт неисправных СС и содержание резервных СС первого типа составят соответственно:

    ZatrRemCC1+=(time()-entity.nach)*stoimRemCC1;
    ZatrResCC1= KCCP1*zatrResCC1* ВремяРабСист

    Абсолютная величина ожидаемой прибыли составит:

    PribCC1=DoxDegCC1-(ZatrRemCC1+ZatrRemCC1+UbitokCC1).

    Относительный коэффициент прибыли равен:

    KoefPribCC1=PribCC1/DoxMaxCC1.

    Показатели в целом за систему связи:

    SumPribil=SumDoxDeg-(SumZatrRes+SumZatrRem+SumUbitok),
    KoefPrib=SumPrib/SumDoxMax,

    где SumDoxMax, SumDoxDeg, SumZatrRes, SumZatrRem, SumUbitok - соответствующие доходы и затраты за систему.

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

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

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

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

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

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

    Свойства элементов на Исходные_данные_ПД
    ИмяТипЗначение по умолчаниюОтображать имя
    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

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

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

  • Из палитры Презентация перетащите элемент Область просмотра.
  • На панели Свойства в поле Имя: введите постановка.
  • Задайте Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • Перейдите на страницу Местоположение и размер. Введите в поля X: 0, Y: 0, Ширина: 700, Высота: 350.
  • Перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой. В нём мы разместим объекты сегмента Постановка на дежурство.
  • Перейдите на страницу Местоположение и размер. Введите в поля X: 38, Y: 62, Ширина: 642, Высота: 268.
  • На Область просмотра мы уже перетащили Скругленный прямоугольник. На нём мы будем размещать, как отмечалось ранее, объекты сегмента Постановка на дежурство.
  • Перетащите на него элемент text и на панели Свойства в поле Текст: введите Постановка на дежурство. Поместите этот текст посредине в верхней части элемента Скругленный прямоугольник.
  • Перетащите элемент Прямоугольник на Область просмотра. На странице Местоположение и размер введите в поля X: 50, Y: 100, Ширина: 170, Высота: 140.
  • Перетащите элемент text на Прямоугольник и на панели Свойства в поле Текст: введите Имитация поступления СС.
  • Перетащите объект source на Прямоугольник. Для записи и хранения параметров СС в поля заявок необходимо создать нестандартный тип агента. Создайте тип агента ComFacility.
  • В панели Проекты Щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
  • Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса ComFacility.
  • В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щёлкните Далее.
  • Появится вторая страница Мастера создания Java класса. Добавьте следующие поля Java класса:
    tipCC          int;
    	timeMeanRem    double;
    	nach           double;
    	nach1          double;
    	timeOtkaz  		double;
  • Оставьте выбранными флажки Создать конструктор и Создать метод toString ().
  • Щёлкните кнопку Готово. Закройте редактор кода.
  • Щёлкните правой кнопкой мыши в панели Проект только что созданный Java класс и в контекстном меню выберите Преобразовать Java класс в тип агента.
  • Появится окно c автоматически созданными параметрами нестандартного типа заявок ComFacility. Закройте его.
  • Выделите объект source.
  • На панели Свойства уберите флажок Отображать имя.
  • В полях Тип заявки: и Новая заявка: Agent замените ComFacility. Установите:
  • Прибывают согласно Интенсивности.
  • Интенсивность прибытия 1
  • Ограниченное количество прибытий установите флажок
  • Максимальное количество прибытий 1
  • На странице Действия в поле При выходе: введите Java код:

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

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

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

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

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

    degyrstvo.DoxMaxCC1=
    round((degyrstvo.KCC1*doxDegCC1)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC1=degyrstvo.DoxMaxCC1/100;
  • Добавьте объекты split и sink (Рис. 5.4).
  • Выделите объект split. Установите свойства как на Рис. 5.5. Так как копии не унаследуют свойств от оригинала, поэтому на странице Действия в поле При выходе копии: введите Java код: (рис 5.4) Добавлены объекты split и sink
    NumCC++;
    if (NumCC <= KolCC) 
      entity.tipCC = 5;
    if (NumCC <= (KolCC1+KolCC2+KolCC3+KolCC4))
       entity.tipCC = 4; 
    if (NumCC <= (KolCC1+KolCC2+KolCC3)) 
       entity.tipCC = 3;       
    if (NumCC <= (KolCC1+KolCC2)) 
       entity.tipCC = 2; 
    if (NumCC <= KolCC1) 
     entity.tipCC = 1;
  • Переменная NumCC предназначена для последовательного счёта СС всех типов. Она используется для определения принадлежности СС к соответствующему типу и занесения кода этого типа СС в поле entity.tipCC, например, entity.tipCC = 5, который необходим для нормального функционирования модели, то есть отличия СС по типам.

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

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

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

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

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

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

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

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

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

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

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

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

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

    Замечание. В размещаемых далее элементах и объектах сегмента сбрасывайте флажок Отображается на верхнем уровне.
  • Перетащите элемент Область просмотра. Перейдите на панель Свойства. В поле Имя: введите исходные_данные_Д.
  • Задайте Выравнивать по: Верхн. левому углу.
  • Выберите масштабирование Подогнать под окно.
  • На странице Местоположение и размер введите в поля X: 40, Y: 800, Ширина: 650, Высота: 240.
  • Перетащите элемент Прямоугольник. На нём мы разместим элементы для ввода исходных данных.
  • Оставьте имя, предложенное системой.
  • Перейдите на страницу Местоположение и размер. Введите в поля X: 50, Y: 840, Ширина: 620, Высота: 190.
  • Перетащите элемент text и на панели Свойства в поле Текст: введите Исходные_данные_Д (здесь Д - дежурство).
  • Перетащите, используя копирование, элементы Параметр на элемент с именем Исходные_данные_Д и разместите их так, как показано на Рис. 5.9. При копировании целесообразно указать имя первого элемента и его тип, например, KCC1, int. Значения по умолчанию нужно установить потом для каждого элемента своё.
  • На панели Свойства каждого элемента Параметр установите свойства согласно Табл. 5.3.
  • (рис 5.9) Размещение элементов Параметр для ввода данных
    Свойства элементов Параметр на Исходные_данные_Д
    ИмяТипЗначение по умолчаниюОтображать имя
    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: 40, Y: 430, Ширина: 730, Высота: 350.
  • Перетащите элемент Прямоугольник.
  • Перейдите на панель Свойства. Введите в поля X: 54, Y: 466, Ширина: 710, Высота: 300.
  • Результаты разбиты на две группы: затраты и доходы. Перетащите два элемент text и на панели Свойства в поле Текст: введите Затраты и Доходы соответственно.
  • В Палитре выделите Основная. Перетащите, используя копирование, элементы Переменная. Разместите их, дайте имена, как показано на Рис. 5.10. У всех переменных установите флажки Отображать имя и тип double.
  • Событийная часть сегмента Имитация дежурства

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

  • Перетащите элемент Скруглённый прямоугольник. На нём мы разместим все элементы сегмента Имитация дежурства.
  • На странице Местоположение и размер панели Свойства введите в поля X: 60, Y: 50, Ширина: 600, Высота: 360.
  • Перетащите элемент Прямоугольник. На нём мы разместим элементы, непосредственно имитирующие дежурство СС.
  • На странице Местоположение и размер введите в поля X: 250, Y: 60, Ширина: 170, Высота: 330.
  • Перетащите ещё один элемент Прямоугольник для размещения элементов, имитирующих ремонтное подразделение СС.
  • На странице Местоположение и размер панели Свойства введите в поля X: 440, Y: 60, Ширина: 190, Высота: 330.
  • Установите, используя копирование, на тип агента Degyrstvo последовательно: пять объектов queue, пять объектов delay, один объект queue, один объект delay и соедините их так, как показано на Рис. 5.11. При копировании используйте свойства каждого объекта, приведенные в Табл. 5.4. Кроме них также свойства, указанные в п. 9.
  • Перетащите три элемента text и введите названия в соответствующие поля Текст: согласно Рис. 5.11. (рис 5.11) Сегмент Имитация дежурства
    Объекты сегмента Имитация дежурства и их свойства
    queue
    ИмяВместимостьДействия При выходе
    резерв1KCCP1entity.timeOtkaz=1/timeOtkaz1
    резерв2KCCP2entity.timeOtkaz=1/timeOtkaz2
    резерв3KCCP3entity.timeOtkaz=1/timeOtkaz3
    резерв4KCCP4entity.timeOtkaz=1/timeOtkaz4
    резерв5 KCCP5entity.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)* main.doxDegCC1;
    entity.timeMeanRem=1/timeRem1;
    degCC2DoxDegCC2+=(time()-entity.nach1)*main.doxDegCC2;
    entity.timeMeanRem=1/timeRem2;
    degCC3DoxDegCC3+=(time()-entity.nach1)*main.doxDegCC3;
    entity.timeMeanRem=1/timeRem3;
    degCC4DoxDegCC4+=(time()-entity.nach1)*main.doxDegCC4;
    entity.timeMeanRem=1/timeRem4;
    degCC5DoxDegCC5+=(time()-entity.nach1)*main.doxDegCC5;
    entity.timeMeanRem=1/timeRem5;
  • Кроме свойств, указанных в Табл. 5.4, нужно также:
  • во всех объектах в поле Тип заявки: Agent заменить ComFacility;
  • для всех объектов поставить флажки Включить сбор статистики;
  • для всех объектов delay degCC1 … degCC5 установить:
  • Действие при входе entity.nach1=time();
  • для объекта delay с именем remont также ввести Java коды в следующие свойства:
  • Действие при входе entity.nach=time();
  • Действия При выходе
    if (entity.tipCC == 1) 
       {ZatrRemCC1+=((time()-entity.nach)*stoimRemCC1);
        SumZatrRem+=((time()-entity.nach)*stoimRemCC1);}
    if (entity.tipCC == 2) 
       {ZatrRemCC2+=((time()-entity.nach)*stoimRemCC2);
       SumZatrRem+=((time()-entity.nach)*stoimRemCC2);}   
    if (entity.tipCC == 3) 
       {ZatrRemCC3+=((time()-entity.nach)*stoimRemCC3);
       SumZatrRem+=((time()-entity.nach)*stoimRemCC3);}
    if (entity.tipCC == 4) 
       {ZatrRemCC4+=(time()-entity.nach)*stoimRemCC4;
      SumZatrRem+=((time()-entity.nach)*stoimRemCC4);} 
    if (entity.tipCC == 5) 
       {ZatrRemCC5+=((time()-entity.nach)*stoimRemCC5);
       SumZatrRem+=((time()-entity.nach)*stoimRemCC5);}
  • Сегмент Статистика

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

  • Создайте область просмотра для размещения элементов сегмента Статистика.
  • Перетащите элемент Область просмотра.
  • Перейдите на панель Свойства.
  • В поле Имя: введите статистика.
  • Задайте Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • На странице Местоположение и размер введите в поля X: 0, Y: 1076, Ширина: 960, Высота: 630.
  • Перетащите элемент Прямоугольник.
  • На странице Местоположение и размер введите в поля X: 20, Y: 1116, Ширина: 930, Высота: 580. (рис 5.12) Сегмент Статистика
  • Перетащите элемент text и в поле Текст: введите Результаты моделирования. На странице Местоположение и размер введите в поля X: 360, Y: 1126.
  • Перетащите еще тринадцать элементов text, разместите и введите в соответствующие поля Текст: надписи, как на Рис. 5.12. Например, при размещении надписи Максимальный доход по типам СС укажите в полях X: 100, Y: 1160, при размещении надписи Коэффициенты использования типов средств связи укажите в полях X: 280, Y: 1490, а при размещении надписи Затраты на содержание резервов по типам средств связи в полях X: 280, Y: 1440.
  • Использование элемента Текстовое поле

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

  • Копированием разместите согласно Рис. 5.12 элементы Текстовое поле. При копировании используйте следующие рекомендации. Перетащите первый элемент Текстовое поле. В поле Имя: дайте ему имя editbox1.
  • На странице Внешний вид в полях Шрифт: установите шрифт по своему усмотрению из выпадающего списка или оставьте предложенный, размер шрифта установите 14.
  • На странице Местоположение и размер введите в поля X: 70, Y: 1210, Ширина: 80, Высота: 20.
  • Скопируйте editbox1. Вставьте ещё пять таких элементов. При вставке ориентируйтесь на клетки рабочего поля. Например, в данном случае между элементами по вертикали две клетки.
  • Слева от элементов, используя элемент Текст, разместите номера типов СС 1…5. Шестому элементу введите имя Сумма.
  • Скопируйте только что созданные номера элементов Текстовое поле и сами элементы. Вставьте скопированное четыре раза.
  • Вставьте пятый раз. Разместите шесть элементов Текстовое поле горизонтально как на Рис. 5.12.
  • Перетащите элемент Текстовое поле с именем editbox37. С использованием элемента Текст введите Коэффициент готовности системы связи.
  • Имена элементов Текстовое поле
    12345Сумма
    Максимальный доход по типам СС
    editbox1editbox2editbox3editbox4editbox5editbox6
    Доход от дежурства по типам СС и всего
    editbox7editbox8editbox9editbox10editbox11editbox12
    Стоимость ремонта по типам СС и всего
    editbox13editbox14editbox15editbox16editbox17editbox18
    Суммарная прибыль от использования СС и всего
    editbox19editbox20editbox21editbox22editbox23editbox24
    Коэффициенты прибыли по типам СС и всего
    editbox25editbox26editbox27editbox28editbox29editbox30
    Затраты на содержание резервов по типам СС и всего
    editbox31editbox32editbox33editbox34editbox35editbox36

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

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

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

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

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

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

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

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

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

  • Перетащите первый элемент Диаграмма с накоплением из палитры Статистика и разместите согласно Рис. 5.12.
  • На панели Свойства установите: Масштаб: Фиксированный, Обновлять данные автоматически.
  • На странице Внешний вид установите:
  • Направление: вертикальное
  • Цвет текста, цвет фона и цвет границы установите по своему усмотрению.
  • На странице Местоположение и размер введите в поля X: 40, Y: 1510, Ширина: 230, Высота: 180.
  • На странице Легенда установите Высота: 20, Расположение сверху.
  • На страницы Область диаграммы введите в поля Смещение по оси X: 40, Смещение по оси Y: 10, Ширина: 60, Высота: 140.
  • Щёлкните Добавить элемент данных.
  • В поле Заголовок: введите СС1.
  • В поле Значение: введите Java код
    degCC1.statsUtilization.mean()
  • Скопируйте первый элемент Диаграмма с накоплением.
  • Вставьте четыре элемента 2…5. После вставки в полях Заголовок: вставленных элементов внесите правки для получения имён СС2, СС3, СС4, СС5 соответственно.
  • В поле Значение: вводите Java коды также для элементов 2…5 соответственно:
    degCC2.statsUtilization.mean()
    degCC3.statsUtilization.mean()
    degCC4.statsUtilization.mean()
    degCC5.statsUtilization.mean()
  • На этом построение сегмента Статистика завершено.

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

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

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

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

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

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

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

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

  • Перетащите элемент Событие из палитры Основная на диаграмму размещения элементов Переменная для вывода результатов моделирования (Рис. 5.10). Измените его имя на РезультатыМоделирования. Нажмите Enter.
  • Установите флажок Отображать имя. С помощью выпадающего списка Tип события: выберите По таймауту.
  • Установите Режим: Срабатывает один раз.
  • Время срабатывания (абсолютное) 1000000.
  • В поле Действие введите Java код, который будет выполняться при появлении этого события.
    //Расчет результатов по СС1
    DoxDegCC1=round((DoxDegCC1/КолПрогон)*100);
    DoxDegCC1=DoxDegCC1/100;
    ZatrRemCC1=round((ZatrRemCC1/КолПрогон)*100);
    ZatrRemCC1=ZatrRemCC1/100;
    UbitokCC1=round((1-degCC1.statsUtilization.mean())*main.ubitokCC1*ВремяРабСист*KCC1*100);
    UbitokCC1=UbitokCC1/100;
    PribCC1=round((DoxDegCC1-(ZatrResCC1+ZatrRemCC1+UbitokCC1))*100);
    PribCC1=PribCC1/100;
    koefPribCC1=round((PribCC1/DoxMaxCC1)*1000);
    koefPribCC1=koefPribCC1/1000;
    //Расчет результатов по СС2
    DoxDegCC2=round((DoxDegCC2/КолПрогон)*100);
    DoxDegCC2=DoxDegCC2/100;
    ZatrRemCC2=round((ZatrRemCC2/КолПрогон)*100);
    ZatrRemCC2=ZatrRemCC2/100;
    UbitokCC2=(1-degCC2.statsUtilization.mean())*main.ubitokCC2*ВремяРабСист*KCC2;
    PribCC2=round((DoxDegCC2-(ZatrResCC2+ZatrRemCC2+UbitokCC2))*100);
    PribCC2=PribCC2/100;
    koefPribCC2=round((PribCC2/DoxMaxCC2)*1000);
    koefPribCC2=koefPribCC2/1000;
    //Расчет результатов по СС3
    DoxDegCC3=round((DoxDegCC3/КолПрогон)*100);
    DoxDegCC3=DoxDegCC3/100;
    ZatrRemCC3=round((ZatrRemCC3/КолПрогон)*100);
    ZatrRemCC3=ZatrRemCC3/100;
    UbitokCC3=(1-degCC3.statsUtilization.mean())*
    main().ubitokCC3*ВремяРабСист*KCC3;
    PribCC3=round((DoxDegCC3-(ZatrResCC3+ZatrRemCC3+UbitokCC3))*100);
    PribCC3=PribCC3/100;
    koefPribCC3=round((PribCC3/DoxMaxCC3)*1000);
    koefPribCC3=koefPribCC3/1000;
    //Расчет результатов по СС4
    DoxDegCC4=round((DoxDegCC4/КолПрогон)*100);
    DoxDegCC4=DoxDegCC4/100;
    ZatrRemCC4=round((ZatrRemCC4/КолПрогон)*100);
    ZatrRemCC4=ZatrRemCC4/100;
    UbitokCC4=(1-degCC4.statsUtilization.mean())*
    main.ubitokCC4*ВремяРабСист*KCC4;
    PribCC4=round((DoxDegCC4-(ZatrResCC4+ZatrRemCC4+UbitokCC4))*100);
    PribCC4=PribCC4/100;
    koefPribCC4=round((PribCC4/DoxMaxCC4)*1000);
    koefPribCC4=koefPribCC4/1000;
    //Расчет результатов по СС5
    DoxDegCC5=round((DoxDegCC5/КолПрогон)*100);
    DoxDegCC5=DoxDegCC5/100;
    ZatrRemCC5=round((ZatrRemCC5/КолПрогон)*100);
    ZatrRemCC5=ZatrRemCC5/100;
    UbitokCC5=(1-degCC5.statsUtilization.mean())*
    main.ubitokCC5*ВремяРабСист*KCC5;
    PribCC5=round((DoxDegCC5-(ZatrResCC5+ZatrRemCC5+UbitokCC5))*100);
    PribCC5=PribCC5/100;
    koefPribCC5=round((PribCC5/DoxMaxCC5)*1000);
    koefPribCC5=koefPribCC5/1000;
    //Расчет суммарных результатов
    SumDoxDeg=DoxDegCC1+DoxDegCC2+DoxDegCC3+
    DoxDegCC4+DoxDegCC5;
    SumZatrRem=round((SumZatrRem)*100/КолПрогон);
    SumZatrRem=SumZatrRem/100;
    SumUbitok=UbitokCC1+UbitokCC2+UbitokCC3+
    UbitokCC4+UbitokCC5;
    SumPribil=round((SumDoxDeg-(SumZatrRes+SumZatrRem+SumUbitok))*100);
    SumPribil=SumPribil/100;
    koefPribil=round((SumPribil/SumDoxMax)*1000);
    koefPribil=koefPribil/1000;
    //вывод максимального дохода, дохода от дежурства по типам СС и всего
    editbox1.setText(DoxMaxCC1);
    editbox7.setText(DoxDegCC1);
    editbox2.setText(DoxMaxCC2);
    editbox8.setText(DoxDegCC2);
    editbox3.setText(DoxMaxCC3);
    editbox9.setText(DoxDegCC3);
    editbox4.setText(DoxMaxCC4);
    editbox10.setText(DoxDegCC4);
    editbox5.setText(DoxMaxCC5);
    editbox11.setText(DoxDegCC5);
    editbox6.setText(SumDoxMax);
    editbox12.setText(SumDoxDeg);
    //вывод стоимости ремонта по типам СС и всего
    editbox13.setText(ZatrRemCC1);
    editbox14.setText(ZatrRemCC2);
    editbox15.setText(ZatrRemCC3);
    editbox16.setText(ZatrRemCC4);
    editbox17.setText(ZatrRemCC5);
    editbox18.setText(SumZatrRem);
    //вывод чистой прибыли от использования по типам СС и всего
    editbox19.setText(PribCC1);
    editbox20.setText(PribCC2);
    editbox21.setText(PribCC3);
    editbox22.setText(PribCC4);
    editbox23.setText(PribCC5);
    editbox24.setText(SumPribil);
    //вывод коэфициентов прибыли по типам СС и всего
    editbox25.setText(koefPribCC1);
    editbox26.setText(koefPribCC2);
    editbox27.setText(koefPribCC3);
    editbox28.setText(koefPribCC4);
    editbox29.setText(koefPribCC5);
    editbox30.setText(koefPribil);
    //вывод затрат на содержание резервов по типам СС и всего
    editbox31.setText(ZatrResCC1);
    editbox32.setText(ZatrResCC2);
    editbox33.setText(ZatrResCC3);
    editbox34.setText(ZatrResCC4);
    editbox35.setText(ZatrResCC5);
    editbox36.setText(SumZatrRes);
    //вывод коэфициента готовности системы связи
    КоэфГотСС=(degCC1.statsUtilization.mean()+
    degCC2.statsUtilization.mean()+
    degCC3.statsUtilization.mean()+
    degCC4.statsUtilization.mean()+
    degCC5.statsUtilization.mean())/КолТипСС;
    editbox37.setText(КоэфГотСС);
  • Из кода следует, что по окончании моделирования, которое длится 1 000 000 единиц модельного времени, сработает метод событие, будут рассчитаны и выведены результаты моделирования.

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

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

    editbox1.setText(DoxMaxCC1);

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

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

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

    Элемент презентацииДействие по щелчку
    Постановка на дежурство (Рис. 5.7)
    Имитация дежурства. Текущие результатыdegurstvo.дежурство.navigateTo();
    Статистикаdegurstvo.статистика.navigateTo();
    Исходные данныеисходные_данные_ПД.navigateTo();
    Исходные данные ПД (Рис. 5.3)
    Постановка на дежурствопостановка.navigateTo();
    Имитация дежурства (Рис. 5.11)
    Постановка на дежурствоmain.постановка.navigateTo();
    Статистикастатистика.navigateTo();
    Исходные данныеисходные_данные_Д.navigateTo();
    Исходные данные Д (Рис. 5.9)
    Постановка на дежурствоmain.постановка.navigateTo();
    Имитация дежурствадежурство.navigateTo();
    Статистикастатистика.navigateTo();
    Текущие результаты (Рис. 5.10)
    Постановка на дежурствоmain.постановка.navigateTo();
    Имитация дежурствадежурство.navigateTo();
    Статистикастатистика.navigateTo();
    Статистика (Рис. 5.12)
    Постановка на дежурствоmain.постановка.navigateTo();
    Имитация дежурствадежурство.navigateTo();
    Текущие результатытекущие_результаты.navigateTo();
    Исходные данныеисходные_данные_Д.navigateTo();

    Отладка модели

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

    Запустите модель. Ошибка, о которой мы говорим, появится практически сразу после запуска (Рис. 5.13 и 5.14).

    В Библиотеке моделирования процессов реализован pull-протокол передачи заявок между объектами. Суть заключается в том, что следующий объект "вытягивает" заявку из предыдущего объект, если он может её принять. Это работает для объектов, которые могут держать в себе заявку некоторое время. Для примера рассмотрим следующую диаграмму процесса:

    ...-> split -> selectOutput -> queue -> delay ->...

    В этом случае объекты, которые заявка проходит насквозь (split и selectOutput), просматриваются объектами queue и delay, чтобы оценить возможность прохода заявки.

    (рис 5.13) Сообщение об ошибке

    Если объекты могут принять заявку, они мгновенно "вытягивают" её, вследствии чего код в поле При выходе копии объекта split, который был нами ранее введён (см. Рис. 5.5) не выполняется. Это приводит к некорректной маршрутизация заявок в модели.

    Поясним это. На Рис. 5.14 видно, что 64 заявки, соответствующие типу СС1, проходят не через свой выход true, а через выход false как заявки, соответствующие типу СС5. Это может быть только в том случае, когда в поле entity.tipCC ничего не заносится, то есть при неработающем коде в поле При выходе копии объекта split.

    Для выполнения некоторых действий заявки, когда она проходит через какое-то место диаграммы процесса, в данном случае перед попаданием в selectOutput, но уже после выхода из split, можно использовать объект plain Transfer. В него вы можете вписать код для действий заявки, который был ранее записан в поле При выходе копии объекта split.

  • Удалите связь между выходом копии объекта split и входом объекта selectOutput.
  • В Библиотеке моделирования процессов откройте Местоположение и размер.
  • Перетащите объект plain Transfer и соедините его вход с выходом копии объекта split, а выход - со входом объекта selectOutput. Замените тип заявки на ComFacility.
  • Код из поля При выходе копии объекта split перепишите в поле При подходе ко входу: объекта plain Transfer.
  • Запустите модель. На Рис. 5.15 и Рис. 5.16 показаны результаты моделирования.

    (рис 5.14) Остановка модели по ошибке (рис 5.15) Результаты моделирования (рис 5.16) Результаты моделирования в сегменте Статистика

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • В панели Проект Щёлкните правой кнопкой мыши элемент модели Система_связи и из контекстного меню выберите Coздать/ Эксперимент. В появившемся диалоговом окне из списка Тип эксперимента: выберите Оптимизация (Рис. 5.19). (рис 5.19) Диалоговое окно Новый эксперимент
  • В поле Имя: введите имя эксперимента, например, Система_связи_Оптимизация1. Имя эксперимента должно начинаться с заглавной буквы - правило названия классов в Java.
  • В поле Агент верхнего уровня: выберите Main. Этим действием вы задали корневой (главный) класс эксперимента. Объект этого класса будет играть роль корня иерархического дерева объектов модели, запускаемой оптимизационным экспериментом.
  • Если вы хотите применить к создаваемому эксперименту временные установки другого эксперимента, оставьте установленным флажок Копировать установки модельного времени из: и выберите эксперимент из расположенного справа выпадающего списка. В данном случае оставьте, так как есть: Simulation.
  • Щёлкните кнопку Готово. Появится страница Основные панели Свойства (Рис. 5.20).
  • Установите опцию максимизировать.
  • Целевая функция доступна как root. Поэтому в поле Целевая функция введите root.degurstvo.koefPribil.
  • На странице Случайность установите Фиксированное начальное число (воспроизводимые прогоны).
  • В поле Начальное число введите 5672.
  • Оставьте установленным флажок Количество итераций:. Под итерацией понимается один опыт (одно наблюдение). Количество итераций - это цель стратегического планирования эксперимента - определение количества наблюдений и уровней факторов в них для получения полной и достоверной информации о модели.
  • Число итераций модели при полном факторном эксперименте, то есть число всех возможных сочетаний факторов, определяется по формуле: $$I=k_1\cdot k_2 \cdot ...\cdot k_i\cdot ...\cdot k_m,$$

    где $$k_i$$ - число уровней i-го фактора, $$i=\overline{1,m}$$.

  • В нашей модели нужно менять количество резервных средств связи КССР_1…КССР_5 и количество мастеров-ремонтников Kol_master, то есть всего m=6 факторов. Факторы имеют следующие уровни: $$k_1=3, k_2=k_3=k_4=6, k_5=k_6=5$$. Тогда число итераций $$I=k_1\cdot k_2 \cdot k_3 \cdot k_4 \cdot k_5 \cdot k_6 \cdot = 3 \cdot 6 \cdot 6 \cdot 6 \cdot 5\cdot 5 = 16200.$$ (рис 5.20) Вкладка Основные оптимизационного эксперимента
  • Введите 500 в поле Количество итераций:, так как данная версия AnyLogic ограничена этим количеством итераций.
  • Задайте параметры, значения которых будут меняться. В таблице на Рис. 5.21 перечислены все параметры агента верхнего уровня Main.
  • Чтобы разрешить варьирование параметров оптимизатором, перейдите на строку с параметром КССР_1. Щёлкните мышью в ячейке Тип. Выберите тип параметра, отличный от значения фиксированный. Так как параметр KCCР_1 целочисленный типа int, выберите дискретный.
  • Задайте диапазон допустимых значений параметра. Для чего введите в ячейку Мин. минимальное значение 1, в ячейку Макс. максимальное значение, например, для КССР1, 3. Так как параметр дискретный, в ячейке Шаг укажите величину шага 1.
  • Задайте так же остальные параметры, как на Рис. 5.20.
  • Перейдите на страницу Репликации панели Свойства.
  • Установите флажок Использовать репликации.
  • Число репликаций (прогонов) в одной итерации (наблюдении) может быть фиксированным или переменным. Фиксированное число репликаций, например, при доверительной вероятности $$\alpha =0,95$$, точности $$\varepsilon =0,1$$ и стандартном отклонении $$\sigma =0,1$$ может быть определено по формуле: $$N=t^2_\alpha \frac{\sigma ^2}{\varepsilon ^2}=1,96^2\frac{0,1^2}{0,1^2}=3,8416\approx 4$$

    где $$t_\alpha =1,96$$ - табулированный аргумент функции Лапласа.

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

  • На странице Репликации выберите опцию Фиксированное количество репликаций и в поле Количество репликаций за итерацию: установите рассчитанное число репликаций (прогонов) модели 4.
  • Вернитесь на страницу Основные. Щёлкните кнопку Создать интерфейс. После щелчка удаляется содержимое презентации эксперимента и создаётся интерфейс эксперимента заново (Рис. 5.21) согласно его текущим установкам (набору оптимизационных параметров и их свойствам и т. д.). Поэтому создавать интерфейс нужно только после окончания задания параметров эксперимента. На интерфейсе видны знаки вопросов напротив оптимизационных параметров. (рис 5.21) Интерфейс оптимизационного эксперимента (рис 5.22) Результаты первого оптимизационного эксперимента
  • В меню запуск выполните Система_связи / Система_связи_Оптимизация1.
  • Щёлкните Запустить. Начнёт выполняться эксперимент, в ходе которого можно видеть на графике изменения значения целевой функции. После 200*4=800 прогонов (Рис. 5.22) эксперимент остановится.
  • Результаты оптимизационного эксперимента приведены на Рис. 5.22. Наилучшее значение целевой функции - коэффициент прибыли равен 0,497. Получен он на 28-й итерации при следующих оптимальных значениях параметров: KCCP_1 = KCCP_2 = KCCP_4 = KCCP_5 = Kol_master =1, KCCP_3 = 6.
  • Создайте и проведите второй оптимизационный эксперимент при тех же условиях с целью определения коэффициента готовности системы связи.

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

    Но теперь нас не устраивает то, что оптимизируемые параметры размещены последними в интерфейсе первого оптимизационного эксперимента (Рис. 5.20, 5.21, 5.22). Предположим, что нам не нужны на рисуне все параметры модели, а нужны только оптимизируемые.

    Разместите оптимизируемые параметры в верхних частях страниц свойств соответствующих объектов.

  • На панели свойств агента верхнего уровня Main откройте страницу Предв. просмотр параметров.
  • Выделите параметр КССР_1 и, щёлкая по верхней стрелке, расположенной справа от поля параметра, переместите его в верхнюю часть страницы свойств (Рис. 5.23).
  • Проделайте то же для параметров КССР_2… КССР_5 и Kol_master. У вас должно быть так, как на Рис. 5.24.
  • Закройте панель свойств типа агента Main.
  • Выделите тип агента Degurstvo. На панели свойств откройте страницу Предв. просмотр параметров.
  • Переместите последовательно параметры КССР1…КССР5 и kol_master в верхнюю часть страницы свойств.
  • Перейдите к созданию второго оптимизационного эксперимента.
  • (рис 5.23) Перемещение параметра на странице предварительного просмотра (рис 5.24) Оптимизируемые параметры перемещены в верхнюю часть страницы свойств типа агента Main

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

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

  • В панели Проект Щёлкните правой кнопкой мыши элемент модели Система_связи и из контекстного меню выберите Coздать/Эксперимент. В диалоговом окне из списка Тип эксперимента: выберите Оптимизация.
  • В поле Имя: введите Система_связи_Оптимизация2 имя эксперимента.
  • Установите максимизировать. В поле Целевая функция введите: root.degurstvo.КоэфГотСС
  • На странице Случайность установите Фиксированное начальное число (воспроизводимые прогоны).
  • В поле Начальное число введите 5672.
  • На странице Репликации выберите опцию Фиксированное количество репликаций и в поле Количество репликаций за итерацию: установите число репликаций (прогонов) модели 4.
  • Щёлкните Создать интерфейс.

    Обратите внимание, что оптимизируемые параметры расположены вверхней части. Запустите модель.

    В результате второго эксперимента (Рис. 5.25) наилучшее значение целевой функции - коэффициент готовности системы связи равен 0,813. Получен он на 35-й итерации при следующих оптимальных значениях параметров: KCCP_1 = KCCP_2 =1, KCCP_3 = KCCP_4 = 6, KCCP_5 = 5, Kol_master = 5.

  • Вернитесь к простому эксперименту. Измените значения KCCP_1…KCCP_5 и Kol_master на Исходные_данные_ПД на значения, полученные в первом оптимизационном эксперименте.
  • Запустите простой эксперимент. Вы получите коэффициент прибыли 0,497, т.е. такой же, как и в первом эксперименте. Коэффициент готовности системы связи равен 0,803.
  • Измените значения KCCP_1…KCCP_5 и Kol_master на Исходные_данные_ПД на значения, полученные во втором оптимизационном эксперименте.
  • Запустите простой эксперимент. Вы получите коэффициент готовности системы связи о,813, то есть такой же, как и во втором эксперименте. Коэффициент прибыли равен 0,475, то есть уменьшился за счёт увеличения расходов на содержание большего числа резервных СС.
  • (рис 5.25) Результаты второго оптимизационного эксперимента

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

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

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

  • В панели Проект Щёлкните правой кнопкой мыши элемент модели Система_связи и из контекстного меню выберите Создать эксперимент.
  • В появившемся диалоговом окне из списка Тип эксперимента: выберите Варьирование параметров.
  • В поле Имя введите имя эксперимента, например, Система_связи_Вар_параметров.
  • Щёлкните кнопку Готово. Появится страница Параметры панели Свойства (Рис. 5.26).
  • Обратите внимание, что на странице Параметры по сравнению с оптимизационным экспериментом отсутствуют опции минимизировать, максимизировать, Количество итераций. Последнее определяется AnyLogic в зависимости от диапазонов и шагов изменения параметров. Не используются и репликации, по
  • Задайте диапазон допустимых значений параметров. Перейдите в таблице на Рис. 5.26 на строку с этим параметром. Щёлкните мышью в ячейке Тип. Выберите тип параметра, отличный от значения фиксированный. Параметр КССР_1 типа int, поэтому он может изменяться в диапазоне. Выберите Диапазон. В ячейку Мин введите минимальное значение 1, в ячейку Макс - максимальное значение 3, в ячейке Шаг укажите величину шага 1.
  • Задайте также остальные параметры, как на Рис. 5.26.
  • Вернитесь на страницу Основные и щёлкните кнопку Создать интерфейс.
  • В эксперименте Варьирование параметров в отличие от эксперимента Оптимизация интерфейс создаёт пользователь. Связано это с тем, что выходными результатами данного эксперимента могут быть любые показатели моделируемой системы.
  • Создайте интерфейс, показанный на Рис. 5.27. Автоматически добавлены только параметры эксперимента. Здесь вы видите график, который будет отображать значение коэффициента готовности системы связи для каждой итерации. (рис 5.26) Страница Параметры эксперимента варьирования параметров
  • Перетащите элемент График из палитры Статистика на диаграмму.
  • На странице Местоположение и размер и установите: X: 260, Y: 100, Ширина: 510, Высота: 400, Цвет фона: Нет заливки, Цвет границы: Нет линии.
  • Щёлкните Добавить элемент данных.
  • Установите опцию Набор данных. Заголовок: КоэфГотСС. Набор данных: dataset. Установите Не обновлять данные автоматически.
  • Перейдите на страницу Область диаграммы. Установите: Смещение по Х: 50, Смещение по Y: 30, Ширина: 450, Высота: 330.
  • Из палитры Статистика перетащите элемент Набор данных. Установите опцию Не обновлять автоматически.
  • Из палитры Основная перетащите элемент Переменная. На панели Свойства в поле Имя: введите коэфГотСС. Установите Уровень доступа: public. Тип: double.
  • Щёлкните диаграмму интерфейса. На странице Действия Java панели Свойства и введите коды:
  • в поле Действие после прогона модели:
    коэфГотСС = root.degurstvo.КоэфГотСС;
  • в поле Действие после итерации
    dataset.add(getCurrentIteration(),коэфГотСС);
  • Выполните Система_связи / Система_связи_Вар_параметров.
  • Щёлкните Запустить.
  • Начнет выполняться эксперимент. Во время эксперимента можно видеть на графике изменение значения коэффициента готовности системы связи. Фрагмент результатов выполнения эксперимента Варьирование параметров приведен на Рис. 5.28.
  • Эксперимент был приостановлен после 301 прогона. По графику можно видеть как изменяется коэффициент готовности системы связи. В данный момент времени коэффициент готовности равен 0,801 при КССР_1=КССР_5 = kol_master =1, КССР_2= КССР_3=5, КССР_4=3.
  • На Рис. 5.28 видно, что 301 прогон был выполнен даже в виртуальном режиме за 2029, 3 с.
  • (рис 5.27) Интерфейс эксперимента варьирования параметров (рис 5.28) Фрагмент результатов выполнения эксперимента Варьирование параметров

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

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

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

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

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

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

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

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

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

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

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

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

    Параметры nach1 и nach изменяются при каждом поступлении СС на дежурство и в ремонтное подразделение соответственно. Они используются при расчётах дохода от дежурства и затрат на ремонт неисправного СС. В них заносится время начала дежурства и начала ремонта соответственно.

    Кроме рассмотренных, СС имеют еще следующие параметры (не заносимые в дополнительные поля заявок, имитирующих СС):

  • doxDegCC1 … doxDegCC5 - доход от дежурства одного СС первого … пятого типов соответственно;
  • zatrResCC1 … zatrResCC5 - затраты на содержание резерва одного СС первого … пятого типов соответственно;
  • stoimRem1 … stoimRem5 - стоимость ремонта одного СС первого … пятого типов соответственно.
  • В ходе моделирования, а также по завершении моделирования рассчитываются:

  • PribCC1 … PribCC5, SumPribil - абсолютные величины ожидаемой прибыли по каждому типу СС и в целом;
  • KoefPribCC1 … KoefPribCC5, KoefPribil - относительные коэффициенты ожидаемой прибыли по каждому типу СС и в целом.
  • Рассмотрим вычисление этих показателей на примере PribCC1 и KoefPribCC1.

    Предполагается, что максимальный доход DoxMaxCC1 от дежурства будет в случае, когда все СС первого типа будут постоянно находиться на дежурстве, то есть:

    DoxMaxCC1= KCC1*doxDegCC1*ВремяРабСист

    где ВремяРабСист - время работы моделируемой системы.

    Фактический доход DoxDegCC1 от дежурства СС первого типа составит:

    DoxDegCC1+=(time()-entity.nach1)*
    main.doxDegCC1;

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

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

    UbitokCC1=(1-degCC1.statsUtilization.mean())*
    main.ubitokCC1*ВремяРабСист*KCC1;

    где (1-degCC1.statsUtilization.mean()) - средний коэффициент отсутствия СС первого типа на дежурстве за всё время моделирования.

    Затраты на ремонт неисправных СС и содержание резервных СС первого типа составят соответственно:

    ZatrRemCC1+=(time()-entity.nach)*stoimRemCC1;
    ZatrResCC1= KCCP1*zatrResCC1* ВремяРабСист

    Абсолютная величина ожидаемой прибыли составит:

    PribCC1=DoxDegCC1-(ZatrRemCC1+ZatrRemCC1+UbitokCC1).

    Относительный коэффициент прибыли равен:

    KoefPribCC1=PribCC1/DoxMaxCC1.

    Показатели в целом за систему связи:

    SumPribil=SumDoxDeg-(SumZatrRes+SumZatrRem+SumUbitok),
    KoefPrib=SumPrib/SumDoxMax,

    где SumDoxMax, SumDoxDeg, SumZatrRes, SumZatrRem, SumUbitok - соответствующие доходы и затраты за систему.

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

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

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

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

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

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

    Свойства элементов на Исходные_данные_ПД
    ИмяТипЗначение по умолчаниюОтображать имя
    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

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

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

  • Из палитры Презентация перетащите элемент Область просмотра.
  • На панели Свойства в поле Имя: введите постановка.
  • Задайте Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • Перейдите на страницу Местоположение и размер. Введите в поля X: 0, Y: 0, Ширина: 700, Высота: 350.
  • Перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой. В нём мы разместим объекты сегмента Постановка на дежурство.
  • Перейдите на страницу Местоположение и размер. Введите в поля X: 38, Y: 62, Ширина: 642, Высота: 268.
  • На Область просмотра мы уже перетащили Скругленный прямоугольник. На нём мы будем размещать, как отмечалось ранее, объекты сегмента Постановка на дежурство.
  • Перетащите на него элемент text и на панели Свойства в поле Текст: введите Постановка на дежурство. Поместите этот текст посредине в верхней части элемента Скругленный прямоугольник.
  • Перетащите элемент Прямоугольник на Область просмотра. На странице Местоположение и размер введите в поля X: 50, Y: 100, Ширина: 170, Высота: 140.
  • Перетащите элемент text на Прямоугольник и на панели Свойства в поле Текст: введите Имитация поступления СС.
  • Перетащите объект source на Прямоугольник. Для записи и хранения параметров СС в поля заявок необходимо создать нестандартный тип агента. Создайте тип агента ComFacility.
  • В панели Проекты Щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
  • Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса ComFacility.
  • В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щёлкните Далее.
  • Появится вторая страница Мастера создания Java класса. Добавьте следующие поля Java класса:
    tipCC          int;
    	timeMeanRem    double;
    	nach           double;
    	nach1          double;
    	timeOtkaz  		double;
  • Оставьте выбранными флажки Создать конструктор и Создать метод toString ().
  • Щёлкните кнопку Готово. Закройте редактор кода.
  • Щёлкните правой кнопкой мыши в панели Проект только что созданный Java класс и в контекстном меню выберите Преобразовать Java класс в тип агента.
  • Появится окно c автоматически созданными параметрами нестандартного типа заявок ComFacility. Закройте его.
  • Выделите объект source.
  • На панели Свойства уберите флажок Отображать имя.
  • В полях Тип заявки: и Новая заявка: Agent замените ComFacility. Установите:
  • Прибывают согласно Интенсивности.
  • Интенсивность прибытия 1
  • Ограниченное количество прибытий установите флажок
  • Максимальное количество прибытий 1
  • На странице Действия в поле При выходе: введите Java код:

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

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

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

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

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

    degyrstvo.DoxMaxCC1=
    round((degyrstvo.KCC1*doxDegCC1)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC1=degyrstvo.DoxMaxCC1/100;
  • Добавьте объекты split и sink (Рис. 5.4).
  • Выделите объект split. Установите свойства как на Рис. 5.5. Так как копии не унаследуют свойств от оригинала, поэтому на странице Действия в поле При выходе копии: введите Java код: (рис 5.4) Добавлены объекты split и sink
    NumCC++;
    if (NumCC <= KolCC) 
      entity.tipCC = 5;
    if (NumCC <= (KolCC1+KolCC2+KolCC3+KolCC4))
       entity.tipCC = 4; 
    if (NumCC <= (KolCC1+KolCC2+KolCC3)) 
       entity.tipCC = 3;       
    if (NumCC <= (KolCC1+KolCC2)) 
       entity.tipCC = 2; 
    if (NumCC <= KolCC1) 
     entity.tipCC = 1;
  • Переменная NumCC предназначена для последовательного счёта СС всех типов. Она используется для определения принадлежности СС к соответствующему типу и занесения кода этого типа СС в поле entity.tipCC, например, entity.tipCC = 5, который необходим для нормального функционирования модели, то есть отличия СС по типам.

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

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

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

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

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

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

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

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

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

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

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

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

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

    Замечание. В размещаемых далее элементах и объектах сегмента сбрасывайте флажок Отображается на верхнем уровне.
  • Перетащите элемент Область просмотра. Перейдите на панель Свойства. В поле Имя: введите исходные_данные_Д.
  • Задайте Выравнивать по: Верхн. левому углу.
  • Выберите масштабирование Подогнать под окно.
  • На странице Местоположение и размер введите в поля X: 40, Y: 800, Ширина: 650, Высота: 240.
  • Перетащите элемент Прямоугольник. На нём мы разместим элементы для ввода исходных данных.
  • Оставьте имя, предложенное системой.
  • Перейдите на страницу Местоположение и размер. Введите в поля X: 50, Y: 840, Ширина: 620, Высота: 190.
  • Перетащите элемент text и на панели Свойства в поле Текст: введите Исходные_данные_Д (здесь Д - дежурство).
  • Перетащите, используя копирование, элементы Параметр на элемент с именем Исходные_данные_Д и разместите их так, как показано на Рис. 5.9. При копировании целесообразно указать имя первого элемента и его тип, например, KCC1, int. Значения по умолчанию нужно установить потом для каждого элемента своё.
  • На панели Свойства каждого элемента Параметр установите свойства согласно Табл. 5.3.
  • (рис 5.9) Размещение элементов Параметр для ввода данных
    Свойства элементов Параметр на Исходные_данные_Д
    ИмяТипЗначение по умолчаниюОтображать имя
    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: 40, Y: 430, Ширина: 730, Высота: 350.
  • Перетащите элемент Прямоугольник.
  • Перейдите на панель Свойства. Введите в поля X: 54, Y: 466, Ширина: 710, Высота: 300.
  • Результаты разбиты на две группы: затраты и доходы. Перетащите два элемент text и на панели Свойства в поле Текст: введите Затраты и Доходы соответственно.
  • В Палитре выделите Основная. Перетащите, используя копирование, элементы Переменная. Разместите их, дайте имена, как показано на Рис. 5.10. У всех переменных установите флажки Отображать имя и тип double.
  • Событийная часть сегмента Имитация дежурства

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

  • Перетащите элемент Скруглённый прямоугольник. На нём мы разместим все элементы сегмента Имитация дежурства.
  • На странице Местоположение и размер панели Свойства введите в поля X: 60, Y: 50, Ширина: 600, Высота: 360.
  • Перетащите элемент Прямоугольник. На нём мы разместим элементы, непосредственно имитирующие дежурство СС.
  • На странице Местоположение и размер введите в поля X: 250, Y: 60, Ширина: 170, Высота: 330.
  • Перетащите ещё один элемент Прямоугольник для размещения элементов, имитирующих ремонтное подразделение СС.
  • На странице Местоположение и размер панели Свойства введите в поля X: 440, Y: 60, Ширина: 190, Высота: 330.
  • Установите, используя копирование, на тип агента Degyrstvo последовательно: пять объектов queue, пять объектов delay, один объект queue, один объект delay и соедините их так, как показано на Рис. 5.11. При копировании используйте свойства каждого объекта, приведенные в Табл. 5.4. Кроме них также свойства, указанные в п. 9.
  • Перетащите три элемента text и введите названия в соответствующие поля Текст: согласно Рис. 5.11. (рис 5.11) Сегмент Имитация дежурства
    Объекты сегмента Имитация дежурства и их свойства
    queue
    ИмяВместимостьДействия При выходе
    резерв1KCCP1entity.timeOtkaz=1/timeOtkaz1
    резерв2KCCP2entity.timeOtkaz=1/timeOtkaz2
    резерв3KCCP3entity.timeOtkaz=1/timeOtkaz3
    резерв4KCCP4entity.timeOtkaz=1/timeOtkaz4
    резерв5 KCCP5entity.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)* main.doxDegCC1;
    entity.timeMeanRem=1/timeRem1;
    degCC2DoxDegCC2+=(time()-entity.nach1)*main.doxDegCC2;
    entity.timeMeanRem=1/timeRem2;
    degCC3DoxDegCC3+=(time()-entity.nach1)*main.doxDegCC3;
    entity.timeMeanRem=1/timeRem3;
    degCC4DoxDegCC4+=(time()-entity.nach1)*main.doxDegCC4;
    entity.timeMeanRem=1/timeRem4;
    degCC5DoxDegCC5+=(time()-entity.nach1)*main.doxDegCC5;
    entity.timeMeanRem=1/timeRem5;
  • Кроме свойств, указанных в Табл. 5.4, нужно также:
  • во всех объектах в поле Тип заявки: Agent заменить ComFacility;
  • для всех объектов поставить флажки Включить сбор статистики;
  • для всех объектов delay degCC1 … degCC5 установить:
  • Действие при входе entity.nach1=time();
  • для объекта delay с именем remont также ввести Java коды в следующие свойства:
  • Действие при входе entity.nach=time();
  • Действия При выходе
    if (entity.tipCC == 1) 
       {ZatrRemCC1+=((time()-entity.nach)*stoimRemCC1);
        SumZatrRem+=((time()-entity.nach)*stoimRemCC1);}
    if (entity.tipCC == 2) 
       {ZatrRemCC2+=((time()-entity.nach)*stoimRemCC2);
       SumZatrRem+=((time()-entity.nach)*stoimRemCC2);}   
    if (entity.tipCC == 3) 
       {ZatrRemCC3+=((time()-entity.nach)*stoimRemCC3);
       SumZatrRem+=((time()-entity.nach)*stoimRemCC3);}
    if (entity.tipCC == 4) 
       {ZatrRemCC4+=(time()-entity.nach)*stoimRemCC4;
      SumZatrRem+=((time()-entity.nach)*stoimRemCC4);} 
    if (entity.tipCC == 5) 
       {ZatrRemCC5+=((time()-entity.nach)*stoimRemCC5);
       SumZatrRem+=((time()-entity.nach)*stoimRemCC5);}
  • Сегмент Статистика

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

  • Создайте область просмотра для размещения элементов сегмента Статистика.
  • Перетащите элемент Область просмотра.
  • Перейдите на панель Свойства.
  • В поле Имя: введите статистика.
  • Задайте Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • На странице Местоположение и размер введите в поля X: 0, Y: 1076, Ширина: 960, Высота: 630.
  • Перетащите элемент Прямоугольник.
  • На странице Местоположение и размер введите в поля X: 20, Y: 1116, Ширина: 930, Высота: 580. (рис 5.12) Сегмент Статистика
  • Перетащите элемент text и в поле Текст: введите Результаты моделирования. На странице Местоположение и размер введите в поля X: 360, Y: 1126.
  • Перетащите еще тринадцать элементов text, разместите и введите в соответствующие поля Текст: надписи, как на Рис. 5.12. Например, при размещении надписи Максимальный доход по типам СС укажите в полях X: 100, Y: 1160, при размещении надписи Коэффициенты использования типов средств связи укажите в полях X: 280, Y: 1490, а при размещении надписи Затраты на содержание резервов по типам средств связи в полях X: 280, Y: 1440.
  • Использование элемента Текстовое поле

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

  • Копированием разместите согласно Рис. 5.12 элементы Текстовое поле. При копировании используйте следующие рекомендации. Перетащите первый элемент Текстовое поле. В поле Имя: дайте ему имя editbox1.
  • На странице Внешний вид в полях Шрифт: установите шрифт по своему усмотрению из выпадающего списка или оставьте предложенный, размер шрифта установите 14.
  • На странице Местоположение и размер введите в поля X: 70, Y: 1210, Ширина: 80, Высота: 20.
  • Скопируйте editbox1. Вставьте ещё пять таких элементов. При вставке ориентируйтесь на клетки рабочего поля. Например, в данном случае между элементами по вертикали две клетки.
  • Слева от элементов, используя элемент Текст, разместите номера типов СС 1…5. Шестому элементу введите имя Сумма.
  • Скопируйте только что созданные номера элементов Текстовое поле и сами элементы. Вставьте скопированное четыре раза.
  • Вставьте пятый раз. Разместите шесть элементов Текстовое поле горизонтально как на Рис. 5.12.
  • Перетащите элемент Текстовое поле с именем editbox37. С использованием элемента Текст введите Коэффициент готовности системы связи.
  • Имена элементов Текстовое поле
    12345Сумма
    Максимальный доход по типам СС
    editbox1editbox2editbox3editbox4editbox5editbox6
    Доход от дежурства по типам СС и всего
    editbox7editbox8editbox9editbox10editbox11editbox12
    Стоимость ремонта по типам СС и всего
    editbox13editbox14editbox15editbox16editbox17editbox18
    Суммарная прибыль от использования СС и всего
    editbox19editbox20editbox21editbox22editbox23editbox24
    Коэффициенты прибыли по типам СС и всего
    editbox25editbox26editbox27editbox28editbox29editbox30
    Затраты на содержание резервов по типам СС и всего
    editbox31editbox32editbox33editbox34editbox35editbox36

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

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

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

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

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

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

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

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

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

  • Перетащите первый элемент Диаграмма с накоплением из палитры Статистика и разместите согласно Рис. 5.12.
  • На панели Свойства установите: Масштаб: Фиксированный, Обновлять данные автоматически.
  • На странице Внешний вид установите:
  • Направление: вертикальное
  • Цвет текста, цвет фона и цвет границы установите по своему усмотрению.
  • На странице Местоположение и размер введите в поля X: 40, Y: 1510, Ширина: 230, Высота: 180.
  • На странице Легенда установите Высота: 20, Расположение сверху.
  • На страницы Область диаграммы введите в поля Смещение по оси X: 40, Смещение по оси Y: 10, Ширина: 60, Высота: 140.
  • Щёлкните Добавить элемент данных.
  • В поле Заголовок: введите СС1.
  • В поле Значение: введите Java код
    degCC1.statsUtilization.mean()
  • Скопируйте первый элемент Диаграмма с накоплением.
  • Вставьте четыре элемента 2…5. После вставки в полях Заголовок: вставленных элементов внесите правки для получения имён СС2, СС3, СС4, СС5 соответственно.
  • В поле Значение: вводите Java коды также для элементов 2…5 соответственно:
    degCC2.statsUtilization.mean()
    degCC3.statsUtilization.mean()
    degCC4.statsUtilization.mean()
    degCC5.statsUtilization.mean()
  • На этом построение сегмента Статистика завершено.

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

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

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

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

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

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

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

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

  • Перетащите элемент Событие из палитры Основная на диаграмму размещения элементов Переменная для вывода результатов моделирования (Рис. 5.10). Измените его имя на РезультатыМоделирования. Нажмите Enter.
  • Установите флажок Отображать имя. С помощью выпадающего списка Tип события: выберите По таймауту.
  • Установите Режим: Срабатывает один раз.
  • Время срабатывания (абсолютное) 1000000.
  • В поле Действие введите Java код, который будет выполняться при появлении этого события.
    //Расчет результатов по СС1
    DoxDegCC1=round((DoxDegCC1/КолПрогон)*100);
    DoxDegCC1=DoxDegCC1/100;
    ZatrRemCC1=round((ZatrRemCC1/КолПрогон)*100);
    ZatrRemCC1=ZatrRemCC1/100;
    UbitokCC1=round((1-degCC1.statsUtilization.mean())*main.ubitokCC1*ВремяРабСист*KCC1*100);
    UbitokCC1=UbitokCC1/100;
    PribCC1=round((DoxDegCC1-(ZatrResCC1+ZatrRemCC1+UbitokCC1))*100);
    PribCC1=PribCC1/100;
    koefPribCC1=round((PribCC1/DoxMaxCC1)*1000);
    koefPribCC1=koefPribCC1/1000;
    //Расчет результатов по СС2
    DoxDegCC2=round((DoxDegCC2/КолПрогон)*100);
    DoxDegCC2=DoxDegCC2/100;
    ZatrRemCC2=round((ZatrRemCC2/КолПрогон)*100);
    ZatrRemCC2=ZatrRemCC2/100;
    UbitokCC2=(1-degCC2.statsUtilization.mean())*main.ubitokCC2*ВремяРабСист*KCC2;
    PribCC2=round((DoxDegCC2-(ZatrResCC2+ZatrRemCC2+UbitokCC2))*100);
    PribCC2=PribCC2/100;
    koefPribCC2=round((PribCC2/DoxMaxCC2)*1000);
    koefPribCC2=koefPribCC2/1000;
    //Расчет результатов по СС3
    DoxDegCC3=round((DoxDegCC3/КолПрогон)*100);
    DoxDegCC3=DoxDegCC3/100;
    ZatrRemCC3=round((ZatrRemCC3/КолПрогон)*100);
    ZatrRemCC3=ZatrRemCC3/100;
    UbitokCC3=(1-degCC3.statsUtilization.mean())*
    main().ubitokCC3*ВремяРабСист*KCC3;
    PribCC3=round((DoxDegCC3-(ZatrResCC3+ZatrRemCC3+UbitokCC3))*100);
    PribCC3=PribCC3/100;
    koefPribCC3=round((PribCC3/DoxMaxCC3)*1000);
    koefPribCC3=koefPribCC3/1000;
    //Расчет результатов по СС4
    DoxDegCC4=round((DoxDegCC4/КолПрогон)*100);
    DoxDegCC4=DoxDegCC4/100;
    ZatrRemCC4=round((ZatrRemCC4/КолПрогон)*100);
    ZatrRemCC4=ZatrRemCC4/100;
    UbitokCC4=(1-degCC4.statsUtilization.mean())*
    main.ubitokCC4*ВремяРабСист*KCC4;
    PribCC4=round((DoxDegCC4-(ZatrResCC4+ZatrRemCC4+UbitokCC4))*100);
    PribCC4=PribCC4/100;
    koefPribCC4=round((PribCC4/DoxMaxCC4)*1000);
    koefPribCC4=koefPribCC4/1000;
    //Расчет результатов по СС5
    DoxDegCC5=round((DoxDegCC5/КолПрогон)*100);
    DoxDegCC5=DoxDegCC5/100;
    ZatrRemCC5=round((ZatrRemCC5/КолПрогон)*100);
    ZatrRemCC5=ZatrRemCC5/100;
    UbitokCC5=(1-degCC5.statsUtilization.mean())*
    main.ubitokCC5*ВремяРабСист*KCC5;
    PribCC5=round((DoxDegCC5-(ZatrResCC5+ZatrRemCC5+UbitokCC5))*100);
    PribCC5=PribCC5/100;
    koefPribCC5=round((PribCC5/DoxMaxCC5)*1000);
    koefPribCC5=koefPribCC5/1000;
    //Расчет суммарных результатов
    SumDoxDeg=DoxDegCC1+DoxDegCC2+DoxDegCC3+
    DoxDegCC4+DoxDegCC5;
    SumZatrRem=round((SumZatrRem)*100/КолПрогон);
    SumZatrRem=SumZatrRem/100;
    SumUbitok=UbitokCC1+UbitokCC2+UbitokCC3+
    UbitokCC4+UbitokCC5;
    SumPribil=round((SumDoxDeg-(SumZatrRes+SumZatrRem+SumUbitok))*100);
    SumPribil=SumPribil/100;
    koefPribil=round((SumPribil/SumDoxMax)*1000);
    koefPribil=koefPribil/1000;
    //вывод максимального дохода, дохода от дежурства по типам СС и всего
    editbox1.setText(DoxMaxCC1);
    editbox7.setText(DoxDegCC1);
    editbox2.setText(DoxMaxCC2);
    editbox8.setText(DoxDegCC2);
    editbox3.setText(DoxMaxCC3);
    editbox9.setText(DoxDegCC3);
    editbox4.setText(DoxMaxCC4);
    editbox10.setText(DoxDegCC4);
    editbox5.setText(DoxMaxCC5);
    editbox11.setText(DoxDegCC5);
    editbox6.setText(SumDoxMax);
    editbox12.setText(SumDoxDeg);
    //вывод стоимости ремонта по типам СС и всего
    editbox13.setText(ZatrRemCC1);
    editbox14.setText(ZatrRemCC2);
    editbox15.setText(ZatrRemCC3);
    editbox16.setText(ZatrRemCC4);
    editbox17.setText(ZatrRemCC5);
    editbox18.setText(SumZatrRem);
    //вывод чистой прибыли от использования по типам СС и всего
    editbox19.setText(PribCC1);
    editbox20.setText(PribCC2);
    editbox21.setText(PribCC3);
    editbox22.setText(PribCC4);
    editbox23.setText(PribCC5);
    editbox24.setText(SumPribil);
    //вывод коэфициентов прибыли по типам СС и всего
    editbox25.setText(koefPribCC1);
    editbox26.setText(koefPribCC2);
    editbox27.setText(koefPribCC3);
    editbox28.setText(koefPribCC4);
    editbox29.setText(koefPribCC5);
    editbox30.setText(koefPribil);
    //вывод затрат на содержание резервов по типам СС и всего
    editbox31.setText(ZatrResCC1);
    editbox32.setText(ZatrResCC2);
    editbox33.setText(ZatrResCC3);
    editbox34.setText(ZatrResCC4);
    editbox35.setText(ZatrResCC5);
    editbox36.setText(SumZatrRes);
    //вывод коэфициента готовности системы связи
    КоэфГотСС=(degCC1.statsUtilization.mean()+
    degCC2.statsUtilization.mean()+
    degCC3.statsUtilization.mean()+
    degCC4.statsUtilization.mean()+
    degCC5.statsUtilization.mean())/КолТипСС;
    editbox37.setText(КоэфГотСС);
  • Из кода следует, что по окончании моделирования, которое длится 1 000 000 единиц модельного времени, сработает метод событие, будут рассчитаны и выведены результаты моделирования.

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

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

    editbox1.setText(DoxMaxCC1);

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

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

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

    Элемент презентацииДействие по щелчку
    Постановка на дежурство (Рис. 5.7)
    Имитация дежурства. Текущие результатыdegurstvo.дежурство.navigateTo();
    Статистикаdegurstvo.статистика.navigateTo();
    Исходные данныеисходные_данные_ПД.navigateTo();
    Исходные данные ПД (Рис. 5.3)
    Постановка на дежурствопостановка.navigateTo();
    Имитация дежурства (Рис. 5.11)
    Постановка на дежурствоmain.постановка.navigateTo();
    Статистикастатистика.navigateTo();
    Исходные данныеисходные_данные_Д.navigateTo();
    Исходные данные Д (Рис. 5.9)
    Постановка на дежурствоmain.постановка.navigateTo();
    Имитация дежурствадежурство.navigateTo();
    Статистикастатистика.navigateTo();
    Текущие результаты (Рис. 5.10)
    Постановка на дежурствоmain.постановка.navigateTo();
    Имитация дежурствадежурство.navigateTo();
    Статистикастатистика.navigateTo();
    Статистика (Рис. 5.12)
    Постановка на дежурствоmain.постановка.navigateTo();
    Имитация дежурствадежурство.navigateTo();
    Текущие результатытекущие_результаты.navigateTo();
    Исходные данныеисходные_данные_Д.navigateTo();

    Отладка модели

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

    Запустите модель. Ошибка, о которой мы говорим, появится практически сразу после запуска (Рис. 5.13 и 5.14).

    В Библиотеке моделирования процессов реализован pull-протокол передачи заявок между объектами. Суть заключается в том, что следующий объект "вытягивает" заявку из предыдущего объект, если он может её принять. Это работает для объектов, которые могут держать в себе заявку некоторое время. Для примера рассмотрим следующую диаграмму процесса:

    ...-> split -> selectOutput -> queue -> delay ->...

    В этом случае объекты, которые заявка проходит насквозь (split и selectOutput), просматриваются объектами queue и delay, чтобы оценить возможность прохода заявки.

    (рис 5.13) Сообщение об ошибке

    Если объекты могут принять заявку, они мгновенно "вытягивают" её, вследствии чего код в поле При выходе копии объекта split, который был нами ранее введён (см. Рис. 5.5) не выполняется. Это приводит к некорректной маршрутизация заявок в модели.

    Поясним это. На Рис. 5.14 видно, что 64 заявки, соответствующие типу СС1, проходят не через свой выход true, а через выход false как заявки, соответствующие типу СС5. Это может быть только в том случае, когда в поле entity.tipCC ничего не заносится, то есть при неработающем коде в поле При выходе копии объекта split.

    Для выполнения некоторых действий заявки, когда она проходит через какое-то место диаграммы процесса, в данном случае перед попаданием в selectOutput, но уже после выхода из split, можно использовать объект plain Transfer. В него вы можете вписать код для действий заявки, который был ранее записан в поле При выходе копии объекта split.

  • Удалите связь между выходом копии объекта split и входом объекта selectOutput.
  • В Библиотеке моделирования процессов откройте Местоположение и размер.
  • Перетащите объект plain Transfer и соедините его вход с выходом копии объекта split, а выход - со входом объекта selectOutput. Замените тип заявки на ComFacility.
  • Код из поля При выходе копии объекта split перепишите в поле При подходе ко входу: объекта plain Transfer.
  • Запустите модель. На Рис. 5.15 и Рис. 5.16 показаны результаты моделирования.

    (рис 5.14) Остановка модели по ошибке (рис 5.15) Результаты моделирования (рис 5.16) Результаты моделирования в сегменте Статистика

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • В панели Проект Щёлкните правой кнопкой мыши элемент модели Система_связи и из контекстного меню выберите Coздать/ Эксперимент. В появившемся диалоговом окне из списка Тип эксперимента: выберите Оптимизация (Рис. 5.19). (рис 5.19) Диалоговое окно Новый эксперимент
  • В поле Имя: введите имя эксперимента, например, Система_связи_Оптимизация1. Имя эксперимента должно начинаться с заглавной буквы - правило названия классов в Java.
  • В поле Агент верхнего уровня: выберите Main. Этим действием вы задали корневой (главный) класс эксперимента. Объект этого класса будет играть роль корня иерархического дерева объектов модели, запускаемой оптимизационным экспериментом.
  • Если вы хотите применить к создаваемому эксперименту временные установки другого эксперимента, оставьте установленным флажок Копировать установки модельного времени из: и выберите эксперимент из расположенного справа выпадающего списка. В данном случае оставьте, так как есть: Simulation.
  • Щёлкните кнопку Готово. Появится страница Основные панели Свойства (Рис. 5.20).
  • Установите опцию максимизировать.
  • Целевая функция доступна как root. Поэтому в поле Целевая функция введите root.degurstvo.koefPribil.
  • На странице Случайность установите Фиксированное начальное число (воспроизводимые прогоны).
  • В поле Начальное число введите 5672.
  • Оставьте установленным флажок Количество итераций:. Под итерацией понимается один опыт (одно наблюдение). Количество итераций - это цель стратегического планирования эксперимента - определение количества наблюдений и уровней факторов в них для получения полной и достоверной информации о модели.
  • Число итераций модели при полном факторном эксперименте, то есть число всех возможных сочетаний факторов, определяется по формуле: $$I=k_1\cdot k_2 \cdot ...\cdot k_i\cdot ...\cdot k_m,$$

    где $$k_i$$ - число уровней i-го фактора, $$i=\overline{1,m}$$.

  • В нашей модели нужно менять количество резервных средств связи КССР_1…КССР_5 и количество мастеров-ремонтников Kol_master, то есть всего m=6 факторов. Факторы имеют следующие уровни: $$k_1=3, k_2=k_3=k_4=6, k_5=k_6=5$$. Тогда число итераций $$I=k_1\cdot k_2 \cdot k_3 \cdot k_4 \cdot k_5 \cdot k_6 \cdot = 3 \cdot 6 \cdot 6 \cdot 6 \cdot 5\cdot 5 = 16200.$$ (рис 5.20) Вкладка Основные оптимизационного эксперимента
  • Введите 500 в поле Количество итераций:, так как данная версия AnyLogic ограничена этим количеством итераций.
  • Задайте параметры, значения которых будут меняться. В таблице на Рис. 5.21 перечислены все параметры агента верхнего уровня Main.
  • Чтобы разрешить варьирование параметров оптимизатором, перейдите на строку с параметром КССР_1. Щёлкните мышью в ячейке Тип. Выберите тип параметра, отличный от значения фиксированный. Так как параметр KCCР_1 целочисленный типа int, выберите дискретный.
  • Задайте диапазон допустимых значений параметра. Для чего введите в ячейку Мин. минимальное значение 1, в ячейку Макс. максимальное значение, например, для КССР1, 3. Так как параметр дискретный, в ячейке Шаг укажите величину шага 1.
  • Задайте так же остальные параметры, как на Рис. 5.20.
  • Перейдите на страницу Репликации панели Свойства.
  • Установите флажок Использовать репликации.
  • Число репликаций (прогонов) в одной итерации (наблюдении) может быть фиксированным или переменным. Фиксированное число репликаций, например, при доверительной вероятности $$\alpha =0,95$$, точности $$\varepsilon =0,1$$ и стандартном отклонении $$\sigma =0,1$$ может быть определено по формуле: $$N=t^2_\alpha \frac{\sigma ^2}{\varepsilon ^2}=1,96^2\frac{0,1^2}{0,1^2}=3,8416\approx 4$$

    где $$t_\alpha =1,96$$ - табулированный аргумент функции Лапласа.

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

  • На странице Репликации выберите опцию Фиксированное количество репликаций и в поле Количество репликаций за итерацию: установите рассчитанное число репликаций (прогонов) модели 4.
  • Вернитесь на страницу Основные. Щёлкните кнопку Создать интерфейс. После щелчка удаляется содержимое презентации эксперимента и создаётся интерфейс эксперимента заново (Рис. 5.21) согласно его текущим установкам (набору оптимизационных параметров и их свойствам и т. д.). Поэтому создавать интерфейс нужно только после окончания задания параметров эксперимента. На интерфейсе видны знаки вопросов напротив оптимизационных параметров. (рис 5.21) Интерфейс оптимизационного эксперимента (рис 5.22) Результаты первого оптимизационного эксперимента
  • В меню запуск выполните Система_связи / Система_связи_Оптимизация1.
  • Щёлкните Запустить. Начнёт выполняться эксперимент, в ходе которого можно видеть на графике изменения значения целевой функции. После 200*4=800 прогонов (Рис. 5.22) эксперимент остановится.
  • Результаты оптимизационного эксперимента приведены на Рис. 5.22. Наилучшее значение целевой функции - коэффициент прибыли равен 0,497. Получен он на 28-й итерации при следующих оптимальных значениях параметров: KCCP_1 = KCCP_2 = KCCP_4 = KCCP_5 = Kol_master =1, KCCP_3 = 6.
  • Создайте и проведите второй оптимизационный эксперимент при тех же условиях с целью определения коэффициента готовности системы связи.

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

    Но теперь нас не устраивает то, что оптимизируемые параметры размещены последними в интерфейсе первого оптимизационного эксперимента (Рис. 5.20, 5.21, 5.22). Предположим, что нам не нужны на рисуне все параметры модели, а нужны только оптимизируемые.

    Разместите оптимизируемые параметры в верхних частях страниц свойств соответствующих объектов.

  • На панели свойств агента верхнего уровня Main откройте страницу Предв. просмотр параметров.
  • Выделите параметр КССР_1 и, щёлкая по верхней стрелке, расположенной справа от поля параметра, переместите его в верхнюю часть страницы свойств (Рис. 5.23).
  • Проделайте то же для параметров КССР_2… КССР_5 и Kol_master. У вас должно быть так, как на Рис. 5.24.
  • Закройте панель свойств типа агента Main.
  • Выделите тип агента Degurstvo. На панели свойств откройте страницу Предв. просмотр параметров.
  • Переместите последовательно параметры КССР1…КССР5 и kol_master в верхнюю часть страницы свойств.
  • Перейдите к созданию второго оптимизационного эксперимента.
  • (рис 5.23) Перемещение параметра на странице предварительного просмотра (рис 5.24) Оптимизируемые параметры перемещены в верхнюю часть страницы свойств типа агента Main

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

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

  • В панели Проект Щёлкните правой кнопкой мыши элемент модели Система_связи и из контекстного меню выберите Coздать/Эксперимент. В диалоговом окне из списка Тип эксперимента: выберите Оптимизация.
  • В поле Имя: введите Система_связи_Оптимизация2 имя эксперимента.
  • Установите максимизировать. В поле Целевая функция введите: root.degurstvo.КоэфГотСС
  • На странице Случайность установите Фиксированное начальное число (воспроизводимые прогоны).
  • В поле Начальное число введите 5672.
  • На странице Репликации выберите опцию Фиксированное количество репликаций и в поле Количество репликаций за итерацию: установите число репликаций (прогонов) модели 4.
  • Щёлкните Создать интерфейс.

    Обратите внимание, что оптимизируемые параметры расположены вверхней части. Запустите модель.

    В результате второго эксперимента (Рис. 5.25) наилучшее значение целевой функции - коэффициент готовности системы связи равен 0,813. Получен он на 35-й итерации при следующих оптимальных значениях параметров: KCCP_1 = KCCP_2 =1, KCCP_3 = KCCP_4 = 6, KCCP_5 = 5, Kol_master = 5.

  • Вернитесь к простому эксперименту. Измените значения KCCP_1…KCCP_5 и Kol_master на Исходные_данные_ПД на значения, полученные в первом оптимизационном эксперименте.
  • Запустите простой эксперимент. Вы получите коэффициент прибыли 0,497, т.е. такой же, как и в первом эксперименте. Коэффициент готовности системы связи равен 0,803.
  • Измените значения KCCP_1…KCCP_5 и Kol_master на Исходные_данные_ПД на значения, полученные во втором оптимизационном эксперименте.
  • Запустите простой эксперимент. Вы получите коэффициент готовности системы связи о,813, то есть такой же, как и во втором эксперименте. Коэффициент прибыли равен 0,475, то есть уменьшился за счёт увеличения расходов на содержание большего числа резервных СС.
  • (рис 5.25) Результаты второго оптимизационного эксперимента

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

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

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

  • В панели Проект Щёлкните правой кнопкой мыши элемент модели Система_связи и из контекстного меню выберите Создать эксперимент.
  • В появившемся диалоговом окне из списка Тип эксперимента: выберите Варьирование параметров.
  • В поле Имя введите имя эксперимента, например, Система_связи_Вар_параметров.
  • Щёлкните кнопку Готово. Появится страница Параметры панели Свойства (Рис. 5.26).
  • Обратите внимание, что на странице Параметры по сравнению с оптимизационным экспериментом отсутствуют опции минимизировать, максимизировать, Количество итераций. Последнее определяется AnyLogic в зависимости от диапазонов и шагов изменения параметров. Не используются и репликации, по
  • Задайте диапазон допустимых значений параметров. Перейдите в таблице на Рис. 5.26 на строку с этим параметром. Щёлкните мышью в ячейке Тип. Выберите тип параметра, отличный от значения фиксированный. Параметр КССР_1 типа int, поэтому он может изменяться в диапазоне. Выберите Диапазон. В ячейку Мин введите минимальное значение 1, в ячейку Макс - максимальное значение 3, в ячейке Шаг укажите величину шага 1.
  • Задайте также остальные параметры, как на Рис. 5.26.
  • Вернитесь на страницу Основные и щёлкните кнопку Создать интерфейс.
  • В эксперименте Варьирование параметров в отличие от эксперимента Оптимизация интерфейс создаёт пользователь. Связано это с тем, что выходными результатами данного эксперимента могут быть любые показатели моделируемой системы.
  • Создайте интерфейс, показанный на Рис. 5.27. Автоматически добавлены только параметры эксперимента. Здесь вы видите график, который будет отображать значение коэффициента готовности системы связи для каждой итерации. (рис 5.26) Страница Параметры эксперимента варьирования параметров
  • Перетащите элемент График из палитры Статистика на диаграмму.
  • На странице Местоположение и размер и установите: X: 260, Y: 100, Ширина: 510, Высота: 400, Цвет фона: Нет заливки, Цвет границы: Нет линии.
  • Щёлкните Добавить элемент данных.
  • Установите опцию Набор данных. Заголовок: КоэфГотСС. Набор данных: dataset. Установите Не обновлять данные автоматически.
  • Перейдите на страницу Область диаграммы. Установите: Смещение по Х: 50, Смещение по Y: 30, Ширина: 450, Высота: 330.
  • Из палитры Статистика перетащите элемент Набор данных. Установите опцию Не обновлять автоматически.
  • Из палитры Основная перетащите элемент Переменная. На панели Свойства в поле Имя: введите коэфГотСС. Установите Уровень доступа: public. Тип: double.
  • Щёлкните диаграмму интерфейса. На странице Действия Java панели Свойства и введите коды:
  • в поле Действие после прогона модели:
    коэфГотСС = root.degurstvo.КоэфГотСС;
  • в поле Действие после итерации
    dataset.add(getCurrentIteration(),коэфГотСС);
  • Выполните Система_связи / Система_связи_Вар_параметров.
  • Щёлкните Запустить.
  • Начнет выполняться эксперимент. Во время эксперимента можно видеть на графике изменение значения коэффициента готовности системы связи. Фрагмент результатов выполнения эксперимента Варьирование параметров приведен на Рис. 5.28.
  • Эксперимент был приостановлен после 301 прогона. По графику можно видеть как изменяется коэффициент готовности системы связи. В данный момент времени коэффициент готовности равен 0,801 при КССР_1=КССР_5 = kol_master =1, КССР_2= КССР_3=5, КССР_4=3.
  • На Рис. 5.28 видно, что 301 прогон был выполнен даже в виртуальном режиме за 2029, 3 с.
  • (рис 5.27) Интерфейс эксперимента варьирования параметров (рис 5.28) Фрагмент результатов выполнения эксперимента Варьирование параметров

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

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

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

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

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

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

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

    (рис 5.31) Результаты работы апплета модели 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
    Вернуться к учебному плану