С помощью какого оператора задается емкость памяти gpss
Метка – это символьный адрес перехода. Метка обязательно начинается с буквы и помещается в первый столбец. В шестом столбце записывается операция, состоящая из названия программного блока. Далее через пробел записываются операнды. В качестве операндов фигурируют СЧА, численные значения функций, соотношения. Если операндов несколько, между ними ставится пробел или запятая. После операндов пишутся комментарии. Поле операндов от комментария отделяется точкой с запятой.
1. GENERATE (генерировать).
Программный блок предназначен для создания ТА с соответствующим набором атрибутов. Программный блок имеет только выход.
Формат: GENERATE A, B, C, D
В поле A записывается математическое ожидание интервала следования транзактов ().
В поле B записывается величина отклонения случайной величины от математического ожидания (). По умолчанию отклонение равно 0. Так заполняется поле B в случае равномерного закона распределения.
В поле C устанавливается время появления на выходе генератора 1-го транзакта (t1).
В поле D записывается число транзактов, которое должен сформировать генератор.
В случае, если закон отличается от равномерного, генератор задается в следующем формате. Например, генератор с экспоненциальным распределением (l=0,25) и с использованием генератора случайных чисел RN1 запишется в виде:
2. TRANSFER (передать).
Оператор предназначен для имитации правил и условий обслуживания. С помощью этого оператора ТА можно передавать в различные программные блоки модели.
Формат: TRANSFER A, B, C, D
В поле A ставится условие (режим) передачи.
В поле B указывается номер следующего блока по условию. В поле C указывается номер блока, в который должен перейти ТА, если блок, указанный в поле B, занят. В поле D записывается индекс, используемый в условии «ALL».
Описание условий в поле A.
1. По этому условию «Пробел» ТА
передаётся в блок, указанный в поле B, (безусловный переход). Если блок занят, ТА остаётся в предыдущем блоке.
2. .N - по этому условию через N- десятичное число записывается вероятность, с которой ТА будет переходить в блок, указанный в поле C.
3. «ALL» - по этому условию ТА пытается войти в блок B, если он занят, то в B+D, если тот занят, то в B+2D и т.д. до C.
4. «BOTH» - ТА пытается войти в блок B, если он занят, то в блок C,
если блок C занят, то остаётся в предыдущем блоке.
Пример: 1. TRAN , МM1
Безусловная передача блоку с меткой ММ1.
2. TRAN .300,ММ1,ММ2
С вероятностью 0.7 ТА будут переданы блоку с меткой ММ1 и с вероятностью 0.3 в блок ММ2.
3. SEIZE (занять).
С помощью оператораSEIZE производится ввод ТА в устройство, имитирующее обслуживание.
В поле A указывается номер или имя устройства.
4. ADVANCE (задержать).
Блок имитирует обслуживание путём выделения транзакту определённого времени нахождения в блоке.
Формат: ADVAСЕ A, B
В поле A устанавливается математическое ожидание времени обслуживания. В поле B – разброс времени обслуживания (аналогично блоку GENERATE).
Пример: 1. ADVAСЕ 7, 2
Транзакт будет оставаться в блоке от 5 до 9 единиц времени.
2. ADVAСЕ (Exponential (1,0,70)).
Транзакт будет задержан в среднем на время, равное 70 единиц времени.
5. QUEUE (встать в очередь).
Оператор имитирует постановку ТА в очередь.
Формат: QUEUЕ A, B
В поле A – имя очереди или её номер.
В поле B – число одновременно вводимых транзактов в очередь. По умолчанию 1.
6. DEPART (покинуть очередь).
Оператор предназначен для вывода ТА из очереди.
Формат: DEPART A, B
A – имя очереди; B – число выводимых ТА (по умолчанию 1).
7. RELEASE (освободить устройство, реализовать).
Оператор предназначен для вывода из устройства обслуженного ТА.
Формат: RELEASE A
В поле A – имя или номер устройства.
8. TEST ( сравнение двух СЧА).
Оператор используется для передачи управления (ТА) по результатам сравнения двух СЧА.
Формат: TEST R A, B, C.
В поле R ставятся условия сравнения:
В полях A, B записываются СЧА, подлежащие сравнению.
Если условие поля R выполнимо, то ТА входит в блок TEST и далее по программе. Если условие не выполнено, ТА пытается войти в блок, указанный в поле C (метка перехода). Если блок C занят, то ТА не заходит в TEST, а ожидает выполнение условия.
9. MARK(отметить).
Блок записывает в параметр, указанный в поле А, значение текущего времени. Если поле А свободно, то в место времени создания ТА устанавливается текущее время.
Заменяет время входа транзакта в модуль на текущее значение.
Записывает текущее время в параметр 3.
10. TERMINAТE (завершить).
Блок предназначен для уничтожения транзактов, прошедших через модель.
Формат: TERMINAТE A
В поле A указывается число уничтоженных транзактов, а в дальнейшем число, вычитаемое из содержимого оператора START.
Примечание. Если в поле A «пробел», то ТА уничтожается, но при этом содержимое оператора START не уменьшается. Используется это в тех случаях, если в модели необходимо задать время моделирования Т. Выполняется это следующим образом. После оператора TERMINAТE с «пробелом» устанавливается группа операторов:
В поле Т записывается время моделирования (момент появления 1-го ТА).
Оператор START устанавливается в пункте меню Command/Start с указанием:
– числа прогонов модели,
– условия печати результатов (по умолчанию печатается стандартный отчёт, если стоит NP, печать отменяется)
– число прогонов, через которые осуществляется промежуточная распечатка результатов.
Работает START следующим образом. После каждого прогона из содержимого счетчика вычитается число, указанное в поле A оператора TERM. При достижении счетчика нулевого значения моделирование заканчивается и если есть разрешение, печатается отчёт.
Пример: 1. START 400
Выполнить модель до 400 прогонов с печатью стандартного отчета.
Выполнить модель до 100 прогонов и вывод отчета через каждые 10 завершений.
Функции служат для отображения зависимостей между двумя величинами.
В GPSS имеется группа из восьми стандартных (встроенных) функций RN$i, i = 1,…,8, при обращении к каждой из которых вычисляется непрерывная случайная величина, обозначаемая далее через Х, заданная на интервале (0, 1) и имеющая равновероятное распределение.
Эти функции можно использовать для получения значений случайных величин, распределенных по некоторому другому закону. Зависимость произвольно задаваемой случайной величины Y от Х следует в GPSS-программе представить в виде конечной последовательности значений пар «аргумент Х, функция У» по такой форме:
Имя_функции FUNCTION RN$i, тип_ функции [; комментарий]
Последовательность пар координат (точек), разделяемых знаком «/»
В GPSS предусмотрено два типа функций: непрерывные (Сn) и дискретные (Dn), где n — количество точек, задаваемых парами координат Х,Y. Графически непрерывная функция может быть представлена в виде последовательности прямолинейных отрезков, которые соединяют соседние точки на плоскости Х,Y, т.е. для непрерывной функции методом линейной интерполяции определяется значение Y в любой точке заданного интервала значений Х. Дискретная функция определена только в задаваемых точках.
Примеры.
дискретная функция F1, зависит от параметра 3 транзакта
0,5/1,9/2,4/3,10; параметр 3 принимает значения 0,1,2,3, функция F1 – 5,9,4,10
непрерывная функция F2 зависит от значений RN$1
.2,300/.5,700/1,1000; при RN$1, принимающим значения от 0 до 0.2, F2 получает значения от 0 до 300 в соответствии с линейной зависимостью Y от X
дискретная функция PP зависит от переменной номер 3: 2,V$4/3,V$5/6,FN$PUAS;
при V$3=2 значения функции PP вычисляются по формуле, записываемой для переменной V$4, при V$3=3 – по формуле, записываемой для переменной V$5, при V$3=6 функция РР принимает значение функции PUAS.
Переменные применяются для определения значений по формулам, состоящим из СЧА или СЛА и соответствующих операций. В GPSS-программе целочисленные и булевы переменные описываются оператором VARIABLE, а переменные с плавающей точкой – оператором FVARIABLE, которые имеют формат:
Общая схема программы на языке GPSS состоит из раздела объявлений, раздела операторов (блоков модели) и ряда управляющих операторов (обязательными из которых являются SIMULATE, START, END), располагающихся в следующем порядке:
[REALLOCATE]
Объявление имен
Объявление функций
Объявление переменных
Инициализация ячеек
Задание емкости памяти
SIMULATE
Последовательность блоков модели.
START
END
Далее рассматриваются особенности построения программ с учетом специфики языка GPSS и принципов моделирования дискретных систем во времени.
СЛУЧАЙНЫЕ ВЕЛИЧИНЫ В GPSS
Случайные величины в GPSS используются для задания времени появления транзакта в модели, т.е. для формирования потока заявок, поступающих в модель (блок GENERATE) и для задания времени задержки транзактов в модели (блок ADVANCE).
Основополагающими при анализе систем на уровне информационных потоков (систем массового обслуживания) в теории массового обслуживания являются случайные величины с экспоненциальным законом распределения (непрерывное распределение, например, интервала времени между заявками или времени задержки заявки в некотором блоке) и с пуассоновским законом распределения (дискретное распределение количества заявок, появляющихся за единицу времени).
Примечание
Пуассоновское распределение количества заявок за единицу времени (дискретное распределение) эквивалентно экспоненциальному распределению интервалов времени между заявками (непрерывное распределение).
Значения случайной непрерывной величины, распределенной по экспоненциальному закону с интенсивностью 1, в GPSS определяются с помощью функции, задаваемой точками, которые были рассчитаны по формуле y = 1- e x :
Exp1 FUNCTION RN$1,C14; Ехр1 – имя, С14-непрерывная, задаваемая 14 точками
0.,0./.1,.104/.3,.555/.5,.69/.6,.915/.7,1.2/.8,1.6/.85,1.95/.9,2.3/
.950,3./.98,3.9/.99,4.6/.995,5.3/.999,7.
При этом в качестве базового используется равновероятное распределение на интервале (0,1), задаваемое одной из восьми встроенных функций RN$i, i=1,2,…,8.
Для вычисления значения случайной непрерывной величины, распределенной по экспоненциальному закону с интенсивностью lambda, необходимо умножить lambda на Exp1. Умножение на константу lambda происходит непосредственно при выполнении программы в момент поступления транзакта в соответствующий блок.
GENER 25, FN$Exp1; генерируется поток заявок, имеющий пуассоновское распределение с интенсивностью lambda=1/25 или время появления транзакта равно 25*Exp1
ADVANCE 15,FN$Exp1; задается задержка транзакта 15*Exp1
Примечание
Однако если в поле В этих блоков задается не функция, а константа, то время задержки определяется как случайная величина, равномерно распределенная на интервале (А-В, А+В).
GENER 25, 15; генерируется поток заявок, появляющихся через интервалы
време ни, имеющие равномерное распределение на интервале (10; 40)
ADVANCE 15,FN$Exp1; задается задержка транзакта, значение которой выбирается из условий равновероятного распределения на интервале (8; 22).
ИМЕНА В GPSS-ПРОГРАММЕ
Имена в GPSS-программе могут задаваться как символами (идентификаторами), так и числовыми кодами – номерами. Для установления однозначного соответствия имен и номеров объектов в разделе «объявление имен» каждому имени присваивается номер по форме:
где имя содержит не более 6 символов и располагается с первой позиции. Объектам каждого типа принято назначать номера, начиная с первого.
СР1 EQU 1
UST EQU 2
OZU EQU 1
Q1 EQU 1
Q2 EQU 2
Exp1 EQU 1
ИМИТАЦИЯ ДИСКРЕТНОГО ПРОЦЕССА В GPSS
GPSS-модель представляет собой функционально законченную программу описания некоторого процесса обслуживания потока заявок, начиная от появления заявки в системе, что в модели соответствует генерации транзакта, до ее удаления из системы, что в модели соответствует удалению транзакта. Таким образом, операторная часть модели, называемая сегментом, начинается блоком GENERATE и заканчивается блоком TERMINATE.
Примечание
Структура строки GPSS-программы аналогична структуре строки программы на ассемблере:
[метка] имя_блока список_полей [; комментарий после символа “точка с запятой”]
* Строка-комментарий начинается с первой позиции символом “звездочка”’ *
Ниже приведен пример GPSS-программы, состоящей из одного сегмента, имитирующей обслуживание заявок в устройстве с неограниченной очередью заявок перед устройством.
*
REALL XAC, 150, FAC,1, QUE,1; Оператор управления задает в модели 150 *транзактов, одно устройство и одну очередь.
*объявление имен очереди, устройства и функции:
Q1 EQU 1
UST1 EQU 1
ЕХР EQU 1
*описание функции ЕХР:
*EXP FUNCTION RN$1, C24
0.0, 0.0 /.1, .104/.2,.222/.3, .355/.4,.509/.5, .69/.6, .915/.7,1.2/.75,1.38/.8,1.6 /.84,1.83/
.88,2.12/.9,2.3/.92,2.52/.94,2.81/.95,2.99/.96,3.2/.97,3.5/.98,3.9/.99,4.6/.995,5.3/.998,6.2/
.999,7/.9998,8
*
SIMULATE
* Операторная часть состоит из последовательности блоков модели :
GENERATE 5,3 ; генерируемые транзакты поступают в модель
* в случайные моменты времени, равновероятно распределенные на интервале 2..8
M1 QUEUE Q1; сбор статистики об ожидании транзактов в очереди Q1
* перед устройством UST1; метка должна занимать первую позицию строки
SEIZE UST1; вход транзакта в устройство UST1, если оно свободно
DEPART Q1 ; выход транзакта из очереди Q1
ADVANCE 4 , FN$ EXP; обслуживание транзакта в устройстве в течение
* некоторого случайного времени 4*FN$EXP, имеющего экспоненциальное
* распределение с интенсивностью (1/4)
RELEASE UST1; выход транзакта из устройства
TRANSFER .4, М1, М2; транзакт с вероятностью 0.4 переходит на М2,
* а с вероятностью 0.6 – на метку М1
М2 TERMINATE 1; транзакт уменьшает число завершений на 1 и при нулевом
START 50 ; значении числа завершений моделирование заканчивается
END
В этой программе длительность процесса моделирования определяется количеством транзактов, прошедших через блок TERMINATE. Но поскольку времена появления транзактов и обслуживания их в устройстве UST1 являются случайными величинами, то время моделирования также есть величина случайная, что неприемлемо при исследовании моделей.
Рассмотрим варианты задания длительности моделирования применением специально выделенного сегмента. Предполагается, что время моделирования определяется только этим сегментом, поэтому блоки завершения TERMINATE во всех остальных сегментах модели не должны иметь поля A и, следовательно, при прохождении транзактов через эти блоки счетчик завершения не меняется.
Во всех приведенных ниже примерах задаваемое время моделирования одно и то же и равно 1000 условных единиц времени.
* Сегмент 1: имитация процесса обслуживания заявок (повторение примера 3.1)
REALL XAC, 150, FAC,1, QUE,1
Q1 EQU 1
UST1 EQU 1
ЕХР EQU 1
*EXP FUNCTION RN$1, C24
0.0, 0.0 /.1, .104/.2,.222/.3, .355/.4,.509/.5, .69/.6, .915/.7,1.2/.75,1.38/.8,1.6 /.84,1.83/
.88,2.12/.9,2.3/.92,2.52/.94,2.81/.95,2.99/.96,3.2/.97,3.5/.98,3.9/.99,4.6/.995,5.3/.998,6.2/
.999,7/.9998,8
*
SIMULATE
GENERATE 5,3 ;
M1 QUEUE Q1
SEIZE UST1;
DEPART Q1 ;
ADVANCE 4 , FN$ EXP;
RELEASE UST1;
TRANSFER .4, М1, М2;
М2 TERMINATE
* Сегмент 2: задание времени моделирования
GENERATE 1000
TERMINATE 1
START 1
END
Примечание
В последующих трех примерах текст сегмента 1 опущен, так как полностью совпадает с примером 1.
* Сегмент 2: задание времени моделирования
GENERATE 200
TERMINATE 1
START 5
END
* Сегмент 2: задание времени моделирования
GENERATE 100
TERMINATE 2
START 20
END
* Сегмент 2: задание времени моделирования
GENERATE 10.
TERMINATE 1
START 100
END
Итак, время моделирования, задаваемое в примерах 1 – 4, одно и то же, равное 1000 условных единиц времени Однако длительность работы моделирующего алгоритма (процессорного времени компьютера) будет для этих вариантов различной: время работы ПЭВМ в последнем случае будет наибольшим, так как через каждые 10 единиц модельного времени возникает новый транзакт (выполняется подпрограмма блока GENERATE). Далее выполняется подпрограмма блока TERMINATE. Эти действия повторяются 100 раз, в то время как в примере 1 сегментом 2 задания времени моделирования создается только один транзакт, поступающий в блок TERMINATE через 1000 единиц модельного времени и останавливает процесс моделирования. Следовательно быстродействие модели в примере 1 будет наивысшим.
GPSS-модель представляет собой написанную на языке GPSS программу и включает в себя множество объектов, которые могут быть разбиты на 6 групп (рис.6.4):
· генераторы случайных чисел;
К основным объектам GPSS-модели относятся:
· операторы (блоки и команды) – основные объекты GPSS-модели, определяющие совокупность действий, которая должна быть выполнена в модели в соответствии с заданными в операторе параметрами, называемыми операндами;
· транзакты – динамические объекты, движущиеся в GPSS-модели от одного оператора (блока) к другому в заданной последовательности.
Объектами оборудования являются:
-· приборы (одноканальные устройства) – объекты, которые могут находиться в одном из двух состояний: свободном или занятом; при моделировании систем массового обслуживания используются для имитации процессов занятия и освобождения прибора, то есть для моделирования одноканальных СМО; занятие и освобождение прибора транзактом выполняется в GPSS-модели с помощью операторов SEIZE и RELEASE;
-· памяти (многоканальные устройства) – объекты, состоящие из множества элементов, которые занимаются и освобождаются транзактами, при этом один транзакт может занять один или несколько элементов памяти, но не более чем её ёмкость; при моделировании систем массового обслуживания «память» используется для имитации процессов занятия и освобождения приборов многоканальных СМО; ёмкость памяти задается в области описания GPSS-модели с помощью оператора STORAGE, а занятие и освобождение элементов «памяти» транзактом – с помощью операторов ENTER и LEAVE;
- очереди – объекты, используемые для накапливания транзактов, находящихся в состоянии ожидания какого-то события, например освобождения прибора или памяти; при моделировании систем массового обслуживания «очередь» используется для имитации процессов ожидания перед обслуживающими приборами; следует иметь в виду, что понятие «очередь» весьма относительное, поскольку в действительности транзакты, ожидающие освобождения прибора или памяти, заносятся в «список задержки» соответствующего прибора или памяти, при этом формирование списков задержки, то есть занесение в очередь и удаление из очереди, происходит автоматически, независимо от наличия операторов QUEUE и DEPART; последние используются только с целью сбора статистики по очередям путем фиксирования моментов поступления транзакта в очередь и удаления его из очереди;
-· логические ключи – объекты, которые могут находиться только в двух состояниях: «установлен» или «сброшен»; установка, сброс или инвертирование ключа осуществляется с помощью оператора LOGIC.
ВЫВОД
Объекты в GPSS-модели могут формироваться автоматически, либо должны объявляться с использованием специальных команд – операторов описания. К объявляемым объектам относятся: памяти, переменные, матрицы, таблицы, функции, а также параметры транзактов.
Написание этого мини туториала вместе с разработкой моделей заняло 6 часов чистого времени.
буду признателен если статья доберется до потенциально заинтересованных читателей.
Во избежания вызова негативных эмоций первоначальная картинка заменена на кота с трубкой и спрятана под спойлер.
Для начала нам понадобиться сам GPSS-World.
Мы будем использовать бесплатную версию для студентов.
Также при изучении языка имитационного моделирования будет полезен учебник
Можно взять вот этот .
На мой взгляд, не очень доступно, но лучше чем ничего.
Итак необходимым инструментарием мы запаслись, теперь осталось подключить фантазию и придумать первую модель.
Меня никак нельзя назвать гуру имитационного моделирования в целом и GPSS-World в частности, подосновой для примеров приведенных тут служили материалы из этой книги . Но думаю, что составляемые модели имеют право на жизнь.
Давайте для начала рассмотрим такой случай.
Дано:
Офис в котором работает 10 сотрудников, Кулер в конце коридора до которого «шкваркать 4 минуты», сотрудники которые желают испить чаю и совершают путешествие к кулеру один раз в час. Время наполнения чаши с пакетиком живительной влагой составляет примерно 2 минуты. Рабочий день составляет 480 минут (8 часов без перерыва на обед так сказать)
Определить:
Коэффициент использования кулера сотрудниками офиса.
Создадим имитационную модель
Поскольку комментарии я оставлял на своем ломаном английском, то безусловно вижу смысл детально рассказать о функционировании модели.
Строка 1 — GENERATE . 10 — сам по себе блок GENERATE задает нам количество входящих требований (в данном случае сотрудников офиса), запись операторов вида . 10 говорит нам о том что первые три параметра пропущены, а четвертый параметр указывает на максимальное количество входящих требований. Блок GENERATE. Можно задать и с другими параметрами, но об этом я расскажу немного позже.
Как вы догадались " ;" — отделяет поле комментария. Еще немного о конструкции оформления кода, код читается слева направо, есть несколько блоков, которые желательно разделять табуляцией. Самый левый блок это метка (аналогична метке в др. языках программирования), затем идет сам блок (например generate) затем обычно идут его параметры, затем комментарии. Когда-то давно нас учили разделять эти блоки табуляцией, но это скорее вопрос эстетики. 1 пробела кажется тоже достаточно что бы все запустилось. Кстати там где написано все БОЛЬШИМИ буквами, лучше так и писать, а то может вылететь ошибка при исполнении.
Строка 2 — ADVANCE 4,0.8; Отвечает за временные характеристики процесса, чтобы было понятней в данном случае это значит, что работник идет к кулеру 4 минуты ± 0.8 минуты.
Таким образом первая цифра означает затраченные единицы времени (итерации), вторая цифра означает отклонение в большую или меньшую сторону, в книгах написано что значение отклонения генерируется случайным образом, может это и так, но каждый перезапуск система выдает одинаковые значения (не знаю может быть есть аналог randomize из старого доброго паскаля, но я его не нашел).
Блок ADVANCE также можно задать с другими значениями, но об этом чуть позже.
Строка 3 — DRINK QUEUE STAND; — вот тут мы встречаем нашу первую метку DRINK, после которой следует блок QUEUE, который создает очередь в эту очередь у нас будут попадать все кто направляется к кулеру промочить горло,. STAND – это скажем так идентификатор очереди.
Строка 4 — SEIZE COOLER – блок SEIZE определяет свободно ли наше устройство, в данном случае идентификатор устройства COOLER (ну или попросту кулер).
Строка 5 DEPART STAND — если прошлый блок дал нам положительный результат (кулер свободен), то срабатывает следующий за ним блок DEPART, который обеспечивает выход человека из очереди STAND.
Строка 6 — ADVANCE 2,0.8 человек, который вышел из очереди будет наливать себе примерно 2 минуты кипяток в кружку (ну плюс успеет поболтать с людьми в очереди к кулеру)
Строка 7 — RELEASE COOLER, сделав свое «мокрое» дело, человек освободит устройство COOLER, для следующего страждущего.
Строка 8 — ADVANCE 60,10 – данный блок учитывает время. Которое человек испивший воды, затратит на то чтобы собраться с силами и прийти к кулеру еще раз (по крайней мере я надеюсь, что моделируется именно это).
Строка 9 — TRANSFER ,DRINK – «И повторится все, как встарь» — сказал бы А. Блок, если бы был знаком с программированием. Данный оператор обеспечивает переход на метку DRINK.
Строка 10 – GENERATE 480 казалось бы с точки зрения программирования после перехода на метку в прошлом блоке, все что лежит ниже не имеет смысла, но это не так.(а почему так, я если честно не сильно вникал, но судя по опыту и выпадающим ошибкам, этот кусок воспринимается немного вне контекста предыдущих 8 блоков). Главное, что данный блок задает нам время выполнения всей модели, а именно 480 минут (8 часов)
Строка 11 — TERMINATE 1 – Этот бок вычитает из каждой счетчика итераций единицу. Без этого блока можно уйти в бесконечный цикл.
Строка 12 — START 1 – Говорит программе с какого момента цикла начать, мы начинаем с первой минуты.
Ух, ну вот мы и закончили с описанием первой модели.
Кому интересны результаты, прошу под спойлер. Если вы любите все проверять самостоятельно то еще раз напомню все модели выложены на GItHub
проанализируем результаты
Итак мы видим, что в среднем наш кулер загружен на 33%, то есть в нашей команде из 10 сотрудников получается примерно так как если бы к нему постоянно прикладывался Администратор Петр, Марья Васильевна из бухгалтерии и Менеджер проекта Василий Чуфыркин, ну и еще 0.33 человека, или например — кот. На самом деле этот блок текста не несет смысловой нагрузки, мне просто очень хотелось нарисовать кота и кулер и Марью Васильевну из бухгалтерии (все кроме кота личности сугубо выдуманные)
Хотя черт побери после того как я прочел это, могу смело утверждать, что кулер мог бы напоить 12 милых котиков =)
Но вернемся к теме.
Давайте рассмотрим, результаты выдачи.
Facility – это список всех наших работающих устройств, в данном случае только кулер.
Entries 79 – означает число подходов на обслуживание к устройству, в данном случае число человек с пустыми чашками составило 79 – за всю рабочую смену.
Util – коэффициент использования оборудования, Он говорит нам о том, что кулер бездествовал (1-0.33)*100%=67% всего времени.
AVE. TIME – среднее время использования кулера 1 человеком 2.002 минуты
AVAIL. – Доступность кулера, не знаю что это значит видимо еденица говрит, что он был доступен
DELAY = 0 – говрит нам о том, что чсло людей которые просто подошли к кулеру, расстроились и ушли с пустыми руками (кружкой), равно нулю.
Теперь переедем к нашей очереди (QUEUE)
Как видите тут указано имя созданной нами ранее очереди,
В которой максимально находилось 9 человек, в которую было 79 входов, и 48 нулевых входов (по всей видимости входов без ожидания в очереди), среднее время проведенное человеком в очереди равно 1.5 минуты. Cont. = 0 говорит нам о том, что на момент окончания моделирования в очереди никого не было.
Ну вот вроде бы все не плохо, но что будет если мы вернемся в сытый 2006
Год и наймем еще 30 сотрудников в наш офис?
Как видно из модели, наш кулер почти перестанет простаивать, а среднее время в очереди составит аж 20 минут, что наводит на мысли либо о том, что нужен второй кулер, либо о том, что пора всех лишать премии за долгие чаепития.
Может быть данная модель, простовата, но даже она при проявлении некоторой фантазии позволяет нам оценить количество кулеров которое необходимо на этаже.
Но на текущий момент мы с вами еще не умеем, разрабатывать многоканальные модели обслуживания. Так убьем же двух зайцев, научимся многоканальному обслуживанию и заодно ответим на вопросов, которым мы с коллегой задались в самом начале статьи. (кто внимательный и помнит — молодец, тому счастья добра и безпохмельных выходных: )
При создании модели операторы call центра и абоненты, зададимся такими условиями
Дано:
2 оператора техподдержки обслуживают пользовталей, которые звонят пимерно раз в две минуты, Если один оператор занят трубку берет другой. Рабочий день составляет 480 минут (8 часов без перерыва на обед так сказать)
Определить:
Коэффициент загруженности сотрудников службы поддержки.
Как и в прошлый раз опишу построчно
Строка 1 — HELPDESK STORAGE 2 – Создаем накопитель Служба поддержки емкостью 2 сотрудника
Строка 2 — GENERATE 6,3; вот мы и подошли к другому способу задачи блока генерации, в даннмо случае цифра 6 означает что примерно раз в 6 мнут появляется 1 звонок, цифра 3 означает что отклонения от шести минут составлят ± 1.5 минуы. Еще блок GENERATE можно было задать так
(Exponential(1,0,6)), вообще то что справедливо для ADVANCE, во многом справедливо и для GENERATE.
Строка 3 – ADVANCE (Exponential(1,0,2)),, — говорит нам о том сколько времени у звонящего уходит на то чтобы вспомнить телефон тех поддержки и набрать номер, а уходит у нас в среднем 2 минуты по экспоненциальному распределению. цифра 1 – выбирает генератор случайных чисел (от 1-7 как с ними работать я не разобрался), цифра 0 – определяет смещение (пока для меня тоже загадка), цифра 2 собственно минуты. Хочу добавить что существуют и другие законы распределения, по которым можно задать временной промежуток, но о них лучше почитать в учебнике. Который я указал вначале статьи.
Строка 4 — ENTER HELPDESK – вход в накопитель (входящий звонок)
Строка 5 — TRANSFER ALL,OPR1,OPR2,3 – говорит нам что данное событие обрабатывается для всех входящих вызовов (ALL), что операторы обработки начинаются с метки OPR1 и движутся с шагом в 3 блока пока не доберутся до метки OPR2
Строка 6 — OPR1 SEIZE OP1 — вот и наш первая метка, на которой происходит проверка занятости первого оператора службы поддержки (OP1)
Строка 7 — ASSIGN 1,OP1 – В случае если оператор 1 свободен. То мы передаем входящий звонок ему, если нет то через три строки (от 6-й) идем на строку 9
Строка 8 — TRANSFER ,COME — нет нужды узнавать о занятости второго оператора, переходим на метку COME
Строка 9 OPR2 SEIZE OP2 — если первый оператор был занят, проверяем второго
Строка 10 — - ASSIGN 1,OP2 – и отдаем звонок ему.
Строка 11 — COME LEAVE HELPDESK – звонок покидает накопитель служб поддержки
Строка 12 — ADVANCE 10,8 – время которое оператор затрачивает на то чтобы дать человеку совет как правильно вкрутить лампочку.
Строка 13 — RELEASE P1; — оператор помог человеку и освободился. P1 в данном случае это ссылка на некий указатель (или параметр ), этот момент я не могу объяснить, но он работает.
Строка 14 – TERMINATE – (ноль можно не писать по умолчанию и так ноль), если верить справки то в данном случае этот блок расскажет системе о том, что пора выводить эту итерацию из активного цикла и переходить к следующей. В любом случае без него система выдаст нам ошибку.
Строки 15- 17 аналогичны строкам первой модели.
В результате получим следующие данные
Структура вывода похожа на структуру вывода первой модели, разве что вместо очереди — накопитель предлагаю вам с ней разобраться самостоятельно. Кстати параметры генерации отчета можно настроить (на этом компьютере у меня не установлен GPSS и нет желания его ставить, поэтому поверьте пока на слово, что в настройках программы есть такая возможность ну, а я если не забуду допишу в понедельник сюда, как это сделать)
Итак, мы видим, что наши операторы вполне приемлемо загружены примерно на 75% и 87 % соответственно. Будем считать, что двух операторов вполне достаточно, чтобы посоветовать людям как правильно вкрутить лампочку. Но мы же с вами — народ любопытный, давайте посмотрим, что будет если к ребятам подсадить еще одно нахлебника с телефоном.
Для этого рассмотрим немного модифицированную модель. Предлагаю вам разобраться с ней самостоятельно.
Результат под спойлером
Что же в итоге мы видим, что третий оператор нам явно не нужен и можно смело идти и убирать вакансию, а вместе с ней и всех кандидатов.
На последок хочется вам рассказать о том, что GPSS-WORLD представляет более обширные возможности для моделирования, чем те о которых я вам поведал. Просто ввиду ограниченности моих знаний я не могу вам их адекватно продемонстрировать. Но, тем не менее в качестве бонуса приведу пример работы с переменными
Давайте опять построчно
Строка 1 — INITIAL X$APPLES,3 ;1 задаем значение переменной, X$ в данном случае нам как-то указывает на название переменной, а цифра три это значение которое мы запишем в переменю APPLES (кстати я не фанат продукции APPLE просто в тот момент на общем столе лежало 3 яблока, а одно я забрал себе, прям как в детсадовских задачах по математике)
Строка – 2 GENERATE 1 – создадим 1 итерацию
Строка 3 — SAVEVALUE APPLES-,1; – сохраним в переменную яблоки ее значение минус один.
Строки 4-5 помогут нам закончить программу.
Если честно не смотря на то, что данный пример работает и из переменной действительно вычитается единица, полного механизма работы с переменными я не понимаю, поэтому оставлю на откуп профессионалам.
Ну что же теперь вы знаете об одном из инструментов с помощью, которого можно создать имитационную модель процесса, инструмент не самый удобный и уже похоже не дорабатываемый разработчиками, но тем не менее если вы проявите фантазию то за один два дня сможете провести исследование какой-нибудь модели и например опубликовать его в научном журнале или на конференции (об этом я уже писал раньше )
В любом случае теперь у вас есть еще 1 инструмент, чтобы творить, развиваться и делать мир лучше. Право слово это интереснее чем лопать шарике на смартфоне, сидя в общественном транспорте.
Всем хороших выходных, счастья добра и удачи :)
Читайте также: