мод сис / V.Boev-GPSSvsAnyLogic
.pdfФирма предоставления ремонтных услуг представляет собой многофазную многоканальную систему массового обслуживания разомкнутого типа с отказами.
Исходя из структуры, модель предоставления ремонтных услуг должна состоять из следующих сегментов:
ввода исходных данных; источника заявок; диспетчеров; мастеров;
учѐта выполненных ремонтов.
Заявки на ремонт должны иметь следующие параметры (поля): типЗ — код типа заявки; видР — вид ремонта;
времяР — время выполнения одного вида ремонта; Как уже отмечалось, интервалы между соседними заявками
подчинены экспоненциальному закону. Принято, что за время 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 ремонтов соответственно.
361
Поскольку эти данные накапливаются за все прогоны модели, то для получения средних значений они делятся на количество прогонов колПрог. Например, выпЗаявТип1=выпЗаявТип1/ колПрог.
По этим же статистическим данным рассчитываются:
верВыпЗаяв1 … верВыпЗаяв4, верВыпЗаяв — вероят-
ности выполнения заявок 1…4 типов и заявок всех типов.
Например, верВыпЗаяв1=выпЗаявТип1/постЗаявТип1.
8.1.5. Ввод исходных данных
Элементы для ввода исходных данных разместим на диаграмме класса Main.
20.Выполните команду Файл/Создать/Модель на панели инструментов. Откроется диалоговое окно Новая модель.
21.В поле Имя модели диалогового окна Новая модель вве-
дите Рем_услуги. Выберите каталог, в котором будут сохранены файлы модели.
22.Щелкните Далее. На второй странице Мастера создания модели выберите Начать создание модели «с нуля». Щелкните Далее.
23.Создайте область просмотра для размещения исходных данных на диаграмме класса Main. Из палитры Презентация перетащите элемент Область просмотра. Перейдите на страницу Ос-
новные панели Свойства. В поле Имя: введите Данные.
24. Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
25.Выберите режим масштабирования из выпадающего спи-
ска Масштабирование: Подогнать под окно.
26.Перейдите на страницу Дополнительные панели Свойст-
ва. Введите в поля X: 0, Y: 650, Ширина: 610, Высота: 590.
27.Из палитры Презентация перетащите элемент Скруглѐнный прямоугольник. Оставьте имя, предложенное системой. В прямоугольнике мы разместим элементы для ввода исходных данных и вывода результатов моделирования.
28.Перейдите на страницу Дополнительные панели Свойст-
ва. Введите в поля X: 10, Y: 670, Ширина: 590, Высота: 560. 29. Перетащите элемент text и на странице Основные панели
Свойства в поле Текст: введите Исходные данные.
362
Рис. 8.2. Размещение элементов Параметр и Простая переменная
30.В Палитре выделите Основная. Перетащите элементы
Параметр на элемент Скругленныѐ прямоугольник. Разместите их так, как показано на рис. 8.2.
31.Значения свойств установите согласно табл. 8.1. Во всех элементах установите флажок Отображать имя. Тип элементов с
именами колДисп, колМастеров1…колМастеров4 установите int. Тип остальных — double.
Имена параметров оставлены практически такими же, как в постановке задачи на разработку имитационной модели. По рис. 8.2 нельзя определить, например, в Т11 русская буква Т или английская. Поэтому принимайте решение сами. Тем не менее, лучше все имена давать на одном языке.
363
|
|
|
Таблица 8.1 |
|
|
|
|
|
|
|
Элементы и их свойства |
|
||
Параметр |
Параметр |
|||
Имя |
Значение |
Имя |
Значение |
|
по умолчанию |
по умолчанию |
|||
|
|
|||
|
|
|
|
|
Tp |
30 |
T1 |
15 |
|
n |
4 |
To1 |
2 |
|
T11 |
30 |
p11 |
0.50 |
|
T12 |
40 |
p12 |
0.75 |
|
T13 |
50 |
p13 |
1.00 |
|
T21 |
20 |
p21 |
0.50 |
|
T22 |
30 |
p22 |
0.75 |
|
T23 |
40 |
p23 |
1.00 |
|
T31 |
15 |
p31 |
0.50 |
|
T32 |
25 |
p32 |
0.75 |
|
T33 |
35 |
p33 |
1.00 |
|
T41 |
25 |
p41 |
0.50 |
|
T42 |
35 |
p42 |
0.75 |
|
T43 |
45 |
p43 |
1.00 |
|
колПрог |
1000 |
колДисп |
2 |
|
колМастеров1 |
2 |
колМастеров3 |
1 |
|
колМастеров2 |
1 |
колМастеров4 |
1 |
|
8.1.6.Вывод результатов моделирования
1.На Область просмотра мы уже перетащили Скруглен-
ный прямоугольник. На нѐм мы будем также размещать, как отмечалось ранее, элементы для вывода результатов моделирования.
2.Перетащите на него элемент text и на странице Основные
панели Свойства в поле Текст: введите Результаты моделирования. Поместите этот текст посредине в нижней части эле-
мента Скругленный прямоугольник.
3. Из палитры Основная перетащите элементы Простая переменная. Разместите их и дайте им имена согласно рис. 8.2. Тип всех переменных double.
8.1.7. Построение событийной части модели
Строить событийную часть модели будем последовательной реализацией средствами AnyLogic выделенных ранее сегментов
(см. п. 8.1.4):
источники заявок;
364
диспетчеры; мастера;
учѐт выполненных заявок.
1. Создайте область просмотра для размещения элементов модели на диаграмме класса Main. Из палитры Презентация перетащите элемент Область просмотра. Перейдите на страницу Основные панели Свойства. В поле Имя введите МодРемУслуги.
2. Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
3.Выберите режим масштабирования из выпадающего спи-
ска Масштабирование: Подогнать под окно.
4.Перейдите на страницу Дополнительные панели Свойст-
ва. Введите в поля X: 0, Y: 0, Ширина: 1240, Высота: 460.
5.Из палитры Презентация перетащите элемент Прямоугольник. Оставьте имя, предложенное системой. В прямоугольнике мы разместим объект source для имитации поступления заявок.
6.Перейдите на страницу Дополнительные панели Свойст-
ва. Введите в поля X: 20, Y: 120, Ширина: 100, Высота: 140.
7. Перетащите элемент text на прямоугольник и на странице
Основные панели Свойства в поле Текст: введите Источники заявок.
8.Перетащите ещѐ один элемент Прямоугольник. Оставьте имя, предложенное системой. В этом прямоугольнике мы разместим объекты сегмента Диспетчеры для имитации работы диспетчеров.
9.Перейдите на страницу Дополнительные панели Свойст-
ва. Введите в поля X: 130, Y: 30, Ширина: 590, Высота: 410. 10. Перетащите элемент text на прямоугольник и на странице
Основные панели Свойства в поле Текст: введите Диспетчеры.
На рис. 8.3 показаны объекты двух сегментов: Источники заявок и Диспетчеры. Приступим к их построению.
8.1.7.1. Сегмент Источники заявок
1. Из Основной библиотеки перетащите объект source на прямоугольник с названием Источники заявок ( см. рис. 8.3).
2. В панели Проект щелкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
365
366
3.Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса Заявка.
4.В поле Базовый класс: выберите из выпадающего списка
Entity в качестве базового класса. Щелкните Далее.
5. Появится вторая страница Мастера создания Java класса. Добавьте следующие поля Java класса:
double типЗ; double видР; double времяР;
6.Оставьте выбранными флажки Создать конструктор и Создать метод toString ().
7.Щелкните кнопку Готово. Вы увидите редактор кода и
вавтоматически созданный код вашего Java класса. Закройте код.
8.Выделите объект source. На странице Основные панели
Свойства уберите флажок Отображать имя. В полях Класс за-
явки: и Новая заявка Entity замените Заявка.
Установите:
Заявки прибывают согласно Времени между прибытиями
Время между прибытиями exponential(1/(Tp/n))
Количество заявок, прибывающих за один раз 1
Действие при выходе entity.типЗ=uniform(); entity.видР=uniform();
Java-кодом в поля entity.типЗ и entity.видР заносятся равномерно распределѐнные случайные числа. Они нужны далее для розыгрыша кодов типов заявок и кодов видов ремонта.
8.1.7.2. Сегмент Диспетчеры
Сегмент Диспетчеры предназначен для распределения по группам мастеров заявок согласно их типам и видам ремонта в зависимости от занятости мастеров в текущий момент времени.
Данный сегмент реализуется шестью объектами selectOutput5, восемью объектами selectOutput, объектами queue, delay и sink
(см. рис. 8.3).
1. Перетащите указанные объекты (или, перетащив один, скопируйте остальные, но перед копированием измените свойства, общие для всех копируемых объектов, например, класс заявки Заявка) из Основной библиотеки на диаграмму класса Main. Соедините их так, как показано на рис. 8.3.
367
2. Установите свойства объектов согласно табл. 8.2.
Таблица 8.2
Свойства |
Значение |
|
|
Имя |
типЗаявки |
Использовать |
Условия |
Условие 0 |
entity.типЗ<=p1 |
Действие при выходе 0 |
entity.типЗ=1; |
|
постЗаявТип1++; |
|
постЗаявТип++; |
Условие 1 |
entity.типЗ<=p2 |
Действие при выходе 1 |
entity.типЗ=2; |
|
постЗаявТип2++; |
|
постЗаявТип++; |
Условие 2 |
entity.типЗ<=p3 |
Действие при выходе 2 |
entity.типЗ=3; |
|
постЗаявТип3++; |
Условие 3 |
постЗаявТип++; |
Действие при выходе 3 |
entity.типЗ<=p4 |
|
|
|
entity.типЗ=4; |
|
постЗаявТип4++; |
|
постЗаявТип++; |
Имя |
oтказ |
Выход true выбирается |
C заданной вероятностью |
Вероятность [0..1] |
0.98 |
Имя |
поТипамЗаяв |
Использовать |
Условия |
Условие 0 |
entity.типЗ==1 |
Условие 1 |
entity.типЗ==2 |
Условие 2 |
entity.типЗ==3 |
Условие 3 |
entity.типЗ==4 |
Имя |
видРемЗаяв1 |
Использовать |
Условия |
Условие 0 |
entity.видР<=p11 |
Действие при выходе 0 |
entity.видР=1; |
|
entity.времяР=exponential(1/T11); |
Условие 1 |
entity. видР<=p12 |
Действие при выходе 1 |
entity.видР=2; |
|
entity.времяР=exponential(1/T12); |
Условие 2 |
entity.видР=<p13 |
Действие при выходе 2 |
entity.видР=3; |
|
entity.времяР=exponential(1/T13); |
|
|
368
|
Продолжение табл. 8.2 |
|
|
Свойства |
Значение |
|
|
Имя |
видРемЗаяв2 |
Использовать |
Условия |
Условие 0 |
entity.видР<=p21 |
Действие при выходе 0 |
entity.видР=1; |
|
entity.времяР=exponential(1/T21); |
Условие 1 |
entity. видР<=p22 |
Действие при выходе 1 |
entity.видР=2; |
|
entity.времяР=exponential(1/T22); |
Условие 2 |
entity.видР=<p23 |
Действие при выходе 2 |
entity.видР=3; |
|
entity.времяР=exponential(1/T23); |
|
|
Имя |
видРемЗаяв3 |
Использовать |
Условия |
Условие 0 |
entity.видР<=p31 |
Действие при выходе 0 |
entity.видР=1; |
|
entity.времяР=exponential(1/T31); |
Условие 1 |
entity. видР<=p32 |
Действие при выходе 1 |
entity.видР=2; |
|
entity.времяР=exponential(1/T32); |
Условие 2 |
entity.видР=<p33 |
Действие при выходе 2 |
entity.видР=3; |
|
entity.времяР=exponential(1/T33); |
|
|
Имя |
видРемЗаяв4 |
Использовать |
Условия |
Условие 0 |
entity.видР<=p41 |
Действие при выходе 0 |
entity.видР=1; |
|
entity.времяР=exponential(1/T41); |
Условие 1 |
entity. видР<=p42 |
Действие при выходе 1 |
entity.видР=2; |
|
entity.времяР=exponential(1/T42); |
Условие 2 |
entity.видР=<p43 |
Действие при выходе 2 |
entity.видР=3; |
|
entity.времяР=exponential(1/T43); |
|
|
Имя |
свобМастер1_2 |
Выход true выбирается |
При выполнении условия |
Условие |
(очМастеров1.size()==0)&& |
|
(мастера1.size()<колМастеров1)&& |
|
(мастера2.size()!=0) |
|
|
369
|
Окончание табл. 8.2 |
|
|
Свойства |
Значение |
Имя |
свобМастер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) |
Вместимость |
колДисп |
Объектом типЗаявки разыгрывается код типа заявки. Например, в поступившей заявке entity.типЗ=0.723. Проверяется условие 0: entity.типЗ=0.723<=p1=0.5. Условие 0 не вы-
370
