Generate 480 ;фиктивный блок времени

TERMINATE 1

START 1

Транзакты, рождённые в первом GENERATE, просто уничтожаются. А единственный транзакт, рождённый во второмGENERATE, заходя в блок    TERMINATE, уменьшает значение счётчика завершений на 1, а он был равен 1, т. е. счётчик обнуляется, и процесс моделирования останавливается. Таким образом, в этой модели гарантируется завершение прогона в определённый момент модельного времени, а точное количество транзактов, прошедших через модель, непредсказуемо.

 

3.3.3.  Моделирование работы одноканальных устройств

 

Устройства используются при моделировании систем для имитации работы оборудования единичной ёмкости, например, процессор, канал передачи данных, человек, компьютер. Устройство в любой момент времени может обрабатывать только одно сообщение (транзакт). Одноканальные устройства заранее не описываются.

Для использования одноканального устройства транзакту необходимо выполнить следующие шаги:

· ждать очереди, если необходимо;

· когда подходит очередь, занять устройство;

· пропустить время, необходимое на обслуживание;

· когда обслуживание закончится, освободить устройство.

Второй и четвёртый шаги реализуются блоками SEIZE и RELEASE.

Блок SEIZE  (занять устройство)имеет следующий формат:

SEIZE A

Аргумент А задаёт номер или имя занимаемого устройства.

Свободный блок SEIZE позволяет вошедшему в него сообщению занять указанное устройство. Блок SEIZE задерживает сообщение, если устройство занято или находится в состоянии недоступности. Сообщение, занявшее уст­ройство, затем пытается перейти к следующему по номеру блоку. Уст­ройство остаётся занятым до тех пор, пока занимающее его сообщение не войдёт в соответствующий блок RELEASE. Прежде чем освободить устройство, сообщение может пройти через неограниченное число блоков.

Блок RELEASE  (освободить устройство)имеет следующий формат:

RELEASE A

Освободить устройство может лишь тот транзакт, который его занимает, иначе возникает сообщение об ошибке.

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

ADVANCE A,B

Операнды A и B имеют тот же смысл, что и в соответствующих полях блока GENERATE. Операнд А обязателен. Любой транзакт входит в блок ADVANCE беспрепятственно.

Пример.

GENERATE 5,2

SEIZE 1

ADVANCE 4,2

RELEASE 1

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

 

 

3.3.4.  Моделирование очередей

В GPSS объекты типа "очередь" вводятся для сбора статисти­ческих данных. Необходимо понимать, что блоки очереди не влияют на реальное образование очередей транзактов (очереди образуются перед входами в устройства сами по себе), блоки являются регистраторами статистики. Статистика об очередях собирается в моменты входа транзакта в блок QUEUE  (вход в очередь) или в блок DEPART (выход из очереди). Формат записи блока QUEUE:

QUEUE A,[B]

Операнд А задаёт номер или имя очереди. Может быть именем, положительным целым числом, СЧА. Поле В определяет число единиц, на которое увеличивается те­кущая длина очереди. Если поле В пусто, то по умолчанию прибавляется единица.

Когда транзакт входит в блок QUEUE, то ищется очередь с име­нем, определённым операндом А. Если необходимо, очередь создаётся. Значение текущей длины очереди хранится в СЧА Q$имя. Поскольку очередь обычно используется для измерения времени ожидания, за блоком QUEUE обычно следует такой блок, как SEIZE, который может задержать сообщение. Одно и то же сообщение может одновременно увеличить длину нескольких очередей, т. е. сообщение может войти в несколько блоков QUEUE перед тем, как войти в соответствующие блоки DEPART.

Блок DEPART  имеет следующий формат:

DEPART A,[B]

Блок DEPART служит для уменьшения счётчика длины очереди. В поле В задаётся число единиц, на которое уменьшается длина очереди. Это число не должно превышать текущую длину очереди, иначе возникает ошибка «длина очереди отрицательна». Если поле В пусто, длина очереди по умолчанию уменьшается на единицу.

Пример. Посетители приходят в кассу кинотеатра через 20 ± 10 сек, знакомятся с обстановкой 15 ± 15 сек и занимают очередь. Каждый посетитель приобретает билет у кассира в течении 20 ± 5 сек. Построить модель в течении 8 часов.

Запишем модель на языке GPSS.

 

SIMULATE; управляющий блок на выполнение программы

GENERATE 20,10; приход посетителей

ADVANCE 15,15; знакомство с обстановкой

QUEUE 1  ; очередь к кассиру

SEIZE KASSA; занять кассира

DEPART 1 ; освободить очередь

ADVANCE 20,5; покупка билета

RELEASE KASSA; освободить кассира

TERMINATE; уход из кассы

GENERATE 2880; таймер времени

TERMINATE 1   

START 1       

При наборе блоков удобно пользоваться окном Insert GPSS blocks (вставить блок), которое вызывается в меню Edit/Insert GPSS blocks. Выбрав в нём нужный блок, заполняем последовательно поля ввода для каждого операнда. Здесь удобно вводить метки и комментарии.

3.3.5.  Моделирование многоканальных устройств (МКУ)

 

Многоканальное устройство (памяти) – особый объект языка для имитации разного рода накопителей, конвейеров, в которых одновременно могут находиться несколько транзактов. В отличие от одноканального устройства, для указания ёмкости (количества каналов) используется оператор описания памяти STORAGE. Как любой оператор описания он помещается между блоками SIMULATE  и GENERATE. Формат оператора:

Имя STORAGE А

Сначала определяется имя МКУ, А – ёмкость МКУ (количество каналов).

Блок ENTER (занять МКУ) позволяет вошедшему транзакту использовать много­канальное устройство. Транзакт может быть задержан на входе в блок, если многоканальное устройство заполнено, или имеющейся ёмкос­ти недостаточно, или устройство в данный момент недоступно. Формат записи:

ENTER A,[B]

Операнд А указывается номер или имя МКУ, определённое блоком STORAGE. В необязательном поле В содержится число занимаемых каналов. Если поле В пусто, то по умолчанию занимается од­ин канал. Одно и то же сообщение может входить в неограниченное число многоканальных устройств, а впоследствии освобождать их (или часть из них).

Блок LEAVE  (покинуть устройство) имеет формат:

LEAVE A,[B]

Блок LEAVE освобождает определённое число единиц многоканаль­ного устройства, указанных в поле В. Если это поле пусто, по умолчанию предполагается равным 1. Число осво­бождаемых единиц не должно превышать текущее содержимое многоканального устройства. Транзакт не обязан освобождать столько же единиц каналов, сколько занимал. Поле А блока LEAVE определяет номер или имя многоканального ус­тройства.

Пример. Машины подъезжают на СТО с интервалом 4±2 мин. и обслуживаются у одного из 3-х свободных мастеров в течении 60±4 – 5 мин., затем покидают станцию. Можно промоделировать следующим образом.

 

SIMULATE     

CTO STORAGE 3

GENERATE 4,2 

ENTER CTO    

ADVANCE 60,45

LEAVE CTO    

TERMINATE

3.3.6.  Изменение маршрута движения транзактов

 

Блок TRANSFER  (передавать) предназначен для передачи входящего в него транзакта в другой блок модели. Он имеет формат:

TRANSFER [A],[B],[C],[D]

Операнды В и С являются метками блоков, куда направляется транзакт. Операнд А задаёт режим выбора блока, к которому направляется транзакт, существует 9 режимов:

§, – безусловный режим;

§. – статистический, выбор одного из двух с заданной вероятностью;

§ BOTH – последовательный выбор одного из двух блоков;

§ ALL – последовательный выбор одного из нескольких блоков;

§ PICK – выбор одного из нескольких случайным образом;

§ FN – функциональный режим, выбор по заданной функции;

§ Р – параметрический;

§ SBR – подпрограммный;

§ SIM – одновременный.

В режиме безусловного перехода операнд А пуст и все транзакты отправляются к блоку, указанному в блоке В. Например,
TRANSFER,MET1

В статистическом режиме значение операнда А, записываемое после точки как трёхзначное десятичное число, показывает вероятность (долю) транзактов, которые должны быть отправлены в блок с меткой С, остальные в блок В или к следующему блоку, если операнд В опущен. Примеры:

TRANSFER.7,MET1,MET2; 70 % идёт на метку MET2, 30 % – на MET1

TRANSFER.4,,MET2  ; 40 % идёт на метку, 60 % – в блок ниже

Если блоки с меткой MET1, MET2 заняты, то транзакт остаётся в блоке TRANSFER и повторяет попытку перехода в каждый следующий момент модельного времени.

В режиме BOTH транзакт проверяет два пути: сначала возможность войти в блок с меткой В, затем в С, если оба заняты, то ждёт.

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

В функциональном режиме вычисляется значение функции, имя которой указано в операнде В, берётся целая часть, полученное число складывается с С (может быть 0) и в блок с этим номером направляется транзакт.

3.3.7.  Разработка модели и процесс моделирования
 в GPSS. Пример создания модели

Рассмотрим процесс разработки модели на конкретном примере.

Пример. В парикмахерской два зала: причёсок и маникюрный. В маникюрном зале один мастер, в зале причёсок 2 мастера. Около 60 % приходящих клиентов пришли сделать причёску, из них 25 % затем хотят сделать маникюр. Если очередь к мастерам более одного человека, то клиент уходит. Поток клиентов простейший со средним значением 10 мин., время обслуживания в маникюрном зале 30 ± 10 мин, в зале причёски 60 ± 10 мин. Построить модель, имитирующую работу салона в течение 12-ти часов. Определить коэффициенты загрузки мастеров и количество ушедших клиентов.

Для моделирования простейшего потока воспользуемся встроенной библиотечной функцией exponential(a,b,c), задающей показательный закон распределения. Аргумент а означает номер генератора случайных чисел (любое число от 0 до 127), в определяет сдвиг, с – среднее значение. Для того чтобы различать клиентов, ушедших из-за очереди более 1 человека, введём два TERMINATE с разными метками. Для проверки очереди используем блок TEST и СЧА длины очереди Q$имя.

 



SIMULATE

PRICH STORAGE 2; заводим 2 мастера причёсок

GENERATE (exponential(1,0,10)); генерируем клиентов

TRANSFER.6,Z_MAN,Z_PRICH; 60 % на причёску, 40 % – маникюр

Z_PRICH TEST L Q$OCHPRICH,2,NEOBS; длина очереди меньше двух?

QUEUE OCHPRICH; становимся в очередь

ENTER PRICH; занимаем мастера причёсок

DEPART OCHPRICH; покидаем очередь

ADVANCE 60,10; обслуживаемся

LEAVE PRICH; освобождаем мастера

TRANSFER.75,,VYIHOD; 75 % уходят, 25 % пошли на маникюр, ниже

Z_MAN TEST L Q$OCHMAN,2,NEOBS; проверяем очередь на маникюр

QUEUE OCHMAN

SEIZE MAN; занимаем мастера по маникюру

DEPART OCHMAN

ADVANCE 30,10

RELEASE MAN; освобождаем мастера

VYIHOD TERMINATE ; все обслуженные клиенты уходят

NEOBS TERMINATE ; здесь необслуженные клиенты

GENERATE 720; фиктивный блок времени

TERMINATE 1

START 1

3.3.8.  Управление процессом моделирования

После набора текста и выбора команды Command/Create Simulation (создать процесс моделирования) транслятор проверяет на наличие синтаксических ошибок и выдаёт их в окне Journal. Для поиска ошибок и их исправления удобно пользоваться командой Seach/Next Еrror. При остановке по ошибке транслятор не создаёт список ошибок, тогда нужно самостоятельно найти строку, указанную в сообщении с помощью команды Seach/Go To Line. После исправления всех ошибок происходит процесс моделирования, запустить его можно с помощью команды Command/Start. В появившемся диалоговом окне можно установить нужное количество прогонов модели START n.

Для управления процессом моделирования можно пользоваться командами:

CONDUCT – запустить эксперимент;

HALT – остановить процесс и удалить все команды их очереди;

CONTINUE – продолжить процесс моделирования;

CLEAR – сбросить накопленную статистику в ноль и удалить из модели все транзакты;

RESET – сбросить статистику в ноль без удаления транзактов, без сброса генераторов случайных величин и таймера модельного времени (удобно для сбора статистики в установившемся режиме).

 В конце моделирования автоматически создаётся отчёт, содержащий накопленную статистику по всем объектам модели. Собственно это и есть то, ради чего происходил весь процесс моделирования. Элементы отчёта и их спецификации указаны в приложении 1.

По отчёту для нашего примера (см. приложение 1) видно, что всего в салон пришло 69 клиентов, из них 27 покинули салон из-за очереди более одного человека, 26 человек обслуживаются в зале причёски, 18 – в маникюрном. Маникюрный мастер занят 80,1 % времени, зал причёсок – 93,6 %. Средняя длина очереди в оба зала равна 0,964 и   0,935 соответственно, и среднее время нахождения в очереди 26,6 и 37,4 мин., т. е.   очередь в один человек практически всегда присутствует – салон не справляется с таким потоком посетителей и теряет треть клиентов. Можно сделать предложение об организации ещё одного места обслуживания в зале причёсок и возможно в маникюрном зале. Для этого необходимо провести моделирование при условии, что устройство PRICH будет трёхканальным, а после анализа полученной статистики посмотреть, есть ли необходимость приглашать второго мастера на маникюр (делать 2-канальным устройство MAN).  

 

3.4. Объекты вычислительной категории языка:
 переменные и функции. Сохраняемые ячейки

Для того чтобы использовать в программе переменную, необходимо сначала её описать оператором VARIABLE или FVARIABLE. Формат описания:


Имя VARIABLE А

Операнд А – арифметическое выражение, составляемое из стандартных арифметических операции: +, –, /, # (умножение),
@ (остаток от деления), любого СЧА. Обратиться к переменной можно по её СЧА V$имя или Vi,   где i – номер переменной. Например, переменная SUM VARIABLE N$NEOBS#250 и именем SUM подсчитывает убыток от необслуженных клиентов в примере 3.3.1, вычисляемый как произведение числа транзактов, вошедших в блок с именем  NEOBS  на  среднюю прибыль от одного клиента

250 рублей.

При вычислении переменной VARIABLE от всех СЧА и от результатов всех операций берётся целая часть, для FVARIABLE округление до целого делается только для окончательного результата.

Сохраняемые ячейки памяти  служат для хранения некоторых постоянных или изменяющихся значений данных, обычно для организации разного рода счётчиков. Перед началом моделирования их значения равны 0, но могут быть заданы пользователем в операторе INITIAL A,[B], где операнд А имеет вид X$имя или Xi, i- номер.

Операнд В – присваиваемое значение. В процессе моделирования значение ячейки меняется в блоке SAVEVALUE  (сохранить значение). Блок может быть использован как в режиме замещения старого значения новым, так и в режиме прибавления или уменьшения, тогда в операнде А добавляется знак + или –.

Примеры:

SAVEVALUE 1,(N$NEOBS#250); в ячейку 1 положить значение выражения, подсчитывающего убыток от необслуженных клиентов;

SAVEVALUE UBYITOK+,250; вошедший в блок транзакт прибавляет к ячейке с именем UBYITOK величину возможного убытка от одного клиента, в итоге в ячейке накопится общий убыток;

SAVEVALUE KOL+,1; заходящий в этот блоктранзакт увеличивает значение ячейки на 1.

Обратите внимание, что обращаться к содержимому ячейки в программе нужно через её СЧА (приложение 2): X$UBYITOK, X$KOL.

 

3.5. Определение и использование функций

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


Имя FUNCTION A,Bn

Операнд А – аргумент функции, операнд В состоит из одной буквы, определяющей тип функции и n – положительного числа, задающего количество точек функции. В паре аргумент отделяется от значения запятой, пары друг от друга / (слэджем), пробелы недопустимы.

 

В GPSS есть 5 типов функций:

D – дискретная числовая;

С – непрерывная числовая функция;

Е – дискретная атрибутивная;

L – списковая числовая;

М – списковая атрибутивная.

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

Пример. Пусть на АЗС 10 % клиентов заправляют по 10 литров бензина,
60 %  – по 20 литров, 25 %  – по 30 и тогда 5 %  – по 40литров.

Имеем таблицу значений случайной величины:

 

Количество литров 10 20 30 40
Вероятность 0,1 0,6 0,25 0,05

 

Чтобы понять как разыгрывается случайная величина (СВ), построим по таблице функцию распределения СВ (рис. 3.1), разбив ось на интервалы и найдя накопленные частоты попадания в интервал.

10
20
30
40
0,1
0,7
0,95
1
RN1
FN

Рис. 3.1. График дискретной функции распределения

Описание функции, соответствующей этому рисунку имеет вид:


KOL FUNCTION RN1,D4

.1,10/.7,20/.95,30/1,40

Итак, генератор случайных чисел RN1 разыгрывает число в интервале [0;.999], например 0,835. Это число попадает в интервал [.7;.95], значит значение функции – количество литров заливаемого бензина равно 30 (см. рис. 3.1), причём случайные числа из этого интервала будут появляться с заданной вероятностью 0,95 – 0,7 = 0,25.

Обратим внимание, что значение функции допускается не только в виде действительного числа, но и имени (т. к. имена нумеруются), что удобно использовать для перераспределения в блоке TRANSFER.

PER FUNCTION RN2,D4


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: