В фирму предоставления ремонтных услуг поступают заявки 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 заявок всех типов.
Интервалы времени между поступлениями заявок и время выполнения заявок распределены по экспоненциальному закону. Время обслуживания одной заявки диспетчером подчинено нормальному закону.
Разработать имитационную модель предоставления ремонтных услуг. Исследовать зависимость количества выполненных заявок и вероятностей выполнения заявок всех типов от интервала Тп поступления их в ремонт и вероятностей 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.
Файл/Создать/Модель на панели инструментов. Откроется диалоговое окно Новая модель.
Имя модели диалогового окна Новая модель введите Рем_услуги. Выберите каталог, в котором будут сохранены файлы модели.
Готово.
Презентация перетащите элемент Область просмотра. На странице Основные панели Свойства в поле Имя: введите Данные.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Местоположение и размер панели Свойства введите в поля X: 0, Y: 650, Ширина: 610, Высота: 590.
Презентация перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой. В прямоугольнике мы разместим элементы для ввода исходных данных и вывода результатов моделирования.
Местоположение и размер панели Свойства введите в поля X: 10, Y: 670, Ширина: 590, Высота: 560.
text и на странице Текст панели Свойства вместо слова text: введите Исходные данные.
(рис 8.2) Размещение элементов Параметр и Переменная
Палитре выделите Основная. Перетащите элементы Параметр на элемент Скругленный прямоугольник. Разместите их так, как показано на Рис. 8.2. Используйте копирование.
Отображать имя.
колДисп, колМастеров1…колМастеров4 установите int. Тип остальных элементов - double.Имена параметров оставлены практически такими же, как в постановке задачи на разработку имитационной модели. По Рис. 8.2 нельзя определить, например, в Т11 русская буква Т или английская. Поэтому принимайте решение сами. Тем не менее, лучше все имена давать на одном языке.
| Элементы и их свойства | |||
|---|---|---|---|
| Параметр | Параметр | ||
| Имя | Значение по умолчанию | Имя | Значение по умолчанию |
| Tp | 30 | T1 | 15 |
| n | 4 | To1 | 2 |
| T11 | 30 | p11 | 0,5 |
| T12 | 40 | p12 | 0,75 |
| T13 | 50 | p13 | 1 |
| T21 | 20 | p21 | 0,5 |
| T22 | 30 | p22 | 0,75 |
| T23 | 40 | p23 | 1 |
| T31 | 15 | p31 | 0,5 |
| T32 | 25 | p32 | 0,75 |
| T33 | 35 | p33 | 1 |
| T41 | 25 | p41 | 0,5 |
| T42 | 35 | p42 | 0,75 |
| T43 | 45 | p43 | 1 |
| колПрог | 1000 | колДисп | 2 |
| колМастеров1 | 2 | колМастеров3 | 1 |
| колМастеров2 | 1 | колМастеров4 | 1 |
Область просмотра мы уже перетащили Скругленный прямоугольник. На нём мы будем также размещать, как отмечалось ранее, элементы для вывода результатов моделирования.
text и на странице Текст: панели Свойства вместо слова text введите Результаты моделирования. Поместите этот текст посредине в нижней части элемента Скругленный прямоугольник.
Основная перетащите элементы Переменная. Разместите их и дайте им имена согласно Рис. 8.2. Тип всех переменных double.Строить событийную часть модели будем последовательной реализацией средствами AnyLogic выделенных ранее сегментов (см. п. 8.1.4):
Презентация перетащите элемент Область просмотра. Перейдите на страницу Основные панели Свойства. В поле Имя введите МодРемУслуги.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Местоположение и размер панели Свойства введите в поля 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.
| Свойства | Значение |
|---|---|
| Имя | типЗаявки |
| Использовать | Условия |
| Условие 1 | entity.типЗ<=p1 |
| Действия При выходе 1 | entity.типЗ=1; |
| постЗаявТип1++; | |
| постЗаявТип++; | |
| Условие 2 | entity.типЗ<=p2 |
| Действия При выходе 2 | entity.типЗ=2; |
| постЗаявТип2++; | |
| постЗаявТип++; | |
| Условие 3 | entity.типЗ<=p3 |
| Действия При выходе 3 | entity.типЗ=3; |
| постЗаявТип3++; | |
| постЗаявТип++; | |
| Условие 4 | entity.типЗ<=p4 |
| Действия При выходе 4 | entity.типЗ=4; |
| постЗаявТип4++; | |
| постЗаявТип++; | |
| Имя | oтказ |
| Выход true выбирается | C заданной вероятностью |
| Вероятность | 0,98 |
| Имя | поТипамЗаяв |
| Использовать | Условия |
| Условие 1 | entity.типЗ==1 |
| Условие 2 | entity.типЗ==2 |
| Условие 3 | entity.типЗ==3 |
| Условие 4 | entity.типЗ==4 |
| Имя | видРемЗаяв1 |
| Использовать | Условия |
| Условие 1 | entity.видР<=p11 |
| Действия При выходе 1 | entity.видР=1; |
| entity.времяР=exponential(1/T11); | |
| Условие 2 | entity. видР<=p12 |
| Действия При выходе 2 | entity.видР=2; |
| entity.времяР=exponential(1/T12); | |
| Условие 3 | entity.видР=<p13 |
| Действия При выходе 3 | entity.видР=3; |
| entity.времяР=exponential(1/T13); | |
| Имя | видРемЗаяв2 |
| Использовать | Условия |
| Условие 1 | entity.видР<=p21 |
| Действия При выходе 1 | entity.видР=1; |
| entity.времяР=exponential(1/T21); | |
| Условие 2 | entity. видР<=p22 |
| Действия При выходе 2 | entity.видР=2; |
| entity.времяР=exponential(1/T22); | |
| Условие 3 | entity.видР=<p23 |
| Действия При выходе 3 | entity.видР=3; |
| entity.времяР=exponential(1/T23); | |
| Имя | видРемЗаяв3 |
| Использовать | Условия |
| Условие 1 | entity.видР<=p31 |
| Действия При выходе 1 | entity.видР=1; |
| entity.времяР=exponential(1/T31); | |
| Условие 2 | entity. видР<=p32 |
| Действия При выходе 2 | entity.видР=2; |
| entity.времяР=exponential(1/T32); | |
| Условие 3 | entity.видР=<p33 |
| Действия При выходе 3 | entity.видР=3; |
| entity.времяР=exponential(1/T33); | |
| Имя | видРемЗаяв4 |
| Использовать | Условия |
| Условие 1 | entity.видР<=p41 |
| Действия При выходе 1 | entity.видР=1; |
| entity.времяР=exponential(1/T41); | |
| Условие 2 | entity. видР<=p42 |
| Действия При выходе 2 | entity.видР=2; |
| entity.времяР=exponential(1/T42); | |
| Условие 3 | entity.видР=<p43 |
| Действия При выходе 3 | entity.видР=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) Сегменты Мастера и Учёт выполненых заявок
| Свойства | Значение |
|---|---|
| Имя | поТипамЗаяв1 |
| Использовать | Условия |
| Условие 1 | entity.типЗ==1 |
| Действия При выходе 1 | выпЗаявТип1++; |
| выпЗаявТип++; | |
| верВыпЗаяв1= | |
| выпЗаявТип1/постЗаявТип1; | |
| Условие 2 | entity.типЗ==2 |
| Действия При выходе 2 | выпЗаявТип2++; |
| выпЗаявТип++; | |
| верВыпЗаяв2= | |
| выпЗаявТип2/постЗаявТип2; | |
| Условие 3 | entity.типЗ==3 |
| Действия При выходе 3 | выпЗаявТип3++; |
| выпЗаявТип++; | |
| верВыпЗаяв3= | |
| выпЗаявТип3/постЗаявТип3; | |
| Условие 4 | entity.типЗ==4 |
| Действия При выходе 4 | выпЗаявТип4++; |
| выпЗаявТип++; | |
| верВыпЗаяв4= | |
| выпЗаявТип4/постЗаявТип4; | |
| Имя | выпРемЗаяв1 |
| Использовать | Условия |
| Условие 1 | entity.видР==1 |
| Действия При выходе 1 | выпРемВида11++; |
| Условие 2 | entity.видР==2 |
| Действия При выходе 2 | выпРемВида12++; |
| Условие 3 | entity.видР==3 |
| Действия При выходе 3 | выпРемВида13++; |
| Имя | выпРемЗаяв2 |
| Использовать | Условия |
| Условие 1 | entity.видР==1 |
| Действия При выходе 1 | выпРемВида21++; |
| Условие 2 | entity.видР==2 |
| Действия При выходе 2 | выпРемВида22++; |
| Условие 3 | entity.видР==3 |
| Действия При выходе 3 | выпРемВида23++; |
| Имя | выпРемЗаяв3 |
| Использовать | Условия |
| Условие 1 | entity.видР==1 |
| Действия При выходе 1 | выпРемВида31++; |
| Условие 2 | entity.видР==2 |
| Действия При выходе 2 | выпРемВида32++; |
| Условие 3 | entity.видР==3 |
| Действия При выходе 3 | выпРемВида33++; |
| Имя | выпРемЗаяв4 |
| Использовать | Условия |
| Условие 1 | entity.видР==1 |
| Действия При выходе 1 | выпРемВида41++; |
| Условие 2 | entity.видР==2 |
| Действия При выходе 2 | выпРемВида42++; |
| Условие 3 | entity.видР==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.
Как уже отмечалось, фирма предоставления ремонтных услуг представляет собой многофазную многоканальную систему массового обслуживания разомкнутого типа (см. Рис. 8.1).
Модель предоставления ремонтных услуг должна состоять из следующих сегментов:
Ниже приводится программа.
; Модель предоставления ремонтных услуг ; Замена имен МКУ номерами 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 World | AnyLogic6 | AnyLogic7 |
|---|---|---|---|
| Среднее время поступления заявок 20 мин | |||
| Выполнено заявок типа 1 | 37,879 | 37,428 | 37,707 |
| $$\Delta_{1} = \left | 37,879-37,707 \right | = 0,172$$ | |||
| ремонтов: вида 11 | 19,021 | 18,705 | 18,697 |
| вида 12 | 9,461 | 9,354 | 9,353 |
| вида 13 | 9,397 | 9,369 | 9,257 |
| Выполнено заявок типа 2 | 56,297 | 56,33 | 56,524 |
| $$\Delta_{2} = \left | 56,297-56,524 \right | = 0,227$$ | |||
| ремонтов: вида 21 | 28,195 | 28,378 | 28,517 |
| вида 22 | 13,9 | 13,914 | 14,026 |
| вида 23 | 14,202 | 14,038 | 13,981 |
| Выполнено заявок типа 3 | 47,075 | 46,946 | 47,322 |
| $$\Delta_{3} = \left | 47,075-47,322 \right | = 0,247$$ | |||
| ремонтов: вида 31 | 23,57 | 23,414 | 23,784 |
| вида 32 | 11,831 | 11,788 | 11,711 |
| вида 33 | 11,674 | 11,744 | 11,827 |
| Выполнено заявок типа 4 | 46,857 | 47,486 | 47 |
| $$\Delta_{4} = \left | 46,857-47,000 \right | = 0,143$$ | |||
| ремонтов: вида 41 | 23,443 | 23,552 | 23,527 |
| вида 42 | 11,811 | 12,05 | 11,886 |
| вида 43 | 11,603 | 11,884 | 11,587 |
| Вероятность выполнения всех заявок | 0,654 | 0,655 | 0,653 |
| $$\Delta_{5} = \left | 0,654-0,653 \right | = 0,001$$ | |||
| Коэффициенты использования: мастеров 1 | 0,832 | 0,838 | 0,833 |
| мастеров 2 | 0,865 | 0,868 | 0,866 |
| мастеров 3 | 0,659 | 0,668 | 0,664 |
| мастеров 4 | 0,637 | 0,662 | 0,65 |
| $$\Delta_{6} = 0,001…0,013$$ | |||
| Коэффициент использования диспетчеров | 1,000 | 1,000 | 1,000 |
| Показатели | GPSS World | AnyLogic6 | AnyLogic7 |
|---|---|---|---|
| Среднее время поступления заявок 20 мин | |||
| Выполнено заявок типа 1 | 37,49 | 37,466 | 37,612 |
| $$\Delta_{1} = \left | 37,490-37,612 \right | = 0,192$$ | |||
| ремонтов: вида 11 | 18,705 | 18,846 | 18,893 |
| вида 12 | 9,325 | 9,236 | 9,283 |
| вида 13 | 9,46 | 9,384 | 9,436 |
| Выполнено заявок типа 2 | 56,597 | 56,36 | 56,279 |
| $$\Delta_{2} = \left | 56,597-56,279 \right | = 0,318$$ | |||
| ремонтов: вида 21 | 28,186 | 27,941 | 28,014 |
| вида 22 | 14,341 | 14,2 | 14,07 |
| вида 23 | 14,07 | 14,219 | 14,195 |
| Выполнено заявок типа 3 | 46,811 | 47,151 | 46,98 |
| $$\Delta_{3} = \left | 46,811-46,980 \right | = 0,169$$ | |||
| ремонтов: вида 31 | 23,373 | 27,941 | 23,68 |
| вида 32 | 11,842 | 14,2 | 11,662 |
| вида 33 | 11,596 | 14,219 | 11,638 |
| Выполнено заявок типа 4 | 47,223 | 47,151 | 46,887 |
| $$\Delta_{4} = \left | 47,223-46,887 \right | = 0,336$$ | |||
| ремонтов: вида 41 | 23,647 | 23,311 | 23,445 |
| вида 42 | 11,844 | 11,791 | 11,801 |
| вида 43 | 11,732 | 11,807 | 11,641 |
| Вероятность выполнения всех заявок | 0,978 | 0,978 | 0,977 |
| $$\Delta_{5} = \left | 0,978-0,977 \right | = 0,001$$ | |||
| Коэффициенты использования: мастеров 1 | 0,828 | 0,836 | 0,832 |
| мастеров 2 | 0,858 | 0,868 | 0,864 |
| мастеров 3 | 0,653 | 0,667 | 0,649 |
| мастеров 4 | 0,632 | 0,657 | 0,633 |
| $$\Delta_{6} = 0,001…0,014$$ | |||
| Коэффициент использования диспетчеров | 1,000 | 0,999 | 0,998 |
| Показатели | GPSS World | AnyLogic6 | AnyLogic7 |
|---|---|---|---|
| Среднее время поступления заявок 20 мин | |||
| Выполнено заявок типа 1 | 56,592 | 56,221 | 55,849 |
| $$\Delta_{1} = \left | 56,592-55,849 \right | = 0,743$$ | |||
| ремонтов: вида 11 | 28,398 | 28,069 | 28,075 |
| вида 12 | 14,158 | 14,152 | 13,889 |
| вида 13 | 14,036 | 14 | 13,885 |
| Выполнено заявок типа 2 | 84,227 | 84,74 | 84,592 |
| $$\Delta_{2} = \left | 84,227-84,592 \right | = 0,355$$ | |||
| ремонтов: вида 21 | 42,087 | 42,513 | 42,411 |
| вида 22 | 21,196 | 21,285 | 21,026 |
| вида 23 | 20,974 | 20,942 | 21,155 |
| Выполнено заявок типа 3 | 70,679 | 70,586 | 70,377 |
| $$\Delta_{3} = \left | 70,679-70,377 \right | = 0,302$$ | |||
| ремонтов: вида 31 | 35,256 | 35,072 | 35,147 |
| вида 32 | 17,671 | 17,659 | 17,662 |
| вида 33 | 17,752 | 17,855 | 17,568 |
| Выполнено заявок типа 4 | 70,244 | 70,486 | 70,421 |
| $$\Delta_{4} = \left | 70,244-70,421 \right | = 0,177$$ | |||
| ремонтов: вида 41 | 35,112 | 34,974 | 35,344 |
| вида 42 | 17,757 | 17,696 | 17,491 |
| вида 43 | 17,375 | 17,816 | 17,586 |
| Вероятность выполнения всех заявок | 0,979 | 0,98 | 0,98 |
| $$\Delta_{5} = \left | 0,979-0,979 \right | = 0,001$$ | |||
| Коэффициенты использования: мастеров 1 | 0,932 | 0,949 | 0,947 |
| мастеров 2 | 0,874 | 0,893 | 0,891 |
| мастеров 3 | 0,667 | 0,646 | 0,641 |
| мастеров 4 | 0,772 | 0,796 | 0,793 |
| $$\Delta_{6} = \left | 0,932-0,947 \right | = 0,015$$ | |||
| Коэффициент использования диспетчеров | 0,998 | 0,999 | 0,996 |
В фирму предоставления ремонтных услуг поступают заявки 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 заявок всех типов.
Интервалы времени между поступлениями заявок и время выполнения заявок распределены по экспоненциальному закону. Время обслуживания одной заявки диспетчером подчинено нормальному закону.
Разработать имитационную модель предоставления ремонтных услуг. Исследовать зависимость количества выполненных заявок и вероятностей выполнения заявок всех типов от интервала Тп поступления их в ремонт и вероятностей 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.
Файл/Создать/Модель на панели инструментов. Откроется диалоговое окно Новая модель.
Имя модели диалогового окна Новая модель введите Рем_услуги. Выберите каталог, в котором будут сохранены файлы модели.
Готово.
Презентация перетащите элемент Область просмотра. На странице Основные панели Свойства в поле Имя: введите Данные.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Местоположение и размер панели Свойства введите в поля X: 0, Y: 650, Ширина: 610, Высота: 590.
Презентация перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой. В прямоугольнике мы разместим элементы для ввода исходных данных и вывода результатов моделирования.
Местоположение и размер панели Свойства введите в поля X: 10, Y: 670, Ширина: 590, Высота: 560.
text и на странице Текст панели Свойства вместо слова text: введите Исходные данные.
(рис 8.2) Размещение элементов Параметр и Переменная
Палитре выделите Основная. Перетащите элементы Параметр на элемент Скругленный прямоугольник. Разместите их так, как показано на Рис. 8.2. Используйте копирование.
Отображать имя.
колДисп, колМастеров1…колМастеров4 установите int. Тип остальных элементов - double.Имена параметров оставлены практически такими же, как в постановке задачи на разработку имитационной модели. По Рис. 8.2 нельзя определить, например, в Т11 русская буква Т или английская. Поэтому принимайте решение сами. Тем не менее, лучше все имена давать на одном языке.
| Элементы и их свойства | |||
|---|---|---|---|
| Параметр | Параметр | ||
| Имя | Значение по умолчанию | Имя | Значение по умолчанию |
| Tp | 30 | T1 | 15 |
| n | 4 | To1 | 2 |
| T11 | 30 | p11 | 0,5 |
| T12 | 40 | p12 | 0,75 |
| T13 | 50 | p13 | 1 |
| T21 | 20 | p21 | 0,5 |
| T22 | 30 | p22 | 0,75 |
| T23 | 40 | p23 | 1 |
| T31 | 15 | p31 | 0,5 |
| T32 | 25 | p32 | 0,75 |
| T33 | 35 | p33 | 1 |
| T41 | 25 | p41 | 0,5 |
| T42 | 35 | p42 | 0,75 |
| T43 | 45 | p43 | 1 |
| колПрог | 1000 | колДисп | 2 |
| колМастеров1 | 2 | колМастеров3 | 1 |
| колМастеров2 | 1 | колМастеров4 | 1 |
Область просмотра мы уже перетащили Скругленный прямоугольник. На нём мы будем также размещать, как отмечалось ранее, элементы для вывода результатов моделирования.
text и на странице Текст: панели Свойства вместо слова text введите Результаты моделирования. Поместите этот текст посредине в нижней части элемента Скругленный прямоугольник.
Основная перетащите элементы Переменная. Разместите их и дайте им имена согласно Рис. 8.2. Тип всех переменных double.Строить событийную часть модели будем последовательной реализацией средствами AnyLogic выделенных ранее сегментов (см. п. 8.1.4):
Презентация перетащите элемент Область просмотра. Перейдите на страницу Основные панели Свойства. В поле Имя введите МодРемУслуги.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Местоположение и размер панели Свойства введите в поля 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.
| Свойства | Значение |
|---|---|
| Имя | типЗаявки |
| Использовать | Условия |
| Условие 1 | entity.типЗ<=p1 |
| Действия При выходе 1 | entity.типЗ=1; |
| постЗаявТип1++; | |
| постЗаявТип++; | |
| Условие 2 | entity.типЗ<=p2 |
| Действия При выходе 2 | entity.типЗ=2; |
| постЗаявТип2++; | |
| постЗаявТип++; | |
| Условие 3 | entity.типЗ<=p3 |
| Действия При выходе 3 | entity.типЗ=3; |
| постЗаявТип3++; | |
| постЗаявТип++; | |
| Условие 4 | entity.типЗ<=p4 |
| Действия При выходе 4 | entity.типЗ=4; |
| постЗаявТип4++; | |
| постЗаявТип++; | |
| Имя | oтказ |
| Выход true выбирается | C заданной вероятностью |
| Вероятность | 0,98 |
| Имя | поТипамЗаяв |
| Использовать | Условия |
| Условие 1 | entity.типЗ==1 |
| Условие 2 | entity.типЗ==2 |
| Условие 3 | entity.типЗ==3 |
| Условие 4 | entity.типЗ==4 |
| Имя | видРемЗаяв1 |
| Использовать | Условия |
| Условие 1 | entity.видР<=p11 |
| Действия При выходе 1 | entity.видР=1; |
| entity.времяР=exponential(1/T11); | |
| Условие 2 | entity. видР<=p12 |
| Действия При выходе 2 | entity.видР=2; |
| entity.времяР=exponential(1/T12); | |
| Условие 3 | entity.видР=<p13 |
| Действия При выходе 3 | entity.видР=3; |
| entity.времяР=exponential(1/T13); | |
| Имя | видРемЗаяв2 |
| Использовать | Условия |
| Условие 1 | entity.видР<=p21 |
| Действия При выходе 1 | entity.видР=1; |
| entity.времяР=exponential(1/T21); | |
| Условие 2 | entity. видР<=p22 |
| Действия При выходе 2 | entity.видР=2; |
| entity.времяР=exponential(1/T22); | |
| Условие 3 | entity.видР=<p23 |
| Действия При выходе 3 | entity.видР=3; |
| entity.времяР=exponential(1/T23); | |
| Имя | видРемЗаяв3 |
| Использовать | Условия |
| Условие 1 | entity.видР<=p31 |
| Действия При выходе 1 | entity.видР=1; |
| entity.времяР=exponential(1/T31); | |
| Условие 2 | entity. видР<=p32 |
| Действия При выходе 2 | entity.видР=2; |
| entity.времяР=exponential(1/T32); | |
| Условие 3 | entity.видР=<p33 |
| Действия При выходе 3 | entity.видР=3; |
| entity.времяР=exponential(1/T33); | |
| Имя | видРемЗаяв4 |
| Использовать | Условия |
| Условие 1 | entity.видР<=p41 |
| Действия При выходе 1 | entity.видР=1; |
| entity.времяР=exponential(1/T41); | |
| Условие 2 | entity. видР<=p42 |
| Действия При выходе 2 | entity.видР=2; |
| entity.времяР=exponential(1/T42); | |
| Условие 3 | entity.видР=<p43 |
| Действия При выходе 3 | entity.видР=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) Сегменты Мастера и Учёт выполненых заявок
| Свойства | Значение |
|---|---|
| Имя | поТипамЗаяв1 |
| Использовать | Условия |
| Условие 1 | entity.типЗ==1 |
| Действия При выходе 1 | выпЗаявТип1++; |
| выпЗаявТип++; | |
| верВыпЗаяв1= | |
| выпЗаявТип1/постЗаявТип1; | |
| Условие 2 | entity.типЗ==2 |
| Действия При выходе 2 | выпЗаявТип2++; |
| выпЗаявТип++; | |
| верВыпЗаяв2= | |
| выпЗаявТип2/постЗаявТип2; | |
| Условие 3 | entity.типЗ==3 |
| Действия При выходе 3 | выпЗаявТип3++; |
| выпЗаявТип++; | |
| верВыпЗаяв3= | |
| выпЗаявТип3/постЗаявТип3; | |
| Условие 4 | entity.типЗ==4 |
| Действия При выходе 4 | выпЗаявТип4++; |
| выпЗаявТип++; | |
| верВыпЗаяв4= | |
| выпЗаявТип4/постЗаявТип4; | |
| Имя | выпРемЗаяв1 |
| Использовать | Условия |
| Условие 1 | entity.видР==1 |
| Действия При выходе 1 | выпРемВида11++; |
| Условие 2 | entity.видР==2 |
| Действия При выходе 2 | выпРемВида12++; |
| Условие 3 | entity.видР==3 |
| Действия При выходе 3 | выпРемВида13++; |
| Имя | выпРемЗаяв2 |
| Использовать | Условия |
| Условие 1 | entity.видР==1 |
| Действия При выходе 1 | выпРемВида21++; |
| Условие 2 | entity.видР==2 |
| Действия При выходе 2 | выпРемВида22++; |
| Условие 3 | entity.видР==3 |
| Действия При выходе 3 | выпРемВида23++; |
| Имя | выпРемЗаяв3 |
| Использовать | Условия |
| Условие 1 | entity.видР==1 |
| Действия При выходе 1 | выпРемВида31++; |
| Условие 2 | entity.видР==2 |
| Действия При выходе 2 | выпРемВида32++; |
| Условие 3 | entity.видР==3 |
| Действия При выходе 3 | выпРемВида33++; |
| Имя | выпРемЗаяв4 |
| Использовать | Условия |
| Условие 1 | entity.видР==1 |
| Действия При выходе 1 | выпРемВида41++; |
| Условие 2 | entity.видР==2 |
| Действия При выходе 2 | выпРемВида42++; |
| Условие 3 | entity.видР==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.
Как уже отмечалось, фирма предоставления ремонтных услуг представляет собой многофазную многоканальную систему массового обслуживания разомкнутого типа (см. Рис. 8.1).
Модель предоставления ремонтных услуг должна состоять из следующих сегментов:
Ниже приводится программа.
; Модель предоставления ремонтных услуг ; Замена имен МКУ номерами 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 World | AnyLogic6 | AnyLogic7 |
|---|---|---|---|
| Среднее время поступления заявок 20 мин | |||
| Выполнено заявок типа 1 | 37,879 | 37,428 | 37,707 |
| $$\Delta_{1} = \left | 37,879-37,707 \right | = 0,172$$ | |||
| ремонтов: вида 11 | 19,021 | 18,705 | 18,697 |
| вида 12 | 9,461 | 9,354 | 9,353 |
| вида 13 | 9,397 | 9,369 | 9,257 |
| Выполнено заявок типа 2 | 56,297 | 56,33 | 56,524 |
| $$\Delta_{2} = \left | 56,297-56,524 \right | = 0,227$$ | |||
| ремонтов: вида 21 | 28,195 | 28,378 | 28,517 |
| вида 22 | 13,9 | 13,914 | 14,026 |
| вида 23 | 14,202 | 14,038 | 13,981 |
| Выполнено заявок типа 3 | 47,075 | 46,946 | 47,322 |
| $$\Delta_{3} = \left | 47,075-47,322 \right | = 0,247$$ | |||
| ремонтов: вида 31 | 23,57 | 23,414 | 23,784 |
| вида 32 | 11,831 | 11,788 | 11,711 |
| вида 33 | 11,674 | 11,744 | 11,827 |
| Выполнено заявок типа 4 | 46,857 | 47,486 | 47 |
| $$\Delta_{4} = \left | 46,857-47,000 \right | = 0,143$$ | |||
| ремонтов: вида 41 | 23,443 | 23,552 | 23,527 |
| вида 42 | 11,811 | 12,05 | 11,886 |
| вида 43 | 11,603 | 11,884 | 11,587 |
| Вероятность выполнения всех заявок | 0,654 | 0,655 | 0,653 |
| $$\Delta_{5} = \left | 0,654-0,653 \right | = 0,001$$ | |||
| Коэффициенты использования: мастеров 1 | 0,832 | 0,838 | 0,833 |
| мастеров 2 | 0,865 | 0,868 | 0,866 |
| мастеров 3 | 0,659 | 0,668 | 0,664 |
| мастеров 4 | 0,637 | 0,662 | 0,65 |
| $$\Delta_{6} = 0,001…0,013$$ | |||
| Коэффициент использования диспетчеров | 1,000 | 1,000 | 1,000 |
| Показатели | GPSS World | AnyLogic6 | AnyLogic7 |
|---|---|---|---|
| Среднее время поступления заявок 20 мин | |||
| Выполнено заявок типа 1 | 37,49 | 37,466 | 37,612 |
| $$\Delta_{1} = \left | 37,490-37,612 \right | = 0,192$$ | |||
| ремонтов: вида 11 | 18,705 | 18,846 | 18,893 |
| вида 12 | 9,325 | 9,236 | 9,283 |
| вида 13 | 9,46 | 9,384 | 9,436 |
| Выполнено заявок типа 2 | 56,597 | 56,36 | 56,279 |
| $$\Delta_{2} = \left | 56,597-56,279 \right | = 0,318$$ | |||
| ремонтов: вида 21 | 28,186 | 27,941 | 28,014 |
| вида 22 | 14,341 | 14,2 | 14,07 |
| вида 23 | 14,07 | 14,219 | 14,195 |
| Выполнено заявок типа 3 | 46,811 | 47,151 | 46,98 |
| $$\Delta_{3} = \left | 46,811-46,980 \right | = 0,169$$ | |||
| ремонтов: вида 31 | 23,373 | 27,941 | 23,68 |
| вида 32 | 11,842 | 14,2 | 11,662 |
| вида 33 | 11,596 | 14,219 | 11,638 |
| Выполнено заявок типа 4 | 47,223 | 47,151 | 46,887 |
| $$\Delta_{4} = \left | 47,223-46,887 \right | = 0,336$$ | |||
| ремонтов: вида 41 | 23,647 | 23,311 | 23,445 |
| вида 42 | 11,844 | 11,791 | 11,801 |
| вида 43 | 11,732 | 11,807 | 11,641 |
| Вероятность выполнения всех заявок | 0,978 | 0,978 | 0,977 |
| $$\Delta_{5} = \left | 0,978-0,977 \right | = 0,001$$ | |||
| Коэффициенты использования: мастеров 1 | 0,828 | 0,836 | 0,832 |
| мастеров 2 | 0,858 | 0,868 | 0,864 |
| мастеров 3 | 0,653 | 0,667 | 0,649 |
| мастеров 4 | 0,632 | 0,657 | 0,633 |
| $$\Delta_{6} = 0,001…0,014$$ | |||
| Коэффициент использования диспетчеров | 1,000 | 0,999 | 0,998 |
| Показатели | GPSS World | AnyLogic6 | AnyLogic7 |
|---|---|---|---|
| Среднее время поступления заявок 20 мин | |||
| Выполнено заявок типа 1 | 56,592 | 56,221 | 55,849 |
| $$\Delta_{1} = \left | 56,592-55,849 \right | = 0,743$$ | |||
| ремонтов: вида 11 | 28,398 | 28,069 | 28,075 |
| вида 12 | 14,158 | 14,152 | 13,889 |
| вида 13 | 14,036 | 14 | 13,885 |
| Выполнено заявок типа 2 | 84,227 | 84,74 | 84,592 |
| $$\Delta_{2} = \left | 84,227-84,592 \right | = 0,355$$ | |||
| ремонтов: вида 21 | 42,087 | 42,513 | 42,411 |
| вида 22 | 21,196 | 21,285 | 21,026 |
| вида 23 | 20,974 | 20,942 | 21,155 |
| Выполнено заявок типа 3 | 70,679 | 70,586 | 70,377 |
| $$\Delta_{3} = \left | 70,679-70,377 \right | = 0,302$$ | |||
| ремонтов: вида 31 | 35,256 | 35,072 | 35,147 |
| вида 32 | 17,671 | 17,659 | 17,662 |
| вида 33 | 17,752 | 17,855 | 17,568 |
| Выполнено заявок типа 4 | 70,244 | 70,486 | 70,421 |
| $$\Delta_{4} = \left | 70,244-70,421 \right | = 0,177$$ | |||
| ремонтов: вида 41 | 35,112 | 34,974 | 35,344 |
| вида 42 | 17,757 | 17,696 | 17,491 |
| вида 43 | 17,375 | 17,816 | 17,586 |
| Вероятность выполнения всех заявок | 0,979 | 0,98 | 0,98 |
| $$\Delta_{5} = \left | 0,979-0,979 \right | = 0,001$$ | |||
| Коэффициенты использования: мастеров 1 | 0,932 | 0,949 | 0,947 |
| мастеров 2 | 0,874 | 0,893 | 0,891 |
| мастеров 3 | 0,667 | 0,646 | 0,641 |
| мастеров 4 | 0,772 | 0,796 | 0,793 |
| $$\Delta_{6} = \left | 0,932-0,947 \right | = 0,015$$ | |||
| Коэффициент использования диспетчеров | 0,998 | 0,999 | 0,996 |
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.