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

Модель предоставления ремонтных услуг

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

Модель в AnyLogic

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

В фирму предоставления ремонтных услуг поступают заявки n типов с вероятностями р1, р2, …, рn соответственно. Интервалы времени Тп между двумя очередными поступлениями одного типа заявок случайные. Каждый любой тип заявки может требовать одного из а1, а2, …, аk видов ремонта с вероятностями рa1, рa2, …, рak соответственно.

В фирме имеются n1, n2, …, nn мастеров для выполнения заявок каждого типа соответственно. Мастера n1 выполняют заявки первого типа. Если их нет и мастера n2, …, nn групп заняты, они выполняют заявки этих типов. При этом поступающие заявки первого типа ожидают их освобождения. Мастера n2 выполняют заявки второго типа. Если их нет и мастера n3, n4, …, nn групп заняты, они выполняют заявки этих типов. При этом поступающие заявки второго типа ожидают их освобождения. Аналогичные обязанности и у мастеров остальных групп. Только мастера nn выполняют заявки одного n-го типа.

Время выполнения заявки n-го типа случайное, не зависит от мастера, а зависит только от вида ремонта: Т11, Т12, Т13 - для СС первого типа, Т21, Т22, Т23 - для СС второго типа, …, Tn1, Tn2, …, Tnn - для СС n-го типа.

Прием и распределение заявок между группами мастеров осуществляется d диспетчерами. Время, затрачиваемое одним диспетчером на одну заявку, Т1, случайное. Диспетчерами не принимаются к ремонту q заявок всех типов.

Исходные данные

$$exponential(Тп) = exponential (30); n = 4;$$ $$p1 = 0.2, p2 = 0.3, p3 = 0.25, p4 = 0.25;$$ $$p11 = 0.5, p12 = 0.25, p13 = 0.25;$$ $$n1 = 2; T11 = 30; T12 = 40; T13 = 50;$$ $$n2 = 1; T21 = 20; T22 = 30; T23 = 40;$$ $$n3 = 1; T31 = 15; T32 = 25; T33 = 35;$$ $$n4 = 1; T41 = 25; T42 = 35; T43 = 45;$$ $$d = 2; normal(T1, To1) = normal(15, 2); q = 2 %.$$

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

Задание на исследование

Разработать имитационную модель предоставления ремонтных услуг. Исследовать зависимость количества выполненных заявок и вероятностей выполнения заявок всех типов от интервала Тп поступления их в ремонт и вероятностей p1, p2, p3, p4.

Результаты моделирования необходимо получить с точностью $$\varepsilon =0,01$$ и доверительной вероятностью $$\alpha =0,95$$.

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

Формализованное описание модели

Уясним задачу на разработку модели, предварительно представив структуру фирмы предоставления ремонтных услуг (Рис. 8.1) как СМО.

(рис 8.1) Фирма предоставления ремонтных услуг как СМО

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

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

  • ввода исходных данных;
  • источника заявок;
  • диспетчеров;
  • мастеров;
  • учёта выполненных ремонтов.
  • Заявки на ремонт должны иметь следующие параметры (поля):

  • типЗ - код типа заявки;
  • видР - вид ремонта;
  • времяР - время выполнения одного вида ремонта;
  • Как уже отмечалось, интервалы между соседними заявками подчинены экспоненциальному закону. Принято, что за время Tp от каждого источника поступает одна заявка. Тогда средний интервал поступления заявок равен Tp/n. Поэтому вместо n объектов имитации источников заявок будем использовать один.

    Код типа заявки определяется в виде чисел 1, 2, 3, 4, так как n=4. Код вида ремонта определяется также числами 1…3 соответственно. Для этого используются следующие исходные данные:

  • p1 … p4 - вероятности поступления заявок 1…4 типов соответственно;
  • p11 … p43 - вероятности поступления заявок 1…4 типов с видами 1…3 ремонтов соответственно.
  • Коды типа заявки и вида ремонта записываются в поля типЗ и видР соответственно.

    По этим кодам определяется среднее время вида ремонта и заносится в поле времяР.

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

  • постЗаявТип1 … постЗаявТип1, постЗаявТип - количество поступивших заявок 1…4 типов и заявок всех типов;
  • выпЗаявТип1 … выпЗаявТип1, выпЗаявТип - количество выполненных заявок 1…4 типов и заявок всех типов;
  • выпРемВида11 … выпРемВида43 - количество выполненных заявок 1…4 типов с видами 1…3 ремонтов соответственно.
  • Поскольку эти данные накапливаются за все прогоны модели, то для получения средних значений они делятся на количество прогонов колПрог. Например, выпЗаявТип1=выпЗаявТип1/ колПрог.

    По этим же статистическим данным рассчитываются:

  • верВыпЗаяв1 … верВыпЗаяв4, верВыпЗаяв - вероятности выполнения заявок 1…4 типов и заявок всех типов.
  • Например, верВыпЗаяв1=выпЗаявТип1/постЗаявТип1.

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

    Элементы для ввода исходных данных разместим на агенте верхнего уровня Main.

  • Выполните команду Файл/Создать/Модель на панели инструментов. Откроется диалоговое окно Новая модель.
  • В поле Имя модели диалогового окна Новая модель введите Рем_услуги. Выберите каталог, в котором будут сохранены файлы модели.
  • Щёлкните Готово.
  • Создайте область просмотра для размещения исходных данных на агенте Main. Из палитры Презентация перетащите элемент Область просмотра. На странице Основные панели Свойства в поле Имя: введите Данные.
  • Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • На странице Местоположение и размер панели Свойства введите в поля X: 0, Y: 650, Ширина: 610, Высота: 590.
  • Из палитры Презентация перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой. В прямоугольнике мы разместим элементы для ввода исходных данных и вывода результатов моделирования.
  • На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 670, Ширина: 590, Высота: 560.
  • Перетащите элемент text и на странице Текст панели Свойства вместо слова text: введите Исходные данные. (рис 8.2) Размещение элементов Параметр и Переменная
  • В Палитре выделите Основная. Перетащите элементы Параметр на элемент Скругленный прямоугольник. Разместите их так, как показано на Рис. 8.2. Используйте копирование.
  • Значения свойств установите согласно Табл. 8.1. Во всех элементах оставьте установленным флажок Отображать имя.
  • Тип элементов с именами колДисп, колМастеров1…колМастеров4 установите int. Тип остальных элементов - double.
  • Имена параметров оставлены практически такими же, как в постановке задачи на разработку имитационной модели. По Рис. 8.2 нельзя определить, например, в Т11 русская буква Т или английская. Поэтому принимайте решение сами. Тем не менее, лучше все имена давать на одном языке.

    Элементы и их свойства
    ПараметрПараметр
    ИмяЗначение по умолчаниюИмяЗначение по умолчанию
    Tp30T115
    n4To12
    T1130p110,5
    T1240p120,75
    T1350p131
    T2120p210,5
    T2230p220,75
    T2340p231
    T3115p310,5
    T3225p320,75
    T3335p331
    T4125p410,5
    T4235p420,75
    T4345p431
    колПрог1000колДисп2
    колМастеров12колМастеров31
    колМастеров21колМастеров41

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

  • На Область просмотра мы уже перетащили Скругленный прямоугольник. На нём мы будем также размещать, как отмечалось ранее, элементы для вывода результатов моделирования.
  • Перетащите на него элемент text и на странице Текст: панели Свойства вместо слова text введите Результаты моделирования. Поместите этот текст посредине в нижней части элемента Скругленный прямоугольник.
  • Из палитры Основная перетащите элементы Переменная. Разместите их и дайте им имена согласно Рис. 8.2. Тип всех переменных double.
  • Построение событийной части модели

    Строить событийную часть модели будем последовательной реализацией средствами AnyLogic выделенных ранее сегментов (см. п. 8.1.4):

  • источники заявок;
  • диспетчеры;
  • мастера;
  • учёт выполненных заявок.
  • Создайте область просмотра для размещения элементов модели на агенте Main. Из палитры Презентация перетащите элемент Область просмотра. Перейдите на страницу Основные панели Свойства. В поле Имя введите МодРемУслуги.
  • Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • На странице Местоположение и размер панели Свойства введите в поля X: 0, Y: 0, Ширина: 1240, Высота: 460.
  • Из палитры Презентация перетащите элемент Прямоугольник. Оставьте имя, предложенное системой. В прямоугольнике мы разместим объект source для имитации поступления заявок.
  • На странице Местоположение и размер панели Свойства введите в поля X: 20, Y: 120, Ширина: 100, Высота: 140.
  • Перетащите элемент text на прямоугольник и на странице Текст панели Свойства введите Источники заявок.
  • Перетащите ещё один элемент Прямоугольник. Оставьте имя, предложенное системой. В этом прямоугольнике мы разместим объекты сегмента Диспетчеры для имитации работы диспетчеров.
  • На странице Местоположение и размер панели Свойства введите в поля X: 130, Y: 30, Ширина: 590, Высота: 410.
  • Перетащите элемент text на прямоугольник и на странице Текст панели Свойства введите Диспетчеры.
  • На Рис. 8.3 показаны объекты двух сегментов: Источники заявок и Диспетчеры. Приступим к их построению.

    Сегмент Источники заявок

  • Из Библиотеки моделирования процессов перетащите объект source на прямоугольник с названием Источники заявок (см. Рис. 8.3). Создайте новый тип агента Заявка.
  • В панели Проект щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс. (рис 8.3) Сегменты Источники заявок и Диспетчеры
  • Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового типа агента Заявка.
  • В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щёлкните Далее.
  • Появится вторая страница Мастера создания Java класса. Добавьте следующие поля Java класса:
    double типЗ;
    	double видР;
    	double времяР;
  • Оставьте выбранными флажки Создать конструктор и Создать метод toString ().
  • Щёлкните кнопку Готово. Выделите правой кнопкой мыши созданный Java класс Заявка и выполните в контекстном меню Преобразовать Java класс в тип агента.
  • Выделите объект source. На странице Основные панели Свойства уберите флажок Отображать имя. В полях Тип заявки: и Новая заявка Agent замените Заявка.

    Установите:

  • Прибывают согласно Времени между прибытиями
  • Время между прибытиями exponential(1/(Tp/n))
  • Действия При выходе:
      entity.типЗ=uniform();
       entity.видР=uniform();
  • Java-кодом в поля entity.типЗ и entity.видР заносятся равномерно распределённые случайные числа. Они нужны далее для розыгрыша кодов типов заявок и кодов видов ремонта.

    Сегмент Диспетчеры

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

    Данный сегмент реализуется шестью объектами selectOutput5, восемью объектами selectOutput, объектами queue, delay и sink (см. Рис. 8.3).

  • Перетащите указанные объекты (или, перетащив один, скопируйте остальные, но перед копированием измените свойства, общие для всех копируемых объектов, например, класс заявки Заявка) из Основной библиотеки на диаграмму класса Main. Соедините их так, как показано на Рис. 8.3.
  • Установите свойства объектов согласно Табл. 8.2.
  • СвойстваЗначение
    ИмятипЗаявки
    ИспользоватьУсловия
    Условие 1entity.типЗ<=p1
    Действия При выходе 1entity.типЗ=1;
    постЗаявТип1++;
    постЗаявТип++;
    Условие 2entity.типЗ<=p2
    Действия При выходе 2entity.типЗ=2;
    постЗаявТип2++;
    постЗаявТип++;
    Условие 3entity.типЗ<=p3
    Действия При выходе 3entity.типЗ=3;
    постЗаявТип3++;
    постЗаявТип++;
    Условие 4entity.типЗ<=p4
    Действия При выходе 4entity.типЗ=4;
    постЗаявТип4++;
    постЗаявТип++;
    Имяoтказ
    Выход true выбираетсяC заданной вероятностью
    Вероятность0,98
    ИмяпоТипамЗаяв
    ИспользоватьУсловия
    Условие 1entity.типЗ==1
    Условие 2entity.типЗ==2
    Условие 3entity.типЗ==3
    Условие 4entity.типЗ==4
    ИмявидРемЗаяв1
    ИспользоватьУсловия
    Условие 1entity.видР<=p11
    Действия При выходе 1entity.видР=1;
    entity.времяР=exponential(1/T11);
    Условие 2entity. видР<=p12
    Действия При выходе 2entity.видР=2;
    entity.времяР=exponential(1/T12);
    Условие 3entity.видР=<p13
    Действия При выходе 3entity.видР=3;
    entity.времяР=exponential(1/T13);
    ИмявидРемЗаяв2
    ИспользоватьУсловия
    Условие 1entity.видР<=p21
    Действия При выходе 1entity.видР=1;
    entity.времяР=exponential(1/T21);
    Условие 2entity. видР<=p22
    Действия При выходе 2entity.видР=2;
    entity.времяР=exponential(1/T22);
    Условие 3entity.видР=<p23
    Действия При выходе 3entity.видР=3;
    entity.времяР=exponential(1/T23);
    ИмявидРемЗаяв3
    ИспользоватьУсловия
    Условие 1entity.видР<=p31
    Действия При выходе 1entity.видР=1;
    entity.времяР=exponential(1/T31);
    Условие 2entity. видР<=p32
    Действия При выходе 2entity.видР=2;
    entity.времяР=exponential(1/T32);
    Условие 3entity.видР=<p33
    Действия При выходе 3entity.видР=3;
    entity.времяР=exponential(1/T33);
    ИмявидРемЗаяв4
    ИспользоватьУсловия
    Условие 1entity.видР<=p41
    Действия При выходе 1entity.видР=1;
    entity.времяР=exponential(1/T41);
    Условие 2entity. видР<=p42
    Действия При выходе 2entity.видР=2;
    entity.времяР=exponential(1/T42);
    Условие 3entity.видР=<p43
    Действия При выходе 3entity.видР=3;
    entity.времяР=exponential(1/T43);
    ИмясвобМастер1_2
    Выход true выбираетсяПри выполнении условия
    Условие(очМастеров1.size()==0)
    (мастера1.size()<колМастеров1)
    (мастера2.size()!=0)
    ИмясвобМастер1_3
    Выход true выбираетсяПри выполнении условия
    Условие(очМастеров1.size()==0)
    (мастера1.size()<колМастеров1)
    (мастера3.size()!=0)
    ИмясвобМастер1_4
    Выход true выбираетсяПри выполнении условия
    Условие(очМастеров1.size()==0)
    (мастера1.size()<колМастеров1)
    (мастера4.size()!=0)
    ИмясвобМастер2_3
    Выход true выбираетсяПри выполнении условия
    Условие(очМастеров2.size()==0)
    (мастера2.size()<колМастеров2)
    (мастера3.size()!=0)
    ИмясвобМастер2_4
    Выход true выбираетсяПри выполнении условия
    Условие(очМастеров2.size()==0)
    (мастера2.size()<колМастеров2)
    (мастера4.size()!=0)
    ИмясвобМастер3_4
    Выход true выбираетсяПри выполнении условия
    Условие(очМастеров3.size()==0)
    (мастера3.size()<колМастеров3)
    (мастера4.size()!=0)
    ИмяочДисп
    Макс. вместимостьУстановить флажок
    ИмяДисп
    ТипОпределённое время
    Время задержкиnormal(To1,T1)
    ВместимостьколДисп
    Действия при выходекоэфИспДисп=дисп.statsUtilization.mean();

    Объектом типЗаявки разыгрывается код типа заявки. Например, в поступившей заявке entity.типЗ=0.723. Проверяется условие 0: entity.типЗ=0.723<=p1=0.5. Условие 0 не выполняется. Тогда проверяется условие 1: entity.типЗ= 0.723 <=p2=0.75. Условие 1 выполняется. Заявка пропускается на выход 1. При этом выполняется код, записанный в поле Действия При выходе 1,

    entity.типЗ=2;
    постЗаявТип2++;
    постЗаявТип++;

    Кроме записи кода 2 в поле entity.типЗ=2, учитывается количество поступивших заявок 2 типа и количество всех типов поступивших заявок. Последнее в дальнейщем используется для определения вероятности выполнения заявок.

    С выходов 0…3 объекта типЗаявки заявки поступают в очДисп (объект queue) с максимальной вместимостью, а затем в объект дисп (delay), имитирующий время работы одного из диспетчеров с одной заявкой.

    Объект отказ (selectOutput) предназначен для розыгрыша отказа в принятии заявки с вероятностью q = 2 %. Заявки, получившие отказ, уничтожаются объектом sink.

    Принятые к выполнению заявки распределяются по типам объектом поТипамЗаяв. С выходов 0…3 этого объекта заявки поступают на объекты видРемЗаяв1…видРемЗаяв4 соответственно. Аналогичным образом как объектом типЗаявки этими объектами разыгрываются для заявок 1…4 типов коды видов 1…3 ремонтов.

    Функции остальных объектов сегмента Диспетчеры рассмотрим в п. 8.1.7.3.

    Сегмент Мастера

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

    Сегмент построен на четырёх объектах queue и четырёх объектах delay.

  • Из палитры Презентация перетащите элемент Прямоугольник. Оставьте имя, предложенное системой.
  • На странице Местоположение и размер панели Свойства введите в поля X: 740, Y: 30, Ширина: 200, Высота: 410.
  • Перетащите элемент text на прямоугольник и на странице Текст панели Свойства в поле вместо text введите Мастера.
  • Перетащите указанные объекты из Библиотеки моделирования процессов на агент Main. Разместите, дайте имена и соедините их так, как показано на Рис. 8.4.
  • У объектов очМастеров1…очМастеров4 укажите максимальную вместимость и тип заявки Заявка.
  • У объектов мастера1…мастера4 установите свойства:
  • Тип заявки: Заявка
  • Тип Определённое время
  • Время задержки entity.времяР
  • Включить сбор статистики Установите флажок
  • Свойство Вместимость у этих же объектов укажите колМастеров1…колМастеров4 соответственно.
  • Действия При выходе установите соответственно:
    коэфИспМаст1=мастера1.statsUtilization.mean();
    коэфИспМаст2=мастера2.statsUtilization.mean();
    коэфИспМаст3=мастера3.statsUtilization.mean();
    коэфИспМаст4=мастера4.statsUtilization.mean();
  • С выходов 1…3 объекта видРемЗаяв1 заявки сразу поступают в объект очМастеров1 (queue).

    С выходов объектов видРемЗаяв2…видРемЗаяв4 заявки поступают на объекты свобМастер1_2, свобМастер1_3, свобМастер1_4 соответственно. В принятых именах первая цифра означает группу мастеров, а вторая - тип заявки. Этими объектами проверяются условия. Например, объектом свобМастер1_3 проверяется условие:

    (очМастеров1.size()==0)
    (мастера1.size()<колМастеров1)(мастера3.size()!=0)

    Пуста ли очередь мастеров 1 группы? И есть ли свободные мастера 1 группы? И заняты ли мастера 3 группы? Если сложное условие, состоящее из трёх простых условий, выполняется, заявка с выхода true объекта свобМастер1_3 на объект мастера1.

    Аналогичные проверки осуществляются в объектах свобМастер1_3, свобМастер1_4.

    Если условие не выполняется, то заявка с выходов false поступает в очередь очМастеров2…очМастеров4 соответственно.

    Объекты свобМастер2_3, свобМастер2_4 проверяют возможности в текущий момент времени выполнения заявок 3 и 4 типов мастерами 2 группы.

    Объект свобМастер3_4 проверяет возможность выполнения заявок 4 типа мастерами 3 группы.

    (рис 8.4) Сегменты Диспетчеры и Мастера

    Сегмент Учёт выполненных заявок

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

    Сегмент построен на пяти объектах selectOutput5 и одном объекте sink.

  • Из палитры Презентация перетащите элемент Прямоугольник. Оставьте имя, предложенное системой.
  • На странице Местоположение и размер панели Свойства введите в поля X: 970, Y: 30, Ширина: 250, Высота: 410.
  • Перетащите элемент text на прямоугольник и на странице Текст панели Свойства в поле вместо text введите Учёт выполненных заявок.
  • Перетащите указанные элементы на прямоугольник. Разместите, соедините и дайте имена согласно Рис. 8.5. (рис 8.5) Сегменты Мастера и Учёт выполненых заявок
  • Свойства элементов установите согласно Табл. 8.3.
    СвойстваЗначение
    ИмяпоТипамЗаяв1
    ИспользоватьУсловия
    Условие 1entity.типЗ==1
    Действия При выходе 1выпЗаявТип1++;
    выпЗаявТип++;
    верВыпЗаяв1=
    выпЗаявТип1/постЗаявТип1;
    Условие 2entity.типЗ==2
    Действия При выходе 2выпЗаявТип2++;
    выпЗаявТип++;
    верВыпЗаяв2=
    выпЗаявТип2/постЗаявТип2;
    Условие 3entity.типЗ==3
    Действия При выходе 3выпЗаявТип3++;
    выпЗаявТип++;
    верВыпЗаяв3=
    выпЗаявТип3/постЗаявТип3;
    Условие 4entity.типЗ==4
    Действия При выходе 4выпЗаявТип4++;
    выпЗаявТип++;
    верВыпЗаяв4=
    выпЗаявТип4/постЗаявТип4;
    ИмявыпРемЗаяв1
    ИспользоватьУсловия
    Условие 1entity.видР==1
    Действия При выходе 1выпРемВида11++;
    Условие 2entity.видР==2
    Действия При выходе 2выпРемВида12++;
    Условие 3entity.видР==3
    Действия При выходе 3выпРемВида13++;
    ИмявыпРемЗаяв2
    ИспользоватьУсловия
    Условие 1entity.видР==1
    Действия При выходе 1выпРемВида21++;
    Условие 2entity.видР==2
    Действия При выходе 2выпРемВида22++;
    Условие 3entity.видР==3
    Действия При выходе 3выпРемВида23++;
    ИмявыпРемЗаяв3
    ИспользоватьУсловия
    Условие 1entity.видР==1
    Действия При выходе 1выпРемВида31++;
    Условие 2entity.видР==2
    Действия При выходе 2выпРемВида32++;
    Условие 3entity.видР==3
    Действия При выходе 3выпРемВида33++;
    ИмявыпРемЗаяв4
    ИспользоватьУсловия
    Условие 1entity.видР==1
    Действия При выходе 1выпРемВида41++;
    Условие 2entity.видР==2
    Действия При выходе 2выпРемВида42++;
    Условие 3entity.видР==3
    Действия При выходе 3выпРемВида43++;
  • Установите значения свойств объекта sink1:
  • Тип заявки: Заявка
  • Действие при входе верВыпЗаяв=выпЗаявТип/постЗаявТип
  • Объект поТипамЗаяв1 осуществляет разделение и учёт выполненных заявок по типам, а также рассчитывает вероятности выполнения заявок каждого типа. В количество поступивших заявок, а, следовательно, и в расчёт вероятностей входят и те заявки, которым отказано в обслуживании.

    Объекты выпРемЗаяв1…выпРемЗаяв4 учитывают количество видов ремонтов, выполненных по заявкам каждого типа.

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

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

    Построение модели закончено. Выделите в окне Проекты Simulation:Main. На странице Основные установите Фиксированное начальное число (воспроизводимые прогоны) и Начальное число: 892. Перейдите на страницу Модельное время, выберите из списка Остановить: В заданное время. Введите Конечное время: 1440000 (модельное время $$\uparrow$$ в 1000).

    (рис 8.6) Результаты моделирования

    Запустите модель. Если вы всё делали согласно нашим рекомендациям, то ошибок не будет.

    По завершении работы модели или в ходе её перейдите на область просмотра Данные_Результаты. Поскольку мы для переключения между областями просмотра своего ничего не делали, используйте приём, предлагаемый AnyLogic.

    Результаты моделирования при исходных данных согласно постановке задачи должны быть такими как на Рис. 8.6. Например, заявок 1 типа выполнено 37,612. Вероятность выполнения составляет 0, 979. Всего выполнено заявок всех типов 188,476 с вероятностью 0,980.

    Модель в GPSS World

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

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

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

  • ввод исходных данных;
  • сегмент имитации поступления заявок;
  • сегмент имитации работы диспетчеров;
  • сегмент имитации работы мастеров 1 группы;
  • сегмент имитации работы мастеров 2 группы;
  • сегмент имитации работы мастеров 3 группы;
  • сегмент имитации работы мастеров 4 группы;
  • сегмент учёта выполненных заявок и ремонтов;
  • сегмент задания времени моделирования и расчёта результатов моделирования.
  • Программа GPSS-модели

    Ниже приводится программа.

    ; Модель предоставления ремонтных услуг
    ; Замена имен МКУ номерами
    Rem1	EQU	1	; 1 группа мастеров
    Rem2	EQU	2	; 2 группа мастеров
    Rem3	EQU	3	; 3 группа мастеров
    Rem4	EQU	4	; 4 группа мастеров
    ; Задание МКУ-групп мастеров
    Dis	STORAGE		3	; Количество диспетчеров
    Rem1	STORAGE		2	; Количество мастеров 1 группы
    Rem2	STORAGE		2	; Количество мастеров 2 группы
    Rem3	STORAGE		2	; Количество мастеров 3 группы
    Rem4	STORAGE		1	; Количество мастеров 4 группы
    ; Задание исходных данных
    VrMod	EQU	1440	; Время моделирования, 1 ед. мод. вр. = 1 мин
    n_	EQU	4	; Количество типов заявок
    T1	EQU	15	; Среднее время работы диспетчера с поступившей заявкой
    To1	EQU	2 ; Среднеквадратическое отклонение времени работы диспетчера с поступившей заявкой
    Tp_	EQU	20	; Средний интервал времени поступления одного типа заявок
    q_	EQU	0.02	; Доля не принятых заявок
    TipSS	FUNCTION	RN892,D4	; Функция распределения поступающих типов заявок
    .2,1/.5,2/.75,3/1,4
    VidRem	FUNCTION	RN892,D3	; Функция распределения видов ремонтов поступающих заявок
    .5,1/.75,2/1,3
    ; Среднее время ремонта по заявкам
    VrRemTip1 FUNCTION	P2,D3	; типа 1
    1,30/2,40/3,50
    VrRemTip2 FUNCTION	P2,D3	; типа 2
    1,20/2,30/3,40
    VrRemTip3 FUNCTION	P2,D3	; типа 3
    1,15/2,25/3,35
    VrRemTip4 FUNCTION	P2,D3	; типа 4
    1,25/2,35/3,40
    ; Сегмент имитации поступления заявок      
    	GENERATE  (Exponential(892,0,(Tp_/n_)))	; Источники заявок
    	ASSIGN	1,FN$TipSS		; Код типа заявки в Р1
    	ASSIGN 2,FN$VidRem		; Код вида ремонта в Р2
    	ASSIGN	5,P1				; Код типа заявки также в Р5
    ; Запись в Р3 среднего времени вида ремонта по заявкам
    Met0		TRANSFER	,(Met0+((P1#2)-1))
    Met1_	ASSIGN	3,FN$VrRemTip1		; типа 1
    		TRANSFER	,Met1
    Met2_	ASSIGN	3,FN$VrRemTip2		; типа 2
    		TRANSFER	,Met1
    Met3_	ASSIGN	3,FN$VrRemTip3		; типа 3
    		TRANSFER	,Met1
    Met4_	ASSIGN	3,FN$VrRemTip4		; типа 4
    ; Сегмент имитации работы диспетчеров
    Met1 	QUEUE	OCH	; Занять очередь к диспетчеру
    		ENTER	DIS	; Занять свободного диспетчера
    		DEPART OCH	; Покинуть очередь к диспетчеру
    		ADVANCE	(Normal(892,T1,To1))	; Имитация работы	 	LEAVE	DIS	; Освободить диспетчера
    		TRANSFER	q_,,Met20	; Отказать q заявкам
    Met2		TEST E	P1,1,Met21	; Мастерам 1 группы? Да,
    Met25	TRANSFER	,Met3	; отправить мастерам 1
    Met21	TEST E	P1,2,Met22	; Мастерам 2 группы
    Met26	GATE SF	P1,Met4	; Мастера 2 заняты? Если да,
    		ASSIGN	4,1	; запись в Р4 признака мастера 1
    		ASSIGN	1,1	; запись в Р1 признака мастера 1
    		GATE SF	P4,Met3			; Свободны ли мастера 1?
    		ASSIGN	1,2	; Заняты, В Р1 признак мастера 2
    		TRANSFER ,Met4		; и отправить мастерам 2
    Met22	TEST E	P1,3,Met23	; Мастерам 3 группы
    Met27	GATE SF	P1,Met5	; Мастера 3 заняты? Если да,
    	ASSIGN		4,1	; запись в Р4 признака мастера 1
    	ASSIGN		1,1	; запись в Р1 признака мастера 1
    	GATE SF		P4,Met3		; Свободны ли мастера 1?
    	ASSIGN		4,2	; запись в Р4 признака мастера 2
    	ASSIGN		1,2	; запись в Р1 признака мастера 2
    	GATE SF		P4,Met4	; свободны ли мастера 3?
    	ASSIGN		1,3	; Заняты, В Р1 признак мастера 3
    	TRANSFER	,Met5		; и отправить мастерам 3
    Met23	TEST E	P1,4	; Мастерам 4 группы
    	GATE SF		P1,Met6	; Мастера 4 заняты? Если да,
    	ASSIGN		4,1	; запись в Р4 признака мастера 1
    	ASSIGN		1,1	; запись в Р1 признака мастера 1
    	GATE SF		P4,Met3	; Свободны ли мастера 1?
    	ASSIGN		4,2	; запись в Р4 признака мастера 2
    	ASSIGN		1,2	; запись в Р1 признака мастера 2
    	GATE SF		P4,Met4	; Свободны ли мастера 2?
    	ASSIGN		4,3	; запись в Р4 признака мастера 3
    	ASSIGN		1,3	; запись в Р1 признака мастера 3
    	GATE SF		P4,Met5	; Свободны ли мастера 3?
    	ASSIGN		1,4	; запись в Р1 признака мастера 4
    	TRANSFER	,Met6	; и отправить мастерам 4
    ; Сегмент имитации работы мастеров 1 группы
    MET3 ENTER	P1	; Занять свободного мастера 1 группы
    	ADVANCE	(Exponential(892,0,P3));Имитация ремонта
    	LEAVE	P1	; Освободить свободного мастера 1 
    	TRANSFER	,Met7	; Отправить для учета
    ; Сегмент имитации работы мастеров 2 группы
    MET4 ENTER	P1	; Занять свободного мастера 2 группы
    	ADVANCE	(Exponential(892,0,P3));Имитация ремонта	LEAVE	P1	; Освободить свободного мастера 
    	TRANSFER	,Met7	; Отправить для учета
    ; Сегмент имитации работы мастеров 3 группы
    MET5 ENTER	P1	; Занять свободного мастера 3
    	ADVANCE	(Exponential(892,0,P3));Имитация ремонта
    	LEAVE	P1	; Освободить свободного мастера 3
    	TRANSFER	,Met7	; Отправить для учета
    ; Сегмент имитации работы мастеров 4 группы
    MET6	ENTER	P1			; Занять свободного мастера 4
    	ADVANCE	(Exponential(892,0,P3));Имитация ремонта
    	LEAVE	P1	; Освободить свободного мастера 4
    ; Сегмент учёта выполненных заявок и ремонтов за все прогоны модели
    MET7		TEST E		P5,1,Met9_	; заявок всего
    MET8		TRANSFER	,(Met8+P2)	; заявок типа 1
    Met81	TERMINATE							; ремонтов вида 11
    Met82	TERMINATE							; ремонтов вида 12
    Met83	TERMINATE							; ремонтов вида 13
    MET9_	TEST E		P5,2,Met10_	
    Met9		TRANSFER	,(Met9+P2)	; заявок типа 2
    Met91	TERMINATE							; ремонтов вида 21
    Met92	TERMINATE							; ремонтов вида 22
    Met93	TERMINATE							; ремонтов вида 23
    MET10_	TEST E		P5,3,Met11
    Met10	TRANSFER	,(Met10+P2)	; заявок типа 3
    Met101	TERMINATE							; ремонтов вида 31
    Met102	TERMINATE							; ремонтов вида 32
    Met103	TERMINATE							; ремонтов вида 33
    MET11	TRANSFER	,(Met11+P2)	; заявок типа 4
    Met111	TERMINATE							; ремонтов вида 41
    Met112	TERMINATE							; ремонтов вида 42
    Met113	TERMINATE							; ремонтов вида 43
    MET20	TERMINATE			; Количество не принятых заявок
    ; Сегмент задания времени моделирования и расчета результатов моделирования
    	GENERATE	VrMod						; Время моделирования
    	TEST L		X$Prog,TG1,Met41	; Если X$Prog<TG1, то
    	SAVEVALUE	Prog,TG1		; запомнить в X$Prog количество прогонов модели
    Met41	TEST E	TG1,1,Met42	; Если TG1=1, то расчет результатов моделирования
    ; Количество выполненных заявок
    	SAVEVALUE	 KolZajav1,(N$Met8/X$Prog)		; типа 1
    	SAVEVALUE	 KolZajav2,(N$Met9/X$Prog)		; типа 2
    	SAVEVALUE	 KolZajav3,(N$Met10/X$Prog)	; типа 3	
    	SAVEVALUE	 KolZajav4,(N$Met11/X$Prog)	; типа 4
    ; Вероятность выполнения заявок
    	SAVEVALUE	 VerZajav1,(N$Met8/N$Met1_)	; типа 1
    	SAVEVALUE	 VerZajav2,(N$Met9/N$Met2_)	; типа 2
    	SAVEVALUE	 VerZajav3,(N$Met10/N$Met3_)	; типа 3
    	SAVEVALUE	 VerZajav4,(N$Met11/N$Met4_)	; типа 4
    	SAVEVALUE	 VerZajav,(N$Met7/N$Met0)	; всех типов
    ; Количество выполненных видов ремонтов
    	SAVEVALUE	11,(N$Met81/X$Prog)	; вида 11
    	SAVEVALUE	12,(N$Met82/X$Prog) 	; вида 12
    	SAVEVALUE	13,(N$Met83/X$Prog) 	; вида 13
    	SAVEVALUE	21,(N$Met91/X$Prog) 	; вида 21
    	SAVEVALUE	22,(N$Met92/X$Prog) 	; вида 22
    	SAVEVALUE	23,(N$Met93/X$Prog) 	; вида 23
    	SAVEVALUE	31,(N$Met101/X$Prog) 	; вида 31
    	SAVEVALUE	32,(N$Met102/X$Prog) 	; вида 32
    	SAVEVALUE	33,(N$Met103/X$Prog) 	; вида 33
    	SAVEVALUE	41,(N$Met111/X$Prog) 	; вида 41
    	SAVEVALUE	42,(N$Met112/X$Prog) 	; вида 42
    	SAVEVALUE	43,(N$Met113/X$Prog) 	; вида 43
    Met42	TERMINATE	1
    	START	1000		; Количество прогонов модели

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

    Для упрощения построения модели МКУ даны имена Rem1 … Rem4, которые заменены номерами 1…4. Но в GPSS-программе порядок записи обратный.

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

    В сегменте имитации поступления заявок разыгрываются тип заявки и вид ремонта, которые записываются в параметры транзакта 1 и 2 соответственно. Код типа заявки записывается также в параметр 5, так как в последующем в сегменте имитации работы диспетчеров код в параметре 1 может изменяться, а в параметре 5 нет, что необходимо для сегмента учёта выполненных заявок и ремонтов.

    В этом же сегменте в параметр 3 транзакта-заявки заносится среднее время выполнения вида ремонта.

    Сегмент имитации работы диспетчеров начинается заданием очереди по аналогии с AnyLogic-моделью, хотя можно было бы обойтись и без этого, так как МКУ имеет свою очередь.

    Принято, что, как и в AnyLogic-модели, решение на распределение заявок в текущий момент времени принимает диспетчер.

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

    GATE SF		P1,Met6	; Мастера 4 заняты? Если да,

    Если мастера 4 группы свободны, то заявка отправляется им, то есть на Met6. Если же они заняты, то проверяется занятость мастеров 1 группы:

    ASSIGN		4,1	; запись в Р4 признака мастера 1
    	ASSIGN		1,1	; запись в Р1 признака мастера 1
    	GATE SF		P4,Met3	; Свободны ли мастера 1?

    Но предварительно в Р4 и Р1 заносятся коды мастеров 1 группы. Если мастера 1 группы свободны, заявка отправляется им.

    Если же мастера 1 группы заняты, то аналогично проверяется занятость мастеров 2 группы. Если они заняты - мастеров 3 группы. И если мастера 3 группы заняты, заявка отправляется мастерам 4 группы:

    ASSIGN		1,4	; запись в Р1 признака мастера 4
    	TRANSFER	,Met6	; и отправить мастерам 4

    Опять же предварительно в параметре 1 транзакта-заявки восстанавливается её первоначальный код.

    Сегменты имитации работы мастеров 1…4 групп построены одинаково. Следует заметить, что можно было бы обойтись следующими строками:

    MET3 ENTER	P1	; Занять свободного мастера 1 группы
    	ADVANCE	(Exponential(892,0,P3));Имитация ремонта
    	LEAVE	P1	; Освободить свободного мастера 1 
    	TRANSFER	,Met7	; Отправить для учета

    Заменив также в сегменте имитации работы диспетчеров Met4, Met5, Met6 на Met3.

    В сегменте учёта выполненных заявок и ремонтов в блоки с метками Met8, Met9, Met10, Met11 входят заявки типов 1…4 соответственно за все прогоны модели, поэтому в сегменте задания времени моделирования и расчёта результатов моделирования для определения среднего числа выполненных заявок производится деление на число выполненных прогонов. Тоже производится и при определении среднего числа выполненных видов ремонтов.

    Количество выполненных заявок и вероятности их выполнения сохраняются в ячейках KolZajav1… KolZajav4 и VerZajav1 …VerZajav4 соответственно.

    Вероятности выполнения видов ремонтов также сохраняются в ячейках, например, видов 1, 2, 3 по заявке типа 1 в ячейках 11, 12 и 13 соответственно.

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

    Всего выполнены три группы экспериментов по три эксперимента в каждой группе. Результаты экспериментов каждой группы представлены в Табл. 8.4…8.6 соответственно.

    В первой группе экспериментов (Табл. 8.4) все исходные данные соответствуют постановке задачи, кроме среднего интервала времени поступления заявок, который уменьшен: Тр = 20 мин.

    Как и в предыдущих экспериментах сравнивать будем результаты моделирования, полученные в GPSS World и в AnyLogic7.

    Например, разница вероятностей выполнения всех заявок составляет $$\Delta_{5} = 0,001$$, коэффициентов использования мастеров всех групп - $$\Delta_{6} = 0,005…0,013$$. Количество выполненных заявок и ремонтов, если считать с точностью до целого, одно и тоже в обеих системах моделирования.

    Во второй группе экспериментов (Табл. 8.5) все исходные данные соответствуют постановке задачи, то есть средний интервал времени поступления заявок Тр = 30 мин.

    Во второй группе разница вероятностей выполнения всех заявок составляет $$\Delta_{5} = 0,001$$, коэффициентов использования мастеров всех групп практически такое же - $$\Delta_{6} = 0,001…0,014$$. Количество выполненных заявок и ремонтов, так же если считать с точностью до целого, одно и тоже.

    Аналогичные выводы можно сделать и по третьей группе экспериментов (Табл. 8.6), в которой были изменены следующие данные в сторону увеличения количества диспетчеров и мастеров второй и третьей групп: Тр = 20 мин, колДисп = 3, колМастеров2 = 2, колМастеров3 = 2.

    Здесь также вероятность выполнения всех заявок отличается незначительно $$\Delta_{5} = 0,001$$, но несколько больше разница между коэффициентами занятости всех групп мастеров-ремонтников: $$\Delta_{5} = 0,015…0,026$$.

    Увеличение количества мастеров-ремонтников второй и третьей групп с одного до двух в каждой группе позволило по сравнению со второй группой экспериментов увеличить количество выполненных заявок в абсолютном выражении с 240,075 до 281,239 и относительном выражении в 1,174 раза (281,239: 240,075 = 1,174). При этом незначительно выросла вероятность выполнения заявок: с 0,977 до 0,980. Увеличилась загрузка мастеров-ремонтников всех групп.

    Показатели фирмы предоставления ремонтных услуг
    ПоказателиGPSS WorldAnyLogic6AnyLogic7
    Среднее время поступления заявок 20 мин
    Выполнено заявок типа 137,87937,42837,707
    $$\Delta_{1} = \left | 37,879-37,707 \right | = 0,172$$
    ремонтов: вида 1119,02118,70518,697
    вида 129,4619,3549,353
    вида 139,3979,3699,257
    Выполнено заявок типа 256,29756,3356,524
    $$\Delta_{2} = \left | 56,297-56,524 \right | = 0,227$$
    ремонтов: вида 2128,19528,37828,517
    вида 2213,913,91414,026
    вида 2314,20214,03813,981
    Выполнено заявок типа 347,07546,94647,322
    $$\Delta_{3} = \left | 47,075-47,322 \right | = 0,247$$
    ремонтов: вида 3123,5723,41423,784
    вида 3211,83111,78811,711
    вида 3311,67411,74411,827
    Выполнено заявок типа 446,85747,48647
    $$\Delta_{4} = \left | 46,857-47,000 \right | = 0,143$$
    ремонтов: вида 4123,44323,55223,527
    вида 4211,81112,0511,886
    вида 4311,60311,88411,587
    Вероятность выполнения всех заявок0,6540,6550,653
    $$\Delta_{5} = \left | 0,654-0,653 \right | = 0,001$$
    Коэффициенты использования: мастеров 10,8320,8380,833
    мастеров 20,8650,8680,866
    мастеров 30,6590,6680,664
    мастеров 40,6370,6620,65
    $$\Delta_{6} = 0,001…0,013$$
    Коэффициент использования диспетчеров1,0001,0001,000
    Показатели фирмы предоставления ремонтных услуг
    ПоказателиGPSS WorldAnyLogic6AnyLogic7
    Среднее время поступления заявок 20 мин
    Выполнено заявок типа 137,4937,46637,612
    $$\Delta_{1} = \left | 37,490-37,612 \right | = 0,192$$
    ремонтов: вида 1118,70518,84618,893
    вида 129,3259,2369,283
    вида 139,469,3849,436
    Выполнено заявок типа 256,59756,3656,279
    $$\Delta_{2} = \left | 56,597-56,279 \right | = 0,318$$
    ремонтов: вида 2128,18627,94128,014
    вида 2214,34114,214,07
    вида 2314,0714,21914,195
    Выполнено заявок типа 346,81147,15146,98
    $$\Delta_{3} = \left | 46,811-46,980 \right | = 0,169$$
    ремонтов: вида 3123,37327,94123,68
    вида 3211,84214,211,662
    вида 3311,59614,21911,638
    Выполнено заявок типа 447,22347,15146,887
    $$\Delta_{4} = \left | 47,223-46,887 \right | = 0,336$$
    ремонтов: вида 4123,64723,31123,445
    вида 4211,84411,79111,801
    вида 4311,73211,80711,641
    Вероятность выполнения всех заявок0,9780,9780,977
    $$\Delta_{5} = \left | 0,978-0,977 \right | = 0,001$$
    Коэффициенты использования: мастеров 10,8280,8360,832
    мастеров 20,8580,8680,864
    мастеров 30,6530,6670,649
    мастеров 40,6320,6570,633
    $$\Delta_{6} = 0,001…0,014$$
    Коэффициент использования диспетчеров1,0000,9990,998
    Показатели фирмы предоставления ремонтных услуг
    ПоказателиGPSS WorldAnyLogic6AnyLogic7
    Среднее время поступления заявок 20 мин
    Выполнено заявок типа 156,59256,22155,849
    $$\Delta_{1} = \left | 56,592-55,849 \right | = 0,743$$
    ремонтов: вида 1128,39828,06928,075
    вида 1214,15814,15213,889
    вида 1314,0361413,885
    Выполнено заявок типа 284,22784,7484,592
    $$\Delta_{2} = \left | 84,227-84,592 \right | = 0,355$$
    ремонтов: вида 2142,08742,51342,411
    вида 2221,19621,28521,026
    вида 2320,97420,94221,155
    Выполнено заявок типа 370,67970,58670,377
    $$\Delta_{3} = \left | 70,679-70,377 \right | = 0,302$$
    ремонтов: вида 3135,25635,07235,147
    вида 3217,67117,65917,662
    вида 3317,75217,85517,568
    Выполнено заявок типа 470,24470,48670,421
    $$\Delta_{4} = \left | 70,244-70,421 \right | = 0,177$$
    ремонтов: вида 4135,11234,97435,344
    вида 4217,75717,69617,491
    вида 4317,37517,81617,586
    Вероятность выполнения всех заявок0,9790,980,98
    $$\Delta_{5} = \left | 0,979-0,979 \right | = 0,001$$
    Коэффициенты использования: мастеров 10,9320,9490,947
    мастеров 20,8740,8930,891
    мастеров 30,6670,6460,641
    мастеров 40,7720,7960,793
    $$\Delta_{6} = \left | 0,932-0,947 \right | = 0,015$$
    Коэффициент использования диспетчеров0,9980,9990,996
    Страницы:

    Модель в AnyLogic

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

    В фирму предоставления ремонтных услуг поступают заявки n типов с вероятностями р1, р2, …, рn соответственно. Интервалы времени Тп между двумя очередными поступлениями одного типа заявок случайные. Каждый любой тип заявки может требовать одного из а1, а2, …, аk видов ремонта с вероятностями рa1, рa2, …, рak соответственно.

    В фирме имеются n1, n2, …, nn мастеров для выполнения заявок каждого типа соответственно. Мастера n1 выполняют заявки первого типа. Если их нет и мастера n2, …, nn групп заняты, они выполняют заявки этих типов. При этом поступающие заявки первого типа ожидают их освобождения. Мастера n2 выполняют заявки второго типа. Если их нет и мастера n3, n4, …, nn групп заняты, они выполняют заявки этих типов. При этом поступающие заявки второго типа ожидают их освобождения. Аналогичные обязанности и у мастеров остальных групп. Только мастера nn выполняют заявки одного n-го типа.

    Время выполнения заявки n-го типа случайное, не зависит от мастера, а зависит только от вида ремонта: Т11, Т12, Т13 - для СС первого типа, Т21, Т22, Т23 - для СС второго типа, …, Tn1, Tn2, …, Tnn - для СС n-го типа.

    Прием и распределение заявок между группами мастеров осуществляется d диспетчерами. Время, затрачиваемое одним диспетчером на одну заявку, Т1, случайное. Диспетчерами не принимаются к ремонту q заявок всех типов.

    Исходные данные

    $$exponential(Тп) = exponential (30); n = 4;$$ $$p1 = 0.2, p2 = 0.3, p3 = 0.25, p4 = 0.25;$$ $$p11 = 0.5, p12 = 0.25, p13 = 0.25;$$ $$n1 = 2; T11 = 30; T12 = 40; T13 = 50;$$ $$n2 = 1; T21 = 20; T22 = 30; T23 = 40;$$ $$n3 = 1; T31 = 15; T32 = 25; T33 = 35;$$ $$n4 = 1; T41 = 25; T42 = 35; T43 = 45;$$ $$d = 2; normal(T1, To1) = normal(15, 2); q = 2 %.$$

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

    Задание на исследование

    Разработать имитационную модель предоставления ремонтных услуг. Исследовать зависимость количества выполненных заявок и вероятностей выполнения заявок всех типов от интервала Тп поступления их в ремонт и вероятностей p1, p2, p3, p4.

    Результаты моделирования необходимо получить с точностью $$\varepsilon =0,01$$ и доверительной вероятностью $$\alpha =0,95$$.

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

    Формализованное описание модели

    Уясним задачу на разработку модели, предварительно представив структуру фирмы предоставления ремонтных услуг (Рис. 8.1) как СМО.

    (рис 8.1) Фирма предоставления ремонтных услуг как СМО

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

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

  • ввода исходных данных;
  • источника заявок;
  • диспетчеров;
  • мастеров;
  • учёта выполненных ремонтов.
  • Заявки на ремонт должны иметь следующие параметры (поля):

  • типЗ - код типа заявки;
  • видР - вид ремонта;
  • времяР - время выполнения одного вида ремонта;
  • Как уже отмечалось, интервалы между соседними заявками подчинены экспоненциальному закону. Принято, что за время Tp от каждого источника поступает одна заявка. Тогда средний интервал поступления заявок равен Tp/n. Поэтому вместо n объектов имитации источников заявок будем использовать один.

    Код типа заявки определяется в виде чисел 1, 2, 3, 4, так как n=4. Код вида ремонта определяется также числами 1…3 соответственно. Для этого используются следующие исходные данные:

  • p1 … p4 - вероятности поступления заявок 1…4 типов соответственно;
  • p11 … p43 - вероятности поступления заявок 1…4 типов с видами 1…3 ремонтов соответственно.
  • Коды типа заявки и вида ремонта записываются в поля типЗ и видР соответственно.

    По этим кодам определяется среднее время вида ремонта и заносится в поле времяР.

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

  • постЗаявТип1 … постЗаявТип1, постЗаявТип - количество поступивших заявок 1…4 типов и заявок всех типов;
  • выпЗаявТип1 … выпЗаявТип1, выпЗаявТип - количество выполненных заявок 1…4 типов и заявок всех типов;
  • выпРемВида11 … выпРемВида43 - количество выполненных заявок 1…4 типов с видами 1…3 ремонтов соответственно.
  • Поскольку эти данные накапливаются за все прогоны модели, то для получения средних значений они делятся на количество прогонов колПрог. Например, выпЗаявТип1=выпЗаявТип1/ колПрог.

    По этим же статистическим данным рассчитываются:

  • верВыпЗаяв1 … верВыпЗаяв4, верВыпЗаяв - вероятности выполнения заявок 1…4 типов и заявок всех типов.
  • Например, верВыпЗаяв1=выпЗаявТип1/постЗаявТип1.

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

    Элементы для ввода исходных данных разместим на агенте верхнего уровня Main.

  • Выполните команду Файл/Создать/Модель на панели инструментов. Откроется диалоговое окно Новая модель.
  • В поле Имя модели диалогового окна Новая модель введите Рем_услуги. Выберите каталог, в котором будут сохранены файлы модели.
  • Щёлкните Готово.
  • Создайте область просмотра для размещения исходных данных на агенте Main. Из палитры Презентация перетащите элемент Область просмотра. На странице Основные панели Свойства в поле Имя: введите Данные.
  • Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • На странице Местоположение и размер панели Свойства введите в поля X: 0, Y: 650, Ширина: 610, Высота: 590.
  • Из палитры Презентация перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой. В прямоугольнике мы разместим элементы для ввода исходных данных и вывода результатов моделирования.
  • На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 670, Ширина: 590, Высота: 560.
  • Перетащите элемент text и на странице Текст панели Свойства вместо слова text: введите Исходные данные. (рис 8.2) Размещение элементов Параметр и Переменная
  • В Палитре выделите Основная. Перетащите элементы Параметр на элемент Скругленный прямоугольник. Разместите их так, как показано на Рис. 8.2. Используйте копирование.
  • Значения свойств установите согласно Табл. 8.1. Во всех элементах оставьте установленным флажок Отображать имя.
  • Тип элементов с именами колДисп, колМастеров1…колМастеров4 установите int. Тип остальных элементов - double.
  • Имена параметров оставлены практически такими же, как в постановке задачи на разработку имитационной модели. По Рис. 8.2 нельзя определить, например, в Т11 русская буква Т или английская. Поэтому принимайте решение сами. Тем не менее, лучше все имена давать на одном языке.

    Элементы и их свойства
    ПараметрПараметр
    ИмяЗначение по умолчаниюИмяЗначение по умолчанию
    Tp30T115
    n4To12
    T1130p110,5
    T1240p120,75
    T1350p131
    T2120p210,5
    T2230p220,75
    T2340p231
    T3115p310,5
    T3225p320,75
    T3335p331
    T4125p410,5
    T4235p420,75
    T4345p431
    колПрог1000колДисп2
    колМастеров12колМастеров31
    колМастеров21колМастеров41

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

  • На Область просмотра мы уже перетащили Скругленный прямоугольник. На нём мы будем также размещать, как отмечалось ранее, элементы для вывода результатов моделирования.
  • Перетащите на него элемент text и на странице Текст: панели Свойства вместо слова text введите Результаты моделирования. Поместите этот текст посредине в нижней части элемента Скругленный прямоугольник.
  • Из палитры Основная перетащите элементы Переменная. Разместите их и дайте им имена согласно Рис. 8.2. Тип всех переменных double.
  • Построение событийной части модели

    Строить событийную часть модели будем последовательной реализацией средствами AnyLogic выделенных ранее сегментов (см. п. 8.1.4):

  • источники заявок;
  • диспетчеры;
  • мастера;
  • учёт выполненных заявок.
  • Создайте область просмотра для размещения элементов модели на агенте Main. Из палитры Презентация перетащите элемент Область просмотра. Перейдите на страницу Основные панели Свойства. В поле Имя введите МодРемУслуги.
  • Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
  • Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  • На странице Местоположение и размер панели Свойства введите в поля X: 0, Y: 0, Ширина: 1240, Высота: 460.
  • Из палитры Презентация перетащите элемент Прямоугольник. Оставьте имя, предложенное системой. В прямоугольнике мы разместим объект source для имитации поступления заявок.
  • На странице Местоположение и размер панели Свойства введите в поля X: 20, Y: 120, Ширина: 100, Высота: 140.
  • Перетащите элемент text на прямоугольник и на странице Текст панели Свойства введите Источники заявок.
  • Перетащите ещё один элемент Прямоугольник. Оставьте имя, предложенное системой. В этом прямоугольнике мы разместим объекты сегмента Диспетчеры для имитации работы диспетчеров.
  • На странице Местоположение и размер панели Свойства введите в поля X: 130, Y: 30, Ширина: 590, Высота: 410.
  • Перетащите элемент text на прямоугольник и на странице Текст панели Свойства введите Диспетчеры.
  • На Рис. 8.3 показаны объекты двух сегментов: Источники заявок и Диспетчеры. Приступим к их построению.

    Сегмент Источники заявок

  • Из Библиотеки моделирования процессов перетащите объект source на прямоугольник с названием Источники заявок (см. Рис. 8.3). Создайте новый тип агента Заявка.
  • В панели Проект щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс. (рис 8.3) Сегменты Источники заявок и Диспетчеры
  • Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового типа агента Заявка.
  • В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щёлкните Далее.
  • Появится вторая страница Мастера создания Java класса. Добавьте следующие поля Java класса:
    double типЗ;
    	double видР;
    	double времяР;
  • Оставьте выбранными флажки Создать конструктор и Создать метод toString ().
  • Щёлкните кнопку Готово. Выделите правой кнопкой мыши созданный Java класс Заявка и выполните в контекстном меню Преобразовать Java класс в тип агента.
  • Выделите объект source. На странице Основные панели Свойства уберите флажок Отображать имя. В полях Тип заявки: и Новая заявка Agent замените Заявка.

    Установите:

  • Прибывают согласно Времени между прибытиями
  • Время между прибытиями exponential(1/(Tp/n))
  • Действия При выходе:
      entity.типЗ=uniform();
       entity.видР=uniform();
  • Java-кодом в поля entity.типЗ и entity.видР заносятся равномерно распределённые случайные числа. Они нужны далее для розыгрыша кодов типов заявок и кодов видов ремонта.

    Сегмент Диспетчеры

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

    Данный сегмент реализуется шестью объектами selectOutput5, восемью объектами selectOutput, объектами queue, delay и sink (см. Рис. 8.3).

  • Перетащите указанные объекты (или, перетащив один, скопируйте остальные, но перед копированием измените свойства, общие для всех копируемых объектов, например, класс заявки Заявка) из Основной библиотеки на диаграмму класса Main. Соедините их так, как показано на Рис. 8.3.
  • Установите свойства объектов согласно Табл. 8.2.
  • СвойстваЗначение
    ИмятипЗаявки
    ИспользоватьУсловия
    Условие 1entity.типЗ<=p1
    Действия При выходе 1entity.типЗ=1;
    постЗаявТип1++;
    постЗаявТип++;
    Условие 2entity.типЗ<=p2
    Действия При выходе 2entity.типЗ=2;
    постЗаявТип2++;
    постЗаявТип++;
    Условие 3entity.типЗ<=p3
    Действия При выходе 3entity.типЗ=3;
    постЗаявТип3++;
    постЗаявТип++;
    Условие 4entity.типЗ<=p4
    Действия При выходе 4entity.типЗ=4;
    постЗаявТип4++;
    постЗаявТип++;
    Имяoтказ
    Выход true выбираетсяC заданной вероятностью
    Вероятность0,98
    ИмяпоТипамЗаяв
    ИспользоватьУсловия
    Условие 1entity.типЗ==1
    Условие 2entity.типЗ==2
    Условие 3entity.типЗ==3
    Условие 4entity.типЗ==4
    ИмявидРемЗаяв1
    ИспользоватьУсловия
    Условие 1entity.видР<=p11
    Действия При выходе 1entity.видР=1;
    entity.времяР=exponential(1/T11);
    Условие 2entity. видР<=p12
    Действия При выходе 2entity.видР=2;
    entity.времяР=exponential(1/T12);
    Условие 3entity.видР=<p13
    Действия При выходе 3entity.видР=3;
    entity.времяР=exponential(1/T13);
    ИмявидРемЗаяв2
    ИспользоватьУсловия
    Условие 1entity.видР<=p21
    Действия При выходе 1entity.видР=1;
    entity.времяР=exponential(1/T21);
    Условие 2entity. видР<=p22
    Действия При выходе 2entity.видР=2;
    entity.времяР=exponential(1/T22);
    Условие 3entity.видР=<p23
    Действия При выходе 3entity.видР=3;
    entity.времяР=exponential(1/T23);
    ИмявидРемЗаяв3
    ИспользоватьУсловия
    Условие 1entity.видР<=p31
    Действия При выходе 1entity.видР=1;
    entity.времяР=exponential(1/T31);
    Условие 2entity. видР<=p32
    Действия При выходе 2entity.видР=2;
    entity.времяР=exponential(1/T32);
    Условие 3entity.видР=<p33
    Действия При выходе 3entity.видР=3;
    entity.времяР=exponential(1/T33);
    ИмявидРемЗаяв4
    ИспользоватьУсловия
    Условие 1entity.видР<=p41
    Действия При выходе 1entity.видР=1;
    entity.времяР=exponential(1/T41);
    Условие 2entity. видР<=p42
    Действия При выходе 2entity.видР=2;
    entity.времяР=exponential(1/T42);
    Условие 3entity.видР=<p43
    Действия При выходе 3entity.видР=3;
    entity.времяР=exponential(1/T43);
    ИмясвобМастер1_2
    Выход true выбираетсяПри выполнении условия
    Условие(очМастеров1.size()==0)
    (мастера1.size()<колМастеров1)
    (мастера2.size()!=0)
    ИмясвобМастер1_3
    Выход true выбираетсяПри выполнении условия
    Условие(очМастеров1.size()==0)
    (мастера1.size()<колМастеров1)
    (мастера3.size()!=0)
    ИмясвобМастер1_4
    Выход true выбираетсяПри выполнении условия
    Условие(очМастеров1.size()==0)
    (мастера1.size()<колМастеров1)
    (мастера4.size()!=0)
    ИмясвобМастер2_3
    Выход true выбираетсяПри выполнении условия
    Условие(очМастеров2.size()==0)
    (мастера2.size()<колМастеров2)
    (мастера3.size()!=0)
    ИмясвобМастер2_4
    Выход true выбираетсяПри выполнении условия
    Условие(очМастеров2.size()==0)
    (мастера2.size()<колМастеров2)
    (мастера4.size()!=0)
    ИмясвобМастер3_4
    Выход true выбираетсяПри выполнении условия
    Условие(очМастеров3.size()==0)
    (мастера3.size()<колМастеров3)
    (мастера4.size()!=0)
    ИмяочДисп
    Макс. вместимостьУстановить флажок
    ИмяДисп
    ТипОпределённое время
    Время задержкиnormal(To1,T1)
    ВместимостьколДисп
    Действия при выходекоэфИспДисп=дисп.statsUtilization.mean();

    Объектом типЗаявки разыгрывается код типа заявки. Например, в поступившей заявке entity.типЗ=0.723. Проверяется условие 0: entity.типЗ=0.723<=p1=0.5. Условие 0 не выполняется. Тогда проверяется условие 1: entity.типЗ= 0.723 <=p2=0.75. Условие 1 выполняется. Заявка пропускается на выход 1. При этом выполняется код, записанный в поле Действия При выходе 1,

    entity.типЗ=2;
    постЗаявТип2++;
    постЗаявТип++;

    Кроме записи кода 2 в поле entity.типЗ=2, учитывается количество поступивших заявок 2 типа и количество всех типов поступивших заявок. Последнее в дальнейщем используется для определения вероятности выполнения заявок.

    С выходов 0…3 объекта типЗаявки заявки поступают в очДисп (объект queue) с максимальной вместимостью, а затем в объект дисп (delay), имитирующий время работы одного из диспетчеров с одной заявкой.

    Объект отказ (selectOutput) предназначен для розыгрыша отказа в принятии заявки с вероятностью q = 2 %. Заявки, получившие отказ, уничтожаются объектом sink.

    Принятые к выполнению заявки распределяются по типам объектом поТипамЗаяв. С выходов 0…3 этого объекта заявки поступают на объекты видРемЗаяв1…видРемЗаяв4 соответственно. Аналогичным образом как объектом типЗаявки этими объектами разыгрываются для заявок 1…4 типов коды видов 1…3 ремонтов.

    Функции остальных объектов сегмента Диспетчеры рассмотрим в п. 8.1.7.3.

    Сегмент Мастера

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

    Сегмент построен на четырёх объектах queue и четырёх объектах delay.

  • Из палитры Презентация перетащите элемент Прямоугольник. Оставьте имя, предложенное системой.
  • На странице Местоположение и размер панели Свойства введите в поля X: 740, Y: 30, Ширина: 200, Высота: 410.
  • Перетащите элемент text на прямоугольник и на странице Текст панели Свойства в поле вместо text введите Мастера.
  • Перетащите указанные объекты из Библиотеки моделирования процессов на агент Main. Разместите, дайте имена и соедините их так, как показано на Рис. 8.4.
  • У объектов очМастеров1…очМастеров4 укажите максимальную вместимость и тип заявки Заявка.
  • У объектов мастера1…мастера4 установите свойства:
  • Тип заявки: Заявка
  • Тип Определённое время
  • Время задержки entity.времяР
  • Включить сбор статистики Установите флажок
  • Свойство Вместимость у этих же объектов укажите колМастеров1…колМастеров4 соответственно.
  • Действия При выходе установите соответственно:
    коэфИспМаст1=мастера1.statsUtilization.mean();
    коэфИспМаст2=мастера2.statsUtilization.mean();
    коэфИспМаст3=мастера3.statsUtilization.mean();
    коэфИспМаст4=мастера4.statsUtilization.mean();
  • С выходов 1…3 объекта видРемЗаяв1 заявки сразу поступают в объект очМастеров1 (queue).

    С выходов объектов видРемЗаяв2…видРемЗаяв4 заявки поступают на объекты свобМастер1_2, свобМастер1_3, свобМастер1_4 соответственно. В принятых именах первая цифра означает группу мастеров, а вторая - тип заявки. Этими объектами проверяются условия. Например, объектом свобМастер1_3 проверяется условие:

    (очМастеров1.size()==0)
    (мастера1.size()<колМастеров1)(мастера3.size()!=0)

    Пуста ли очередь мастеров 1 группы? И есть ли свободные мастера 1 группы? И заняты ли мастера 3 группы? Если сложное условие, состоящее из трёх простых условий, выполняется, заявка с выхода true объекта свобМастер1_3 на объект мастера1.

    Аналогичные проверки осуществляются в объектах свобМастер1_3, свобМастер1_4.

    Если условие не выполняется, то заявка с выходов false поступает в очередь очМастеров2…очМастеров4 соответственно.

    Объекты свобМастер2_3, свобМастер2_4 проверяют возможности в текущий момент времени выполнения заявок 3 и 4 типов мастерами 2 группы.

    Объект свобМастер3_4 проверяет возможность выполнения заявок 4 типа мастерами 3 группы.

    (рис 8.4) Сегменты Диспетчеры и Мастера

    Сегмент Учёт выполненных заявок

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

    Сегмент построен на пяти объектах selectOutput5 и одном объекте sink.

  • Из палитры Презентация перетащите элемент Прямоугольник. Оставьте имя, предложенное системой.
  • На странице Местоположение и размер панели Свойства введите в поля X: 970, Y: 30, Ширина: 250, Высота: 410.
  • Перетащите элемент text на прямоугольник и на странице Текст панели Свойства в поле вместо text введите Учёт выполненных заявок.
  • Перетащите указанные элементы на прямоугольник. Разместите, соедините и дайте имена согласно Рис. 8.5. (рис 8.5) Сегменты Мастера и Учёт выполненых заявок
  • Свойства элементов установите согласно Табл. 8.3.
    СвойстваЗначение
    ИмяпоТипамЗаяв1
    ИспользоватьУсловия
    Условие 1entity.типЗ==1
    Действия При выходе 1выпЗаявТип1++;
    выпЗаявТип++;
    верВыпЗаяв1=
    выпЗаявТип1/постЗаявТип1;
    Условие 2entity.типЗ==2
    Действия При выходе 2выпЗаявТип2++;
    выпЗаявТип++;
    верВыпЗаяв2=
    выпЗаявТип2/постЗаявТип2;
    Условие 3entity.типЗ==3
    Действия При выходе 3выпЗаявТип3++;
    выпЗаявТип++;
    верВыпЗаяв3=
    выпЗаявТип3/постЗаявТип3;
    Условие 4entity.типЗ==4
    Действия При выходе 4выпЗаявТип4++;
    выпЗаявТип++;
    верВыпЗаяв4=
    выпЗаявТип4/постЗаявТип4;
    ИмявыпРемЗаяв1
    ИспользоватьУсловия
    Условие 1entity.видР==1
    Действия При выходе 1выпРемВида11++;
    Условие 2entity.видР==2
    Действия При выходе 2выпРемВида12++;
    Условие 3entity.видР==3
    Действия При выходе 3выпРемВида13++;
    ИмявыпРемЗаяв2
    ИспользоватьУсловия
    Условие 1entity.видР==1
    Действия При выходе 1выпРемВида21++;
    Условие 2entity.видР==2
    Действия При выходе 2выпРемВида22++;
    Условие 3entity.видР==3
    Действия При выходе 3выпРемВида23++;
    ИмявыпРемЗаяв3
    ИспользоватьУсловия
    Условие 1entity.видР==1
    Действия При выходе 1выпРемВида31++;
    Условие 2entity.видР==2
    Действия При выходе 2выпРемВида32++;
    Условие 3entity.видР==3
    Действия При выходе 3выпРемВида33++;
    ИмявыпРемЗаяв4
    ИспользоватьУсловия
    Условие 1entity.видР==1
    Действия При выходе 1выпРемВида41++;
    Условие 2entity.видР==2
    Действия При выходе 2выпРемВида42++;
    Условие 3entity.видР==3
    Действия При выходе 3выпРемВида43++;
  • Установите значения свойств объекта sink1:
  • Тип заявки: Заявка
  • Действие при входе верВыпЗаяв=выпЗаявТип/постЗаявТип
  • Объект поТипамЗаяв1 осуществляет разделение и учёт выполненных заявок по типам, а также рассчитывает вероятности выполнения заявок каждого типа. В количество поступивших заявок, а, следовательно, и в расчёт вероятностей входят и те заявки, которым отказано в обслуживании.

    Объекты выпРемЗаяв1…выпРемЗаяв4 учитывают количество видов ремонтов, выполненных по заявкам каждого типа.

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

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

    Построение модели закончено. Выделите в окне Проекты Simulation:Main. На странице Основные установите Фиксированное начальное число (воспроизводимые прогоны) и Начальное число: 892. Перейдите на страницу Модельное время, выберите из списка Остановить: В заданное время. Введите Конечное время: 1440000 (модельное время $$\uparrow$$ в 1000).

    (рис 8.6) Результаты моделирования

    Запустите модель. Если вы всё делали согласно нашим рекомендациям, то ошибок не будет.

    По завершении работы модели или в ходе её перейдите на область просмотра Данные_Результаты. Поскольку мы для переключения между областями просмотра своего ничего не делали, используйте приём, предлагаемый AnyLogic.

    Результаты моделирования при исходных данных согласно постановке задачи должны быть такими как на Рис. 8.6. Например, заявок 1 типа выполнено 37,612. Вероятность выполнения составляет 0, 979. Всего выполнено заявок всех типов 188,476 с вероятностью 0,980.

    Модель в GPSS World

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

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

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

  • ввод исходных данных;
  • сегмент имитации поступления заявок;
  • сегмент имитации работы диспетчеров;
  • сегмент имитации работы мастеров 1 группы;
  • сегмент имитации работы мастеров 2 группы;
  • сегмент имитации работы мастеров 3 группы;
  • сегмент имитации работы мастеров 4 группы;
  • сегмент учёта выполненных заявок и ремонтов;
  • сегмент задания времени моделирования и расчёта результатов моделирования.
  • Программа GPSS-модели

    Ниже приводится программа.

    ; Модель предоставления ремонтных услуг
    ; Замена имен МКУ номерами
    Rem1	EQU	1	; 1 группа мастеров
    Rem2	EQU	2	; 2 группа мастеров
    Rem3	EQU	3	; 3 группа мастеров
    Rem4	EQU	4	; 4 группа мастеров
    ; Задание МКУ-групп мастеров
    Dis	STORAGE		3	; Количество диспетчеров
    Rem1	STORAGE		2	; Количество мастеров 1 группы
    Rem2	STORAGE		2	; Количество мастеров 2 группы
    Rem3	STORAGE		2	; Количество мастеров 3 группы
    Rem4	STORAGE		1	; Количество мастеров 4 группы
    ; Задание исходных данных
    VrMod	EQU	1440	; Время моделирования, 1 ед. мод. вр. = 1 мин
    n_	EQU	4	; Количество типов заявок
    T1	EQU	15	; Среднее время работы диспетчера с поступившей заявкой
    To1	EQU	2 ; Среднеквадратическое отклонение времени работы диспетчера с поступившей заявкой
    Tp_	EQU	20	; Средний интервал времени поступления одного типа заявок
    q_	EQU	0.02	; Доля не принятых заявок
    TipSS	FUNCTION	RN892,D4	; Функция распределения поступающих типов заявок
    .2,1/.5,2/.75,3/1,4
    VidRem	FUNCTION	RN892,D3	; Функция распределения видов ремонтов поступающих заявок
    .5,1/.75,2/1,3
    ; Среднее время ремонта по заявкам
    VrRemTip1 FUNCTION	P2,D3	; типа 1
    1,30/2,40/3,50
    VrRemTip2 FUNCTION	P2,D3	; типа 2
    1,20/2,30/3,40
    VrRemTip3 FUNCTION	P2,D3	; типа 3
    1,15/2,25/3,35
    VrRemTip4 FUNCTION	P2,D3	; типа 4
    1,25/2,35/3,40
    ; Сегмент имитации поступления заявок      
    	GENERATE  (Exponential(892,0,(Tp_/n_)))	; Источники заявок
    	ASSIGN	1,FN$TipSS		; Код типа заявки в Р1
    	ASSIGN 2,FN$VidRem		; Код вида ремонта в Р2
    	ASSIGN	5,P1				; Код типа заявки также в Р5
    ; Запись в Р3 среднего времени вида ремонта по заявкам
    Met0		TRANSFER	,(Met0+((P1#2)-1))
    Met1_	ASSIGN	3,FN$VrRemTip1		; типа 1
    		TRANSFER	,Met1
    Met2_	ASSIGN	3,FN$VrRemTip2		; типа 2
    		TRANSFER	,Met1
    Met3_	ASSIGN	3,FN$VrRemTip3		; типа 3
    		TRANSFER	,Met1
    Met4_	ASSIGN	3,FN$VrRemTip4		; типа 4
    ; Сегмент имитации работы диспетчеров
    Met1 	QUEUE	OCH	; Занять очередь к диспетчеру
    		ENTER	DIS	; Занять свободного диспетчера
    		DEPART OCH	; Покинуть очередь к диспетчеру
    		ADVANCE	(Normal(892,T1,To1))	; Имитация работы	 	LEAVE	DIS	; Освободить диспетчера
    		TRANSFER	q_,,Met20	; Отказать q заявкам
    Met2		TEST E	P1,1,Met21	; Мастерам 1 группы? Да,
    Met25	TRANSFER	,Met3	; отправить мастерам 1
    Met21	TEST E	P1,2,Met22	; Мастерам 2 группы
    Met26	GATE SF	P1,Met4	; Мастера 2 заняты? Если да,
    		ASSIGN	4,1	; запись в Р4 признака мастера 1
    		ASSIGN	1,1	; запись в Р1 признака мастера 1
    		GATE SF	P4,Met3			; Свободны ли мастера 1?
    		ASSIGN	1,2	; Заняты, В Р1 признак мастера 2
    		TRANSFER ,Met4		; и отправить мастерам 2
    Met22	TEST E	P1,3,Met23	; Мастерам 3 группы
    Met27	GATE SF	P1,Met5	; Мастера 3 заняты? Если да,
    	ASSIGN		4,1	; запись в Р4 признака мастера 1
    	ASSIGN		1,1	; запись в Р1 признака мастера 1
    	GATE SF		P4,Met3		; Свободны ли мастера 1?
    	ASSIGN		4,2	; запись в Р4 признака мастера 2
    	ASSIGN		1,2	; запись в Р1 признака мастера 2
    	GATE SF		P4,Met4	; свободны ли мастера 3?
    	ASSIGN		1,3	; Заняты, В Р1 признак мастера 3
    	TRANSFER	,Met5		; и отправить мастерам 3
    Met23	TEST E	P1,4	; Мастерам 4 группы
    	GATE SF		P1,Met6	; Мастера 4 заняты? Если да,
    	ASSIGN		4,1	; запись в Р4 признака мастера 1
    	ASSIGN		1,1	; запись в Р1 признака мастера 1
    	GATE SF		P4,Met3	; Свободны ли мастера 1?
    	ASSIGN		4,2	; запись в Р4 признака мастера 2
    	ASSIGN		1,2	; запись в Р1 признака мастера 2
    	GATE SF		P4,Met4	; Свободны ли мастера 2?
    	ASSIGN		4,3	; запись в Р4 признака мастера 3
    	ASSIGN		1,3	; запись в Р1 признака мастера 3
    	GATE SF		P4,Met5	; Свободны ли мастера 3?
    	ASSIGN		1,4	; запись в Р1 признака мастера 4
    	TRANSFER	,Met6	; и отправить мастерам 4
    ; Сегмент имитации работы мастеров 1 группы
    MET3 ENTER	P1	; Занять свободного мастера 1 группы
    	ADVANCE	(Exponential(892,0,P3));Имитация ремонта
    	LEAVE	P1	; Освободить свободного мастера 1 
    	TRANSFER	,Met7	; Отправить для учета
    ; Сегмент имитации работы мастеров 2 группы
    MET4 ENTER	P1	; Занять свободного мастера 2 группы
    	ADVANCE	(Exponential(892,0,P3));Имитация ремонта	LEAVE	P1	; Освободить свободного мастера 
    	TRANSFER	,Met7	; Отправить для учета
    ; Сегмент имитации работы мастеров 3 группы
    MET5 ENTER	P1	; Занять свободного мастера 3
    	ADVANCE	(Exponential(892,0,P3));Имитация ремонта
    	LEAVE	P1	; Освободить свободного мастера 3
    	TRANSFER	,Met7	; Отправить для учета
    ; Сегмент имитации работы мастеров 4 группы
    MET6	ENTER	P1			; Занять свободного мастера 4
    	ADVANCE	(Exponential(892,0,P3));Имитация ремонта
    	LEAVE	P1	; Освободить свободного мастера 4
    ; Сегмент учёта выполненных заявок и ремонтов за все прогоны модели
    MET7		TEST E		P5,1,Met9_	; заявок всего
    MET8		TRANSFER	,(Met8+P2)	; заявок типа 1
    Met81	TERMINATE							; ремонтов вида 11
    Met82	TERMINATE							; ремонтов вида 12
    Met83	TERMINATE							; ремонтов вида 13
    MET9_	TEST E		P5,2,Met10_	
    Met9		TRANSFER	,(Met9+P2)	; заявок типа 2
    Met91	TERMINATE							; ремонтов вида 21
    Met92	TERMINATE							; ремонтов вида 22
    Met93	TERMINATE							; ремонтов вида 23
    MET10_	TEST E		P5,3,Met11
    Met10	TRANSFER	,(Met10+P2)	; заявок типа 3
    Met101	TERMINATE							; ремонтов вида 31
    Met102	TERMINATE							; ремонтов вида 32
    Met103	TERMINATE							; ремонтов вида 33
    MET11	TRANSFER	,(Met11+P2)	; заявок типа 4
    Met111	TERMINATE							; ремонтов вида 41
    Met112	TERMINATE							; ремонтов вида 42
    Met113	TERMINATE							; ремонтов вида 43
    MET20	TERMINATE			; Количество не принятых заявок
    ; Сегмент задания времени моделирования и расчета результатов моделирования
    	GENERATE	VrMod						; Время моделирования
    	TEST L		X$Prog,TG1,Met41	; Если X$Prog<TG1, то
    	SAVEVALUE	Prog,TG1		; запомнить в X$Prog количество прогонов модели
    Met41	TEST E	TG1,1,Met42	; Если TG1=1, то расчет результатов моделирования
    ; Количество выполненных заявок
    	SAVEVALUE	 KolZajav1,(N$Met8/X$Prog)		; типа 1
    	SAVEVALUE	 KolZajav2,(N$Met9/X$Prog)		; типа 2
    	SAVEVALUE	 KolZajav3,(N$Met10/X$Prog)	; типа 3	
    	SAVEVALUE	 KolZajav4,(N$Met11/X$Prog)	; типа 4
    ; Вероятность выполнения заявок
    	SAVEVALUE	 VerZajav1,(N$Met8/N$Met1_)	; типа 1
    	SAVEVALUE	 VerZajav2,(N$Met9/N$Met2_)	; типа 2
    	SAVEVALUE	 VerZajav3,(N$Met10/N$Met3_)	; типа 3
    	SAVEVALUE	 VerZajav4,(N$Met11/N$Met4_)	; типа 4
    	SAVEVALUE	 VerZajav,(N$Met7/N$Met0)	; всех типов
    ; Количество выполненных видов ремонтов
    	SAVEVALUE	11,(N$Met81/X$Prog)	; вида 11
    	SAVEVALUE	12,(N$Met82/X$Prog) 	; вида 12
    	SAVEVALUE	13,(N$Met83/X$Prog) 	; вида 13
    	SAVEVALUE	21,(N$Met91/X$Prog) 	; вида 21
    	SAVEVALUE	22,(N$Met92/X$Prog) 	; вида 22
    	SAVEVALUE	23,(N$Met93/X$Prog) 	; вида 23
    	SAVEVALUE	31,(N$Met101/X$Prog) 	; вида 31
    	SAVEVALUE	32,(N$Met102/X$Prog) 	; вида 32
    	SAVEVALUE	33,(N$Met103/X$Prog) 	; вида 33
    	SAVEVALUE	41,(N$Met111/X$Prog) 	; вида 41
    	SAVEVALUE	42,(N$Met112/X$Prog) 	; вида 42
    	SAVEVALUE	43,(N$Met113/X$Prog) 	; вида 43
    Met42	TERMINATE	1
    	START	1000		; Количество прогонов модели

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

    Для упрощения построения модели МКУ даны имена Rem1 … Rem4, которые заменены номерами 1…4. Но в GPSS-программе порядок записи обратный.

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

    В сегменте имитации поступления заявок разыгрываются тип заявки и вид ремонта, которые записываются в параметры транзакта 1 и 2 соответственно. Код типа заявки записывается также в параметр 5, так как в последующем в сегменте имитации работы диспетчеров код в параметре 1 может изменяться, а в параметре 5 нет, что необходимо для сегмента учёта выполненных заявок и ремонтов.

    В этом же сегменте в параметр 3 транзакта-заявки заносится среднее время выполнения вида ремонта.

    Сегмент имитации работы диспетчеров начинается заданием очереди по аналогии с AnyLogic-моделью, хотя можно было бы обойтись и без этого, так как МКУ имеет свою очередь.

    Принято, что, как и в AnyLogic-модели, решение на распределение заявок в текущий момент времени принимает диспетчер.

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

    GATE SF		P1,Met6	; Мастера 4 заняты? Если да,

    Если мастера 4 группы свободны, то заявка отправляется им, то есть на Met6. Если же они заняты, то проверяется занятость мастеров 1 группы:

    ASSIGN		4,1	; запись в Р4 признака мастера 1
    	ASSIGN		1,1	; запись в Р1 признака мастера 1
    	GATE SF		P4,Met3	; Свободны ли мастера 1?

    Но предварительно в Р4 и Р1 заносятся коды мастеров 1 группы. Если мастера 1 группы свободны, заявка отправляется им.

    Если же мастера 1 группы заняты, то аналогично проверяется занятость мастеров 2 группы. Если они заняты - мастеров 3 группы. И если мастера 3 группы заняты, заявка отправляется мастерам 4 группы:

    ASSIGN		1,4	; запись в Р1 признака мастера 4
    	TRANSFER	,Met6	; и отправить мастерам 4

    Опять же предварительно в параметре 1 транзакта-заявки восстанавливается её первоначальный код.

    Сегменты имитации работы мастеров 1…4 групп построены одинаково. Следует заметить, что можно было бы обойтись следующими строками:

    MET3 ENTER	P1	; Занять свободного мастера 1 группы
    	ADVANCE	(Exponential(892,0,P3));Имитация ремонта
    	LEAVE	P1	; Освободить свободного мастера 1 
    	TRANSFER	,Met7	; Отправить для учета

    Заменив также в сегменте имитации работы диспетчеров Met4, Met5, Met6 на Met3.

    В сегменте учёта выполненных заявок и ремонтов в блоки с метками Met8, Met9, Met10, Met11 входят заявки типов 1…4 соответственно за все прогоны модели, поэтому в сегменте задания времени моделирования и расчёта результатов моделирования для определения среднего числа выполненных заявок производится деление на число выполненных прогонов. Тоже производится и при определении среднего числа выполненных видов ремонтов.

    Количество выполненных заявок и вероятности их выполнения сохраняются в ячейках KolZajav1… KolZajav4 и VerZajav1 …VerZajav4 соответственно.

    Вероятности выполнения видов ремонтов также сохраняются в ячейках, например, видов 1, 2, 3 по заявке типа 1 в ячейках 11, 12 и 13 соответственно.

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

    Всего выполнены три группы экспериментов по три эксперимента в каждой группе. Результаты экспериментов каждой группы представлены в Табл. 8.4…8.6 соответственно.

    В первой группе экспериментов (Табл. 8.4) все исходные данные соответствуют постановке задачи, кроме среднего интервала времени поступления заявок, который уменьшен: Тр = 20 мин.

    Как и в предыдущих экспериментах сравнивать будем результаты моделирования, полученные в GPSS World и в AnyLogic7.

    Например, разница вероятностей выполнения всех заявок составляет $$\Delta_{5} = 0,001$$, коэффициентов использования мастеров всех групп - $$\Delta_{6} = 0,005…0,013$$. Количество выполненных заявок и ремонтов, если считать с точностью до целого, одно и тоже в обеих системах моделирования.

    Во второй группе экспериментов (Табл. 8.5) все исходные данные соответствуют постановке задачи, то есть средний интервал времени поступления заявок Тр = 30 мин.

    Во второй группе разница вероятностей выполнения всех заявок составляет $$\Delta_{5} = 0,001$$, коэффициентов использования мастеров всех групп практически такое же - $$\Delta_{6} = 0,001…0,014$$. Количество выполненных заявок и ремонтов, так же если считать с точностью до целого, одно и тоже.

    Аналогичные выводы можно сделать и по третьей группе экспериментов (Табл. 8.6), в которой были изменены следующие данные в сторону увеличения количества диспетчеров и мастеров второй и третьей групп: Тр = 20 мин, колДисп = 3, колМастеров2 = 2, колМастеров3 = 2.

    Здесь также вероятность выполнения всех заявок отличается незначительно $$\Delta_{5} = 0,001$$, но несколько больше разница между коэффициентами занятости всех групп мастеров-ремонтников: $$\Delta_{5} = 0,015…0,026$$.

    Увеличение количества мастеров-ремонтников второй и третьей групп с одного до двух в каждой группе позволило по сравнению со второй группой экспериментов увеличить количество выполненных заявок в абсолютном выражении с 240,075 до 281,239 и относительном выражении в 1,174 раза (281,239: 240,075 = 1,174). При этом незначительно выросла вероятность выполнения заявок: с 0,977 до 0,980. Увеличилась загрузка мастеров-ремонтников всех групп.

    Показатели фирмы предоставления ремонтных услуг
    ПоказателиGPSS WorldAnyLogic6AnyLogic7
    Среднее время поступления заявок 20 мин
    Выполнено заявок типа 137,87937,42837,707
    $$\Delta_{1} = \left | 37,879-37,707 \right | = 0,172$$
    ремонтов: вида 1119,02118,70518,697
    вида 129,4619,3549,353
    вида 139,3979,3699,257
    Выполнено заявок типа 256,29756,3356,524
    $$\Delta_{2} = \left | 56,297-56,524 \right | = 0,227$$
    ремонтов: вида 2128,19528,37828,517
    вида 2213,913,91414,026
    вида 2314,20214,03813,981
    Выполнено заявок типа 347,07546,94647,322
    $$\Delta_{3} = \left | 47,075-47,322 \right | = 0,247$$
    ремонтов: вида 3123,5723,41423,784
    вида 3211,83111,78811,711
    вида 3311,67411,74411,827
    Выполнено заявок типа 446,85747,48647
    $$\Delta_{4} = \left | 46,857-47,000 \right | = 0,143$$
    ремонтов: вида 4123,44323,55223,527
    вида 4211,81112,0511,886
    вида 4311,60311,88411,587
    Вероятность выполнения всех заявок0,6540,6550,653
    $$\Delta_{5} = \left | 0,654-0,653 \right | = 0,001$$
    Коэффициенты использования: мастеров 10,8320,8380,833
    мастеров 20,8650,8680,866
    мастеров 30,6590,6680,664
    мастеров 40,6370,6620,65
    $$\Delta_{6} = 0,001…0,013$$
    Коэффициент использования диспетчеров1,0001,0001,000
    Показатели фирмы предоставления ремонтных услуг
    ПоказателиGPSS WorldAnyLogic6AnyLogic7
    Среднее время поступления заявок 20 мин
    Выполнено заявок типа 137,4937,46637,612
    $$\Delta_{1} = \left | 37,490-37,612 \right | = 0,192$$
    ремонтов: вида 1118,70518,84618,893
    вида 129,3259,2369,283
    вида 139,469,3849,436
    Выполнено заявок типа 256,59756,3656,279
    $$\Delta_{2} = \left | 56,597-56,279 \right | = 0,318$$
    ремонтов: вида 2128,18627,94128,014
    вида 2214,34114,214,07
    вида 2314,0714,21914,195
    Выполнено заявок типа 346,81147,15146,98
    $$\Delta_{3} = \left | 46,811-46,980 \right | = 0,169$$
    ремонтов: вида 3123,37327,94123,68
    вида 3211,84214,211,662
    вида 3311,59614,21911,638
    Выполнено заявок типа 447,22347,15146,887
    $$\Delta_{4} = \left | 47,223-46,887 \right | = 0,336$$
    ремонтов: вида 4123,64723,31123,445
    вида 4211,84411,79111,801
    вида 4311,73211,80711,641
    Вероятность выполнения всех заявок0,9780,9780,977
    $$\Delta_{5} = \left | 0,978-0,977 \right | = 0,001$$
    Коэффициенты использования: мастеров 10,8280,8360,832
    мастеров 20,8580,8680,864
    мастеров 30,6530,6670,649
    мастеров 40,6320,6570,633
    $$\Delta_{6} = 0,001…0,014$$
    Коэффициент использования диспетчеров1,0000,9990,998
    Показатели фирмы предоставления ремонтных услуг
    ПоказателиGPSS WorldAnyLogic6AnyLogic7
    Среднее время поступления заявок 20 мин
    Выполнено заявок типа 156,59256,22155,849
    $$\Delta_{1} = \left | 56,592-55,849 \right | = 0,743$$
    ремонтов: вида 1128,39828,06928,075
    вида 1214,15814,15213,889
    вида 1314,0361413,885
    Выполнено заявок типа 284,22784,7484,592
    $$\Delta_{2} = \left | 84,227-84,592 \right | = 0,355$$
    ремонтов: вида 2142,08742,51342,411
    вида 2221,19621,28521,026
    вида 2320,97420,94221,155
    Выполнено заявок типа 370,67970,58670,377
    $$\Delta_{3} = \left | 70,679-70,377 \right | = 0,302$$
    ремонтов: вида 3135,25635,07235,147
    вида 3217,67117,65917,662
    вида 3317,75217,85517,568
    Выполнено заявок типа 470,24470,48670,421
    $$\Delta_{4} = \left | 70,244-70,421 \right | = 0,177$$
    ремонтов: вида 4135,11234,97435,344
    вида 4217,75717,69617,491
    вида 4317,37517,81617,586
    Вероятность выполнения всех заявок0,9790,980,98
    $$\Delta_{5} = \left | 0,979-0,979 \right | = 0,001$$
    Коэффициенты использования: мастеров 10,9320,9490,947
    мастеров 20,8740,8930,891
    мастеров 30,6670,6460,641
    мастеров 40,7720,7960,793
    $$\Delta_{6} = \left | 0,932-0,947 \right | = 0,015$$
    Коэффициент использования диспетчеров0,9980,9990,996
    Вернуться к учебному плану