Самоучитель gpss world: GPSS-WORLD основы имитационного моделирования на живых примерах / Хабр

GPSS-WORLD основы имитационного моделирования на живых примерах / Хабр

Доброй пятницы уважаемые читатели Хабра.
В данном посте я предлагаю вам бегло ознакомиться с возможностью создания имитационной модели процессов в программе GPSS-WORLD. Данный пост нельзя считать полноценным туториалом, но я поделюсь с Вами теми крупицами, что знаю и вполне возможно что уже через пол часа после прочтения статьи Вы проявив фантазию создадите свою собственную имитационную модель. Как говориться в народе: «Тяжело в учении легко в бою».
И пусть местами, данный «туториал» придерживается принципа: «битый не битого везет», но я всё же донесу до вас те знания, которые у меня есть, ну а вы уж сами вольны решать, стоить ли мне доверять или лучше проверять. В любом случае я буду рад аудиту кода от знатоков GPSS-WORLD. Все материалы статьи размещены на GItHub
Изучать самые азы будем сразу на живых примерах — доступных, понятных и близких сердцу многим сотрудникам проводящим свои законные 8 часов в офисах.


От конкретики перейдем к лирике, пятница традиционно располагает задаваться безумными вопросами, и в этот раз мы с моим коллегой DrZugrik задались вопросом: «Сколько нужно сотрудников тех поддержки, чтобы рассказать, как вкрутить лампочку?».
За подробностями сего мысленного эксперимента прошу под кат.

Написание этого мини туториала вместе с разработкой моделей заняло 6 часов чистого времени.
буду признателен если статья доберется до потенциально заинтересованных читателей.

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

первоначальная иллюстрация


Для начала нам понадобиться сам GPSS-World.

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

Итак необходимым инструментарием мы запаслись, теперь осталось подключить фантазию и придумать первую модель.
Меня никак нельзя назвать гуру имитационного моделирования в целом и GPSS-World в частности, подосновой для примеров приведенных тут служили материалы из этой книги . Но думаю, что составляемые модели имеют право на жизнь.
Давайте для начала рассмотрим такой случай.
Дано:
Офис в котором работает 10 сотрудников, Кулер в конце коридора до которого «шкваркать 4 минуты», сотрудники которые желают испить чаю и совершают путешествие к кулеру один раз в час. Время наполнения чаши с пакетиком живительной влагой составляет примерно 2 минуты. Рабочий день составляет 480 минут (8 часов без перерыва на обед так сказать)
Определить:
Коэффициент использования кулера сотрудниками офиса.

Создадим имитационную модель

	GENERATE	,,,10		; 1  Amount office staff
	ADVANCE	4,0.8		; 2  Time to reach the cooler	 
DRINK	QUEUE	STAND	       ; 3  Queue to the cooler.  input	
	SEIZE	COOLER	       ; 4  Verification of employment cooler
	DEPART	STAND		; 5  Queue to the cooler. output
	ADVANCE	2,0.8		; 6  Filling the cup with boiling water
	RELEASE	COOLER		; 7  leave the cooler
	ADVANCE	60,10		; 8  Time for tea, time to work, time to get back to the cooler				
	TRANSFER	,DRINK		; 9  Go back to the cooler
	GENERATE	480		; 10 Working day (minutes)
	TERMINATE	1		; 11 Minus one minute
	START	1		; 12 Start from the first minute

Поскольку комментарии я оставлял на своем ломаном английском, то безусловно вижу смысл детально рассказать о функционировании модели.
Строка 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

результаты Модель 1 — коэффициент использования кулера

проанализируем результаты
Итак мы видим, что в среднем наш кулер загружен на 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 сотрудников в наш офис?

результаты Модель 1 — коэффициент использования кулера при 40 сотрудниках

Как видно из модели, наш кулер почти перестанет простаивать, а среднее время в очереди составит аж 20 минут, что наводит на мысли либо о том, что нужен второй кулер, либо о том, что пора всех лишать премии за долгие чаепития.
Может быть данная модель, простовата, но даже она при проявлении некоторой фантазии позволяет нам оценить количество кулеров которое необходимо на этаже.

Но на текущий момент мы с вами еще не умеем, разрабатывать многоканальные модели обслуживания. Так убьем же двух зайцев, научимся многоканальному обслуживанию и заодно ответим на вопросов, которым мы с коллегой задались в самом начале статьи. (кто внимательный и помнит — молодец, тому счастья добра и безпохмельных выходных: )

При создании модели операторы call центра и абоненты, зададимся такими условиями
Дано:
2 оператора техподдержки обслуживают пользовталей, которые звонят пимерно раз в две минуты, Если один оператор занят трубку берет другой. Рабочий день составляет 480 минут (8 часов без перерыва на обед так сказать)
Определить:
Коэффициент загруженности сотрудников службы поддержки.

HELPDESK        STORAGE       2	        			 ;1   Number of operators helpdesk
**************************************************************************************************
	GENERATE        6,3					 ;2   The number of subscribers Ticket
	ADVANCE         (Exponential(1,0,2)),,			 ;3   during dialing
          ENTER            HELPDESK              			 ;4   incoming call
	TRANSFER         ALL,OPR1,OPR2,3       			 ;5   definition of operator availability
OPR1      SEIZE            OP1                               ;6   Verification of employment operator number 1
	ASSIGN          1,OP1                              ;7   If the operator is free in this case, accept a call
	TRANSFER        ,COME                              ;8   Jump to the process of service
OPR2      SEIZE            OP2                               ;9   Verification of employment operator number 1. 
	ASSIGN          1,OP2                              ;10  If the operator is free in this case, accept a call
COME      LEAVE            HELPDESK                          ;11  Beginning the process of providing technical support
	ADVANCE         10,8              			 ;12  Service time
	RELEASE          P1                                ;13  The release of the operator
	TERMINATE       0                      			 ;14  Removes the Active Transaction from the simulation
	GENERATE        480                                ;15  Working day (minutes)
	TERMINATE       1                                  ;16  Minus one minute
	    START           1                                  	 ;17  Start from the first minute

Как и в прошлый раз опишу построчно

Строка 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 аналогичны строкам первой модели.

В результате получим следующие данные

результаты Модель 2 — коэффициент использования операторов


Структура вывода похожа на структуру вывода первой модели, разве что вместо очереди — накопитель предлагаю вам с ней разобраться самостоятельно. Кстати параметры генерации отчета можно настроить (на этом компьютере у меня не установлен GPSS и нет желания его ставить, поэтому поверьте пока на слово, что в настройках программы есть такая возможность ну, а я если не забуду допишу в понедельник сюда, как это сделать)
Итак, мы видим, что наши операторы вполне приемлемо загружены примерно на 75% и 87 % соответственно. Будем считать, что двух операторов вполне достаточно, чтобы посоветовать людям как правильно вкрутить лампочку. Но мы же с вами — народ любопытный, давайте посмотрим, что будет если к ребятам подсадить еще одно нахлебника с телефоном.
Для этого рассмотрим немного модифицированную модель. Предлагаю вам разобраться с ней самостоятельно.

HELPDESK        STORAGE       3	        			 ;1   Number of operators helpdesk
**************************************************************************************************
	GENERATE        6,3					 ;2   The number of subscribers Ticket
	ADVANCE         (Exponential(1,0,2)),,			 ;3   during dialing
          ENTER            HELPDESK              			 ;4   incoming call
	TRANSFER         ALL,OPR1,OPR3,3       			 ;5   definition of operator availability
OPR1      SEIZE            OP1                               ;6   Verification of employment operator number 1
	ASSIGN          1,OP1                              ;7   If the operator is free in this case, accept a call
	TRANSFER        ,COME                              ;8   Jump to the process of service
	SEIZE            OP2                               ;9   Verification of employment operator number 1.
	ASSIGN          1,OP2                              ;10   If the operator is free in this case, accept a call
	TRANSFER        ,COME                              ;11   Jump to the process of service
OPR3      SEIZE            OP3                               ;12   Verification of employment operator number 1. 
	ASSIGN          1,OP3                              ;13  If the operator is free in this case, accept a call
COME      LEAVE            HELPDESK                          ;14  Beginning the process of providing technical support
	ADVANCE         10,8              			 ;15  Service time
	RELEASE          P1                                ;16  The release of the operator
	TERMINATE       0                      			 ;17  Removes the Active Transaction from the simulation
	GENERATE        480                                ;18  Working day (minutes)
	TERMINATE       1                                  ;19  Minus one minute
	START           1                                  ;20  Start from the first minute

Результат под спойлером

результаты Модель 2 — коэффициент использования трех операторов


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

На последок хочется вам рассказать о том, что GPSS-WORLD представляет более обширные возможности для моделирования, чем те о которых я вам поведал. Просто ввиду ограниченности моих знаний я не могу вам их адекватно продемонстрировать. Но, тем не менее в качестве бонуса приведу пример работы с переменными

	INITIAL X$APPLES,3		;1 Set Variable
	GENERATE	1		;2 set count of cicles
	SAVEVALUE APPLES-,1		;3 set APPLES=APPLES-1
	TERMINATE 1		;4 delete one iteration
	START	1		;5 1 Start from the first cicle

Давайте опять построчно

Строка 1 — INITIAL X$APPLES,3 ;1 задаем значение переменной, X$ в данном случае нам как-то указывает на название переменной, а цифра три это значение которое мы запишем в переменю APPLES (кстати я не фанат продукции APPLE просто в тот момент на общем столе лежало 3 яблока, а одно я забрал себе, прям как в детсадовских задачах по математике)
Строка – 2 GENERATE 1 – создадим 1 итерацию
Строка 3 — SAVEVALUE APPLES-,1; – сохраним в переменную яблоки ее значение минус один.
Строки 4-5 помогут нам закончить программу.

результаты Модель 3 — переменные


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

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

GPSS-WORLD основы имитационного моделирования на живых примерах

Доброй пятницы уважаемые читатели Хабра.
В данном посте я предлагаю вам бегло ознакомиться с возможностью создания имитационной модели процессов в программе GPSS-WORLD. Данный пост нельзя считать полноценным туториалом, но я поделюсь с Вами теми крупицами, что знаю и вполне возможно что уже через пол часа после прочтения статьи Вы проявив фантазию создадите свою собственную имитационную модель. Как говориться в народе: «Тяжело в учении легко в бою».
И пусть местами, данный «туториал» придерживается принципа: «битый не битого везет», но я всё же донесу до вас те знания, которые у меня есть, ну а вы уж сами вольны решать, стоить ли мне доверять или лучше проверять. В любом случае я буду рад аудиту кода от знатоков GPSS-WORLD. Все материалы статьи размещены на GItHub
Изучать самые азы будем сразу на живых примерах доступных, понятных и близких сердцу многим сотрудникам проводящим свои законные 8 часов в офисах.
От конкретики перейдем к лирике, пятница традиционно располагает задаваться безумными вопросами, и в этот раз мы с моим коллегой DrZugrik задались вопросом: «Сколько нужно сотрудников тех поддержки, чтобы рассказать, как вкрутить лампочку?».
За подробностями сего мысленного эксперимента прошу под кат.

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

Для начала нам понадобиться сам GPSS-World.

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

Итак необходимым инструментарием мы запаслись, теперь осталось подключить фантазию и придумать первую модель.
Меня никак нельзя назвать гуру имитационного моделирования в целом и GPSS-World в частности, подосновой для примеров приведенных тут служили материалы из этой книги . Но думаю, что составляемые модели имеют право на жизнь.
Давайте для начала рассмотрим такой случай.
Дано:
Офис в котором работает 10 сотрудников, Кулер в конце коридора до которого «шкваркать 4минуты», сотрудники которые желают испить чаю и совершают путешествие к кулеру один раз в час. Время наполнения чаши с пакетиком живительной влагой составляет примерно 2 минуты. Рабочий день составляет 480 минут (8 часов без перерыва на обед так сказать)
Определить:
Коэффициент использования кулера сотрудниками офиса.
Создадим имитационную модель

	GENERATE	,,,40		; 1  Amount office staff
	ADVANCE	4,0.8		; 2  Time to reach the cooler	 
DRINK	QUEUE	STAND	       ; 3  Queue to the cooler. input	
	SEIZE	COOLER	       ; 4  Verification of employment cooler
	DEPART	STAND		; 5  Queue to the cooler. output
	ADVANCE	2,0.8		; 6  Filling the cup with boiling water
	RELEASE	COOLER		; 7  leave the cooler
	ADVANCE	60,10		; 8  Time for tea, time to work, time to get back to the cooler				
	TRANSFER	,DRINK		; 9  Go back to the cooler
	GENERATE	480		; 10 Working day (minutes)
	TERMINATE	1		; 11 Minus one minute
	START	1		; 12 Start from the first minute

Поскольку комментарии я оставлял на своем ломаном английском, то безусловно вижу смысл детально рассказать о функционировании модели.
Строка 1 — GENERATE ,,,10 — сам по себе блок GENERATE задает нам количество входящих требований (в данном случае сотрудников офиса), запись операторов вида ,,,10 говорит нам о том что первые три параметра пропущены, а четвертый параметр указывает на максимальное количество входящих требований. Блок GENERATE. Можно задать и с другими параметрами, но об этом я расскажу немного позже.
Как вы догадались » ;» — отделяет поле комментария. Еще немного о конструкции оформления кода, код читается слева направо, есть несколько блоков, которые желательно разделять табуляцией. Самый левый блок это метка (аналогична метке в др. языках программирования), затем идет сам блок (например generate) затем обычно идут его параметры, затем комментарии. Когда-то давно нас учили разделять эти блоки табуляцией, но это скорее вопрос эстетики. 1 пробела кажется тоже достаточно что бы все запустилось. Кстати там где написано все БОЛЬШИМИ буквами, лучше так и писать, а то может вылететь ошибка при исполнении.
Строка 2 — ADVANCE 4,0.8; Отвечает за временные характеристики процесса, чтобы было понтней в данном случае это значит, что работник идет к кулеру 4 минуты ± 0.4 минуты.
Таким образом первая цифра означает затраченные единицы времени (итерации), вторая цифра означает половину отклонения в большую или меньшую сторону, в книгах написано что значение отклонения генерируется случайным образом, может это и так, но каждый перезапуск система выдает одинаковые значения (не знаю может быть есть аналог randomize из старого доброго паскаля, но я его не нашел). Блок ADVANCE также можно задать с другими значениями, но об этом чуть позже.
Строка 3 — DRINK QUEUE STAND; — вот тут мы встречаем нашу первую метку DRINK, после которой следует блок QUEUE, который создает очередь в эту очередь у нас будут попадать все кто направляется к кулеру промочить горло,. STAND – это скажем так идентификатор очереди.
Строка 4 — SEIZE COOLER – блок SEIZE определяет свободно ли наше устройство, в данном случае идентификатор устройства COOLER (ну или попросту кулер).
Строка 5 DEPART STAND — если прошлый блок дал нам положительный результат (кулер свободен), то срабатывает следующий за ним блок DEPART, который обеспечивает выход человека из очереди STAND.
Строка 6 — ADVANCE 2,0.8 человек, который вышел из очереди будет наливать себе примерно минуты кипяток в кружку (ну плюс успеет поболтать с людьми в очереди к кулеру)
Строка 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

результаты Модель 1 — коэффициент использования кулера

проанализируем результаты
Итак мы видим, что в среднем наш кулер загружен на 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 сотрудников в наш офис?

результаты Модель 1 — коэффициент использования кулера при 40 сотрудниках

Как видно из модели, наш кулер почти перестанет простаивать, а среднее время в очереди составит аж 20 минут, что наводит на мысли либо о том, что нужен второй кулер, либо о том, что пора всех лишать премии за долгие чаепития.
Может быть данная модель, простовата, но даже она при проявлении некоторой фантазии позволяет нам оценить количество кулеров которое необходимо на этаже.
Но на текущий момент мы с вами еще не умеем, разрабатывать многоканальные модели обслуживания. Так убьем же двух зайцев, научимся многоканальному обслуживанию и заодно ответим на вопросов, которым мы с коллегой задались в самом начале статьи. (кто внимательный и помнит — молодец, тому счастья добра и безпохмельных выходных: )
Также мы можем увидеть среднее время ожидания в очереди к кулеру — полторы минуты
Зададимся такими условиями
Дано:
2 оператора техподдержки обслуживают пользовталей, которые звонят пимерно раз в две минуты, Если один оператор занят трубку берет другой. Рабочий день составляет 480 минут (8 часов без перерыва на обед так сказать)
Определить:
Коэффициент загруженности сотрудников службы поддержки.

HELPDESK        STORAGE       2	        			 ;1   Number of operators helpdesk
**************************************************************************************************
	GENERATE        6,3					 ;2   The number of subscribers Ticket
	ADVANCE         (Exponential(1,0,2)),,			 ;3   during dialing
          ENTER            HELPDESK              			 ;4   incoming call
	TRANSFER         ALL,OPR1,OPR2,3       			 ;5   definition of operator availability
OPR1      SEIZE            OP1                               ;6   Verification of employment operator number 1
	ASSIGN          1,OP1                              ;7   If the operator is free in this case, accept a call
	TRANSFER        ,COME                              ;8   Jump to the process of service
OPR2      SEIZE            OP2                               ;9   Verification of employment operator number 1. 
	ASSIGN          1,OP2                              ;10  If the operator is free in this case, accept a call
COME      LEAVE            HELPDESK                          ;11  Beginning the process of providing technical support
	ADVANCE         10,8              			 ;12  Service time
	RELEASE          P1                                ;13  The release of the operator
	TERMINATE       0                      			 ;14  Removes the Active Transaction from the simulation
	GENERATE        480                                ;15  Working day (minutes)
	TERMINATE       1                                  ;16  Minus one minute
	    START           1                                  	 ;17  Start from the first minute

Как и в прошлый раз опишу построчно

Строка 1 — HELPDESK STORAGE 2 – Создаем накопитель Служба поддержки емкостью 2 сотрудника
Строка 2 — GENERATE 6,3; вот мы и подошли к другому способу задачи блока генерации, в даннмо случае цифра 6 означает что примерно раз в 6 мнут появляется 1 звонок, цифра означает что отклонения от шести минут составлят ± 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 аналогичны строкам первой модели.

В результате получим следующие данные

результаты Модель 2 — коэффициент использования операторов

Структура вывода похожа на структуру вывода первой модели, разве что вместо очереди — накопитель предлагаю вам с ней разобраться самостоятельно. Кстати параметры генерации отчета можно настроить (на этом компьютере у меня не установлен GPSS и нет желания его ставить, поэтому поверьте пока на слово, что в настройках программы есть такая возможность ну, а я если не забуду допишу в понедельник сюда, как это сделать)
Итак, мы видим, что наши операторы вполне приемлемо загружены примерно на 75% и 87 % соответственно. Будем считать, что двух операторов вполне достаточно, чтобы посоветовать людям как правильно вкрутить лампочку. Но мы же с вами — народ любопытный, давайте посмотрим, что будет если к ребятам подсадить еще одно нахлебника с телефоном.
Для этого рассмотрим немного модифицированную модель. Предлагаю вам разобраться с ней самостоятельно.

HELPDESK        STORAGE       3	        			 ;1   Number of operators helpdesk
**************************************************************************************************
	GENERATE        6,3					 ;2   The number of subscribers Ticket
	ADVANCE         (Exponential(1,0,2)),,			 ;3   during dialing
          ENTER            HELPDESK              			 ;4   incoming call
	TRANSFER         ALL,OPR1,OPR3,3       			 ;5   definition of operator availability
OPR1      SEIZE            OP1                               ;6   Verification of employment operator number 1
	ASSIGN          1,OP1                              ;7   If the operator is free in this case, accept a call
	TRANSFER        ,COME                              ;8   Jump to the process of service
	SEIZE            OP2                               ;9   Verification of employment operator number 1.
	ASSIGN          1,OP2                              ;10   If the operator is free in this case, accept a call
	TRANSFER        ,COME                              ;11   Jump to the process of service
OPR3      SEIZE            OP3                               ;12   Verification of employment operator number 1. 
	ASSIGN          1,OP3                              ;13  If the operator is free in this case, accept a call
COME      LEAVE            HELPDESK                          ;14  Beginning the process of providing technical support
	ADVANCE         10,8              			 ;15  Service time
	RELEASE          P1                                ;16  The release of the operator
	TERMINATE       0                      			 ;17  Removes the Active Transaction from the simulation
	GENERATE        480                                ;18  Working day (minutes)
	TERMINATE       1                                  ;19  Minus one minute
	START           1                                  ;20  Start from the first minute

Результат под спойлером

результаты Модель 2 — коэффициент использования трех операторов

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

На последок хочется вам рассказать о том, что GPSS-WORLD представляет более обширные возможности для моделирования, чем те о которых я вам поведал. Просто ввиду ограниченности моих знаний я не могу вам их адекватно продемонстрировать. Но, тем не менее в качестве бонуса приведу пример работы с переменными

	INITIAL X$APPLES,3		;1 Set Variable
	GENERATE	1		;2 set count of cicles
	SAVEVALUE APPLES-,1		;3 set APPLES=APPLES-1
	TERMINATE 1		;4 delete one iteration
	START	1		;5 1 Start from the first cicle

Давайте опять построчно

Строка 1 — INITIAL X$APPLES,3 ;1 задаем значение переменной, X$ в данном случае нам как-то указывает на название переменной, а цифра три это значение которое мы запишем в переменю APPLES (кстати я не фанат продукции APPLE просто на столе в тот момент на общем лежало 3 яблока, а одно я забрал себе, прям как в детсадовских задачах по математике)

Строка – 2 GENERATE 1 – создадим 1 итерацию
Строка 3 — SAVEVALUE APPLES-,1; – сохраним в переменную яблоки ее значение минус один.
Строки 4-5 помогут нам закончить программу.

результаты Модель 3 — переменные

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

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

Автор: BosonBeard

Источник

Урок 1 — Программа GPSS World

Блоки и транзакции

Моделирование GPSS состоит из сети «Блоков», которые представляют собой действия или задержки, с которыми сталкивается набор «Транзакций», которые «входят» в один Блок, затем следующий. Вся симуляция представляет собой просто последовательность входа одной транзакции в один или несколько блоков, затем другую транзакцию и так далее.

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

Блоки и транзакции — это только два из нескольких типов объектов GPSS. Как правило, когда транзакция входит в блок, некоторая операция выполняется над третьим объектом. Например, запись транзакции в блок SEIZE приводит к тому, что транзакция становится «владельцем» объекта GPSS, называемого средством обслуживания. Объекты Facility обычно используются для представления ресурсов с одним владельцем.

Первые несколько уроков в этом руководстве не связаны с действием конкретных блоков. Вы начнете изучать небольшое их подмножество в Уроке 5. После того, как вы начнете чувствовать себя комфортно с основными методами моделирования, вы должны понять, что остальные блоки могут сделать для вас. Они перечислены и обсуждаются в главе 7 Справочного руководства GPSS World. Однако вам нужно понять только несколько блоков GPSS, чтобы начать строить модели.

Пока не беспокойтесь о действии конкретных блоков. Мы начнем со знакомства со средой моделирования GPSS World, прежде чем подробно рассмотрим язык GPSS.

Итак, приступим. Если вы еще не установили GPSS World в своей 32-разрядной Windows-совместимой системе, обратитесь к Справочному руководству GPSS World и сделайте это. Если вы не используете студенческую версию GPSS World, вам потребуется получить числовой программный ключ для активации установки. Здесь мы предположим, что обо всем этом позаботились.

Обычно при установке GPSS World элемент помещается в меню «Пуск». На самом деле, он находится в подменю «Программы». Если вы предпочитаете настроить установку, добавив ярлык GPSS World на рабочий стол, это легко сделать. Для получения подробной информации обратитесь к документации по вашей операционной системе. В этом уроке мы будем использовать только меню «Пуск».

Чтобы запустить GPSS World, нажмите кнопку «Пуск», затем нажмите «Программы» и, наконец, нажмите «Версия GPSS World Xxxxx» в подменю, где Xxxxx означает «Студенческая» или «Коммерческая» или что-то еще. Вы открыли главное окно GPSS World.

Если вы получаете сообщения об ошибках, обратитесь к Разделу 2.1 Справочного руководства GPSS World. Если вы когда-нибудь столкнетесь с системной ошибкой GPSS World, обратитесь к главе 13

Справочного руководства GPSS World.

Рис. 1—1. Главное окно GPSS World

Существует два способа открыть объект модели. Вы можете дважды щелкнуть значок файла в папке Windows или начать с открытия главного окна GPSS World, как мы только что сделали, а затем использовать File/Open, как описано ниже.

Чтобы открыть файл модели, вам нужно перейти в папку Samples. Папка Samples расположена следующим образом:

C:\Program Files\Minuteman Software\GPSS World …\Sample Model Files

Теперь давайте приступим к изучению некоторых функций вашего нового программного обеспечения.

ВЫБЕРИТЕ Файл/Открыть

Рис. 1—2. Меню «Файл» главного окна

из меню. Появится диалоговое окно, подобное показанному ниже.

Рис. 1—3. Диалог открытия файла

Окна GPSS World описаны в главах 2 и 5 справочного руководства GPSS World. Если хотите, можете сослаться на этот материал. Вам не нужно это, чтобы закончить этот урок. В конце этой главы приведено описание различных выпадающих меню, расположенных в верхней части главного окна GPSS World. Выбор элементов из этих меню приводит к открытию диалоговых окон, в которые вы будете вводить запрашиваемую информацию с помощью клавиатуры или мыши. Эти меню также позволяют выполнять команды.

Теперь продолжим. Дважды щелкните папку Samples. Вы увидите список доступных файлов примеров моделей GPSS World. Дважды щелкните значок, чтобы открыть SAMPLE1.GPS. Возможно, вам придется использовать полосу прокрутки в диалоговом окне «Открыть файл», чтобы найти SAMPLE1.GPS в папке SAMPLES.

ВЫБЕРИТЕ ОБРАЗЕЦ1

ВЫБЕРИТЕ Открыть

Рис. 1—4. Окно модели — текстовое представление SAMPLE1.GPS

Теперь файл SAMPLE1.GPS должен отображаться в окне модели. Вы заметите, что в отличие от DOS версии Minuteman для GPSS (GPSS/PCTM), GPSS World игнорирует любые номера строк в текстовых строках.

Однако GPSS World использует порядковые номера строк, назначаемые полноэкранным текстовым редактором, для идентификации Заявления, связанного с ошибками и другими условиями. Вам не нужно беспокоиться об этом. Позже вы можете использовать пункт меню Search / Go To Line… для перехода к определенной текстовой строке

в окне модели.

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

Основное окно является отправной точкой для GPSS World. Вы можете использовать его меню для отображения текстового представления вашего объекта модели в окне модели. Из него вы создаете отдельный объект моделирования, и с этого момента все взаимодействия видны в окне журнала или окнах объектов, которые являются представлениями объекта моделирования. Утверждения в объекте модели должны быть «переведены», чтобы создать соответствующий объект моделирования.

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

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

Воспользуемся меню «Файл», чтобы сохранить модель в файл с другим именем.

ВЫБЕРИТЕ Файл / Сохранить как

и когда появится диалоговое окно, введите имя файла TMP в выделенной области, которая в настоящее время говорит SAMPLE1. Затем

SELECT Save

Имя файла в верхней части окна модели изменится на TMP. Экран будет выглядеть так, как показано ниже.

Рис. 1—5. Диалоговое окно «Сохранить как»

Файл, аналогичный SAMPLE1.GPS, отображается в окне модели. Давайте добавим блок BUFFER после блока GENERATE. С помощью мыши поместите курсор в любое место в строке Queue Barber, переместив указатель мыши в нужное место и щелкнув один раз.

ВЫБЕРИТЕ РЕДАКТИРОВАНИЕ/ВСТАВИТЬ СТРОКУ

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

БУФЕР ТИПОВ

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

ВЫБЕРИТЕ Edit/Settings

Вы увидите страницу Simulate в блокноте настроек модели. Варианты подробно обсуждаются в записной книжке настроек модели в главе 2 справочного руководства GPSS World.

Оставим параметры страницы моделирования такими, какие они есть.

НАЖМИТЕ Отчеты

Рис. 1—6. Страница отчета Блокнота параметров модели

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

ВЫБЕРИТЕ OK

, чтобы выйти из Блокнота настроек.

Когда вы создаете симуляцию, автоматически открывается окно журнала. Он будет записывать любые взаимодействия или сообщения, созданные GPSS World.

Давайте создадим симуляцию.

ВЫБЕРИТЕ команду / Создать симуляцию

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

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

ВЫБЕРИТЕ Окно / Окно моделирования / Окно блоков

Рис. 1—7. Детальный вид окна блоков

Детальный вид блоков появится в новом окне, которое теперь появляется поверх окна модели и окна журнала. Помните, что вы можете изменить размер и положение любого окна. Также, щелкнув в любом месте окна, вы можете вывести любое окно на передний план, сделав его активным окном. Остановитесь, чтобы просмотреть окна Windows, если вы не уверены в манипуляциях с окнами. Здесь стоит упомянуть один полезный прием.

Если вы решили просто посмотреть в окно блоков, вы теперь будете смотреть на недетальный вид блоков в модели. Это окно будет обновляться в режиме онлайн по мере выполнения имитации. Теперь в меню Вид.

НАЖМИТЕ Сведения о сущности

Рис. 1—8. Недетальный вид окна блоков.

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

ВЫБЕРИТЕ Просмотр

НАЖМИТЕ НА Сведения об объекте

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

Давайте теперь введем интерактивную команду START 300.

ВЫБЕРИТЕ команду / СТАРТ

в главном меню главного окна GPSS World. Когда появится диалоговое окно СТАРТ, замените 1.

ВВЕДИТЕ 300

и

ВЫБЕРИТЕ OK

НАЖМИТЕ В любом месте окна блоков

, чтобы увидеть модель в окне. Теперь закройте окно.

ДВОЙНОЙ щелчок по значку блока в верхнем левом углу окна блоков, чтобы закрыть окно.

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

Моделирование должно завершиться быстро. Вы увидите, что окно отчета открывается автоматически, когда симуляция заканчивается. Объекты отчета обычно создаются, когда число завершений моделирования достигает нуля. Увеличьте окно, чтобы изучить содержимое отчета. Вы должны увидеть что-то вроде окна, показанного ниже.

Рис. 1—9. Окно отчета со стандартным отчетом

На этом этапе давайте распечатаем отчет. Если у вас нет принтера, просто пропустите эту часть.

ВЫБЕРИТЕ Файл/Печать

Убедитесь, что выбран правильный принтер и активно окно отчета.

ВЫБЕРИТЕ OK

Помните, что во время моделирования держите открытыми только те окна, которые активно просматриваете. Если вы закончили работу с окном и оно больше не понадобится, закройте его. Команды меню «Окно/Плитка» и «Окно/Каскад» иногда бывают полезны, чтобы привести в порядок

много окон.

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

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

Сворачиваем окно журнала.

НАЖМИТЕ В любом месте окна журнала

, чтобы сделать его активным окном.

НАЖМИТЕ Левую кнопку в группе из трех справа от строки заголовка окна журнала Теперь давайте вернем ее.

НАЖМИТЕ на первую или вторую кнопку справа от свернутого окна

Вы видите, как легко было открыть окно.

Давайте посмотрим. Мы открыли файл модели и сохранили объект модели GPSS World после изменения его настроек и структуры. Мы создали объект симуляции и использовали два представления в окне блоков, чтобы наблюдать за транзакциями, циркулирующими в симуляции. Мы свернули окно журнала. Наконец, мы распечатали и изучили стандартный отчет в объекте отчета. В следующий раз мы будем моделировать клиентов, приходящих в парикмахерскую.

Давайте закончим сессию. В главном окне GPSS World, в Главном меню,

НАЖМИТЕ НА Файл

затем

GPSS-WORLD основы моделирования на живых примерах / Хабр

Доброй пятницы дорогие читатели Хабра.
В этом посте я предлагаю вам быстро ознакомиться с возможностью создания имитационного моделирования процессов в программе GPSS-МИР. Этот пост нельзя считать полноценным туториалом, но я поделюсь с вами теми крупицами, которые знаю и вполне возможно, что уже через полчаса после прочтения статьи у вас появится фантазия для создания собственной имитационной модели. Как говорят в народе: «Трудно в бою учиться легко».
И местами этот «учебник» придерживается принципа: «битому не везет», но я все равно донесу до вас те знания, которые у меня есть, а вы сами вольны решать, доверять мне или лучше проверить. В любом случае буду рад провести аудит кода у экспертов GPSS-WORLD. Все материалы статьи размещены на GitHub
Изучаем азы сразу на живых примерах — доступно, понятно и близко сердцу многих сотрудников, проводящих свои законные 8 часов в офисах.
От конкретики перейдем к лирике, у Пятницы традиционно есть бредовые вопросы, и в этот раз мы с коллегой DrZugrik задались вопросом: «Сколько вам нужно работников службы поддержки, чтобы рассказать мне, как вкрутить лампочку ?»
Подробности этого мысленного эксперимента прошу под кат.

Написание этого мини-учебника вместе с разработкой модели заняло 6 часов чистого времени.
Буду признателен, если статья дойдет до потенциально заинтересованных читателей.

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

начальная иллюстрация


Для начала нам понадобится сам GPSS-World.

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

Вот мы и запаслись необходимыми инструментами, теперь осталось подключить фантазию и придумать первую модель.
Меня нельзя назвать гуру моделирования вообще и GPSS-World в частности, материалы из этой книги послужили основой для представленных здесь примеров. Но я думаю, что составленные модели имеют право на жизнь.
Рассмотрим сначала этот случай.
Дано:
Офис, в котором работают 10 сотрудников, Кулер в конце коридора, до которого «лает 4 минуты», сотрудники, которые хотят попить чай и совершают поход к кулеру раз в час. Время наполнения чаши пакетиком живительной влаги составляет примерно 2 минуты. Рабочий день 480 минут (так сказать 8 часов без перерыва на обед)
Определить:
Коэффициент использования кулера офисным персоналом.
Создать имитационную модель

 СОЗДАТЬ ,10 ; 1 Количество сотрудников офиса
ПРОДВИЖЕНИЕ 4,0,8 ; 2 Время добраться до кулера
НАПИТОК ОЧЕРЕДЬ СТЕНД ; 3 Очередь к холодильнику.  вход
ЗАГРУЗИТЬ ОХЛАДИТЕЛЬ ; 4 Проверка работоспособности кулера
СТАНДАРТ ОТПРАВЛЕНИЯ; 5 Очередь к холодильнику. выход
ПРОДВИЖЕНИЕ 2,0,8 ; 6 Наполнение чашки кипятком
ВЫПУСКНОЙ ОХЛАДИТЕЛЬ ; 7 оставить кулер
ПРОДВИЖЕНИЕ 60,10 ; 8 Время пить чай, время работать, время возвращаться к холодильнику
ТРАНСФЕР, НАПИТОК; 9Вернитесь к кулеру
СОЗДАТЬ 480 ; 10 Рабочий день (минут)
КОНЕЦ 1 ; 11 Минус одна минута
СТАРТ 1 ; 12 Начать с первой минуты
 

Так как комментарии я оставлял на своем ломаном английском, то конечно вижу смысл подробно рассказать о функционировании модели.
Строка 1 — GENERATE,10 — сам блок GENERATE задает нам количество поступающих требований (в данном случае офисных служащих), запись операторов вида ,10 говорит нам о том, что первые три параметра отсутствуют , а четвертый параметр указывает максимальное количество поступающих требований. СОЗДАТЬ блок. Можно задать и с другими параметрами, но об этом я расскажу чуть позже.
Как вы догадались «;» — Разделяет поле комментария. Еще немного о дизайне структуры кода, код читается слева направо, есть несколько блоков, которые желательно разделять табами. Крайний левый блок это метка (аналогично метке в других языках программирования), потом сам блок (например генерировать) потом обычно идут его параметры, потом комментарии. Когда-то нас учили разделять эти блоки табулированием, но это больше вопрос эстетики. 1 пробел вроде тоже достаточно что бы все запустилось. Кстати, там, где все написано БОЛЬШИМИ буквами, лучше так и писать, иначе может вылететь ошибка выполнения.
Строка 2 — РАСШИРЕНИЕ 4.0.8; Он отвечает за временные характеристики процесса, чтобы было понятнее в данном случае, это значит, что работник идет на кулер 4 минуты ± 0,4 минуты.
Таким образом, первая цифра означает единицы затраченного времени (итерации), вторая цифра означает половину отклонения в большую или меньшую сторону, в книгах написано, что значение отклонения генерируется случайным образом, возможно оно и есть, но при каждом перезапуске система выдает одно и то же values ​​(не знаю, может есть аналог randomize из старого доброго Паскаля, но я его не нашел). Блок ADVANCE также может быть установлен с другими значениями, но об этом позже.
Строка 3 — СТОЙКА ДЛЯ ВЫПИТКИ; — здесь мы встречаем нашу первую метку DRINK, за которой следует блок QUEUE, который создает очередь в этой очереди, мы заставим всех, кто идет к кулеру, мочить горло. STAND — допустим идентификатор очереди.
Строка 4 — SEIZE COOLER — блок SEIZE определяет свободно ли наше устройство, в данном случае идентификатор устройства — COOLER (ну или просто кулер).
Line 5 DEPART STAND — если последний блок дал нам положительный результат (cooler free), то срабатывает следующий блок DEPART, который обеспечивает выход человека из очереди STAND.
Строка 6 — ADVANCE 2.0.8 вышедший из очереди человек нальет себе в кружку около 2х минут кипятка (ну плюс у него будет время поболтать с людьми в очереди к кулеру)
Строка 7 — RELEASE COOLER , сделав свое «мокрое» дело, человек освободит аппарат ХОЛОДИЛЬНИК, для следующих страждущих.
Строка 8 — ADVANCE 60.10 — этот блок учитывает время. Который человек, который выпил воды, приложит усилия, чтобы собраться с силами и снова прийти к кулеру (по крайней мере, я надеюсь, что это смоделировано).
Строка 9 — ТРАНСФЕР, ПИТЬЕ — «И все повторится, как прежде», — сказал бы А. Блок, если бы был знаком с программированием. Этот оператор обеспечивает переход к метке DRINK.
Строка 10 — GENERATE 480 Казалось бы, с точки зрения программирования, после перехода к метке в последнем блоке все, что лежит ниже, не имеет смысла, но это не так. (Почему бы и нет, если честно, я особо не углублялся, но судя по опыту и выпадению к ошибкам, этот кусок воспринимается немного вне контекста предыдущих 8 блоков). Главное, что этот блок задает нам время работы всей модели, а именно 480 минут (8 часов)
Строка 11 — TERMINATE 1 — Эта сторона вычитает единицу из каждого счетчика итераций. Без этого блока можно зайти в бесконечный цикл.
Строка 12 — СТАРТ 1 — Сообщает программе с чего начать цикл, начинаем с первой минуты.

Что ж, мы закончили с описанием первой модели.
Кому важны результаты, прошу под спойлер. Если любите все проверять сами, то еще раз напомню все выложенные на GitHub модели

Результаты Модель 1 — утилизация кулера

анализируем результаты
Итак видим, что в среднем наш кулер загружен на 33%, то есть в нашей команде из 10 сотрудников получается примерно как если бы Администратор Петр, Марья Васильевна из бухгалтерии и Руководитель проекта Василий Чуфиркин к нему постоянно обращались, ну 0,33 человека, или например — кот. На самом деле смысловой нагрузки этот блок текста не несет, просто очень хотелось нарисовать кота и кулера и Марью Васильевну из бухгалтерии (все кроме кота — чисто выдуманные личности)

Хотя блин после того как я это прочитал , могу смело сказать что кулер мог выпить 12 милых котов =)

Но вернемся к теме.

Посмотрим на результаты выдачи.

Facility это список всех наших рабочих устройств, в данном случае только кулер.
Записей 79 — означает количество подходов сервисного обслуживания к прибору, в данном случае количество человек с пустыми стаканами составило 79 — за всю смену.
Util — коэффициент использования оборудования. Это говорит нам о том, что кулер простаивал (1-0,33) * 100% = 67% всего времени.
AVE TIME — среднее время использования кулера 1 человеком 2,002 минуты
AVAIL. — Наличие кулера, не знаю, что это значит, видимо блок говорит о наличии
DELAY = 0 — говорит нам о том, что количество людей, которые только что подошли к кулеру, расстроились и остались пустыми- вручил (кружку), равен нулю.

Теперь перейдем к нашей очереди (QUEUE)
Как видите здесь указано имя созданной нами ранее очереди,
в которой было максимум 9человек, в котором было 79 входов, и 48 нулевых входов (скорее всего входы были без ожидания в очереди), среднее время пребывания человека в очереди составило 1,5 минуты. продолжение = 0 говорит нам, что в конце симуляции в очереди никого не было.

Ну, вроде бы все неплохо, но что будет, если вернуться к полному
году 2006 и нанять к нам в офис еще 30 сотрудников?

результаты Модель 1 — коэффициент использования кулера на 40 сотрудников

Как видно из модели, наш кулер практически перестанет простаивать, а среднее время в очереди составит целых 20 минут, что говорит о том, что либо нужен второй кулер, либо пора лишить каждому бонус за долгое чаепитие.
Может эта модель и деревенская, но даже она, при проявлении некоторого воображения, позволяет прикинуть количество кулеров, которое необходимо на этаже.
Но на данный момент мы пока не можем разрабатывать многоканальные модели обслуживания. Так что давайте убьем двух зайцев одним выстрелом, изучим многоканальный сервис и заодно ответим на вопросы, которые мы с коллегой задали в самом начале статьи. (кто внимателен и помнит — молодец, что счастье добра и выходные без похмелья 🙂

При создании модели операторы колл-центра и абоненты задают себе такие условия
Дано:
2 оператора технической поддержки обслуживают пользователей, которые звонят через равные промежутки времени каждые две минуты, если один оператор занят, поднимая трубку другого. Рабочий день 480 минут (8 часов без перерыва, так сказать)
Определить:
Коэффициент загрузки вспомогательного персонала.

 HELPDESK STORAGE 2 ;1 Количество операторов службы поддержки
******************************************************* ***************************************************
GENERATE 6,3 ;2 Количество подписчиков Билет
ADVANCE (Exponential(1,0,2)), ;3 во время набора
          ENTER HELPDESK ;4 входящий вызов
TRANSFER ALL,OPR1,OPR2,3 ;5 определение доступности оператора
OPR1 SEIZE OP1 ;6 Проверка занятости оператора №1
ASSIGN 1,OP1 ;7 Если в этом случае оператор свободен, принять вызов
ТРАНСФЕР , ПРИЕЗЖАЙ ;8 Перейти к процессу обслуживания
OPR2 ЗАХВАТ OP2 ;9Проверка занятости оператора №1.
ASSIGN 1,OP2 ;10 Если в этом случае оператор свободен, принять вызов
ПРИХОДИТЕ ПОКИНУТЬ HELPDESK ;11 Начало процесса оказания технической поддержки
ADVANCE 10,8 ;12 Время обслуживания
RELEASE P1 ;13 Освобождение оператора
TERMINATE 0 ;14 Удаляет активную транзакцию из моделирования. 
GENERATE 480 ;15 Рабочий день (минут)
TERMINATE 1 ;16 Минус одна минута
СТАРТ 1 ;17 Старт с первой минуты
 

Как и в прошлый раз опишу построчно

Строка 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 — ПЕРЕДАЧА ВСЕХ, ОПР1, ОПР2,3 — говорит нам, что это событие обрабатывается для всех входящих вызовов (ВСЕ), что операторы обработки начинают с метки OPR1 и двигаемся с шагом в 3 блока, пока не дойдут до метки OPR2
Строка 6 — OPR1 SEIZE OP1 — это наша первая метка, на которой проверяется проверка занятости первого оператора службы поддержки (OP1).
Строка 7 — НАЗНАЧЕНИЕ 1, OP1 — На случай, если оператор 1 свободен. Потом пропускаем на него входящий звонок, если нет то через три строчки (с 6-й) переходим на 9 строчку
Строка 8 — ПЕРЕДАЧА, ПРИХОДИТЕ — нет необходимости узнавать о занятости второго оператора, переходим на метку ПРИХОДИТЕ
Строка 9 ОПР2 ЗАРЕЗ ОП2 — если первый оператор был занят, проверяем второго
Строка 10 — ASSIGN 1, OP2 — и перезвоните ему.
Линия 11 — ПРИХОДИТЕ ВЫЙТИ HELPDESK — вызов покидает диск для службы поддержки.
Строка 12 — ADVANCE 10.8 — время, которое оператор тратит на то, чтобы дать человеку совет, как правильно вкрутить лампочку.
Строка 13 — ВЫПУСК P1; — оператор помог мужчине и освободился. P1 в данном случае — это ссылка на некий указатель (или параметр), я не могу объяснить этот момент, но он работает.
Строка 14 — TERMINATE — (нуль нельзя писать по умолчанию, и так ноль), если верить справке, то в этом случае этот блок сообщит системе, что пора убрать эту итерацию из активного цикла и двигаться дальше к следующему. В любом случае без него система выдаст нам ошибку.
Строки 15-17 аналогичны строкам первой модели.

В результате получаем следующие данные

результаты Модель 2 — коэффициент использования операторов


Структура вывода аналогична структуре вывода первой модели, за исключением того, что вместо очереди накопитель предлагает вы сами с этим справитесь. Кстати, параметры формирования отчета можно настроить (у меня GPSS на этом компе не установлен и ставить не хочу, так что поверьте пока на слово, что в настройках программы есть такая возможность, ну а если Не забуду, в понедельник добавлю сюда как это сделать)
Итак, мы видим, что наши операторы вполне приемлемы примерно на уровне 75% и 87% соответственно. Мы предполагаем, что двух операторов вполне достаточно, чтобы посоветовать людям, как правильно вкрутить лампочку. Но мы с вами люди любопытные, посмотрим, что будет, если добавить к ребятам еще одного нахлебника с телефоном.
Для этого рассмотрим немного модифицированную модель. Я предлагаю вам разобраться с этим самостоятельно.

 HELPDESK STORAGE 3 ;1 Количество операторов службы поддержки
******************************************************* ***************************************************
GENERATE 6,3 ;2 Количество подписчиков Билет
ADVANCE (Exponential(1,0,2)), ;3 во время набора
          ENTER HELPDESK ;4 входящий вызов
TRANSFER ALL,OPR1,OPR3,3 ;5 определение доступности оператора
OPR1 SEIZE OP1 ;6 Проверка занятости оператора №1
ASSIGN 1,OP1 ;7 Если в этом случае оператор свободен, принять вызов
ТРАНСФЕР , ПРИЕЗЖАЙ ;8 Перейти к процессу обслуживания
ЗАХВАТ OP2 ;9Проверка занятости оператора №1. 
ASSIGN 1,OP2 ;10 Если в этом случае оператор свободен, принять вызов
ТРАНСФЕР , ПРИЕЗЖАЙ ;11 Перейти к процессу обслуживания
OPR3 SEIZE OP3 ;12 Проверка занятости оператора №1.
ASSIGN 1,OP3 ;13 Если в этом случае оператор свободен, принять вызов
ПРИХОДИТЕ ПОКИНУТЬ HELPDESK ;14 Начало процесса оказания технической поддержки
ADVANCE 10,8 ;15 Время обслуживания
RELEASE P1 ;16 Освобождение оператора
TERMINATE 0 ;17 Удаляет активную транзакцию из моделирования.
GENERATE 480 ;18 Рабочий день (минут)
КОНЕЦ 1 ;19Минус одна минута
СТАРТ 1 ;20 Старт с первой минуты
 

Результат под спойлером

Результаты Модель 2 — коэффициент использования трех операторов


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

Напоследок хочу вам сказать, что GPSS-WORLD предоставляет более широкие возможности моделирования, чем те, о которых я вам рассказывал. Просто в силу ограниченности своих знаний я не могу их вам адекватно продемонстрировать. Но, тем не менее, в качестве бонуса приведу пример работы с переменными

 INITIAL X$APPLES,3 ;1 Установить переменную
GENERATE 1 ;2 установить количество циклов
СОХРАНИТЬ ЗНАЧЕНИЕ ЯБЛОКИ-,1 ;3 установить ЯБЛОКИ=ЯБЛОКИ-1
TERMINATE 1 ;4 удалить одну итерацию
СТАРТ 1 ;5 1 Старт с первого цикла
 

Давайте еще раз построчно

Строка 1 — НАЧАЛЬНЫЕ X $ ЯБЛОКИ, 3; 1 устанавливаем значение переменной, X$ в данном случае как-то указывает на имя переменной, а цифра три это значение которое мы будем записывать в переменную APPLES (кстати я не фанат продукции APPLE просто в этот момент на общем столе лежало 3 яблока, и одно я взяла себе, прямо как в детсадовских задачках по математике)
Строка — 2 СОЗДАТЬ 1 — создать 1 итерацию
Строка 3 — СОХРАНИТЬ ЗНАЧЕНИЕ ЯБЛОКИ-, 1; — сохранить переменную apples ее значение минус единица.
Строки 4-5 помогут нам закончить программу.

Результаты Model 3 — переменные


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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *