GENERATE (Генерировать, произвести, родить)
Этот оператор осуществляет генерирование входного потока заявок, управляет законом распределения временных интервалов между событиями и количеством заявок за все время моделирования.
Формат:< GENERATE A,[B,C,D,E,F,G,H,I]>, где
А - среднее значение интервала времени;
В - разброс или модификатор среднего значения (по умолчанию - ноль);
С - время появления первого транзакта;
D - общее число генерируемых транзактов;
Е - уровень приоритета каждого транзакта (по умолчанию - ноль).
F,G,H,I – параметры транзакты.
Примечание: при курсовом проектировании будут использоваться четыре или пять первых операндов.
GENERATE 2,1,,10
Эта запись читается следующим образом:
«Генерируется транзакт, распределенный по равномерному закону со средним значением 2 и модификатором 1, всего будет произведено 10 таких транзактов».
Как видно из формата, по умолчанию закон распределения временных интервалов - равномерный с управляемым средним и разбросом, что позволяет, в том числе, моделировать потоки с равными интервалами. Также в GPSS/H предусмотрена возможность задавать более сложные распределения. В том случае, когда используются встроенные функции (см. ниже), любая встроенная функция ставится на место операнда А, а операнд В отсутствует. Например:
GENERATE RVNORM(1,1,0.5),,1,4
Эта запись читается следующим образом:
«Генерируется случайное число (Random Value-RV), распределенное по нормальному закону, взятое с первого генератора случайных чисел - ГСЧ
( первое число в скобках), со средним значением равным 1 и стандартным отклонением 0.5; пришедшее в систему в первую единицу времени. Всего с этого ГСЧ поступит 4 транзакта».
GENERATE RVEXPO(7,0.75),,,,5
Эта запись читается следующим образом:
«Генерируется случайное число, распределенное по экспоненциальному закону, взятое с седьмого ГСЧ с параметром потока 0.75, приходящее с приоритетом 5».
В моделях GPSS/H могут применяться более одного блока GENERATE, когда надо представить различные действия для транзактов, например, клиенты банка, приходящие осуществлять различные операции в различном темпе.
Оператор GENERATE не допускает входа транзактов в него! Любой транзакт, вошедший в оператор исполнения GENERATE, вызовет ошибку исполнения и прервет работу программы с выдачей предупреждения в листинге.
TERMINATE (Уничтожить, терминировать)
Служит для удаления транзактов из модели по завершении их обработки. Производит подсчет выведенных из модели транзактов, уменьшая величину специального счетчика - счетчика завершений.
Формат: <TERMINATE [A]>, где:
А - величина, на которую будет уменьшен счетчик завершений. По умолчанию А=0. Операнд А может принимать любые значения в интервале от 0 до плюс бесконечности. Физический смысл числового значения операнда А заключается в задании веса терминирования. Например, на погрузочную площадку выходят двери 4 складов, большемерная фура занимает всю длину погрузочной площадки, и никакая другая машина не сможет производить погрузку. Окончание погрузки фуры (выход транзакта из системы) освобождает сразу 4 места. Эта цифра вычитается из числа стартов (счетчика завершений), подробнее см. в 3.5.
В тех случаях, когда счетчик завершений не уменьшается с каждым транзактом, покидающим модель, моделирование может продолжаться бесконечно.
В программе может быть любое количество операторов TERMINATE, но обязательно хотя бы один из них должен иметь операнд А, отличный от нуля, хотя и все TERMINATE могут иметь отличные от нуля значения операнда А. Единственное принципиальное условие – ни из одного оператора TERMINATE не должны выходить транзакты.
Итак два оператора исполнения GENERATE и TERMINATE являются особыми: в первый не могут входить транзакты, а из второго не могут выходить транзакты! Все остальные рассматриваемые операторы или блоки имеют и вход и выход.
SEIZE (завладеть), RELEASE (освободить)
Оператор SEIZE, является парным с оператором RELEASE, использование их по одиночке не допустимо. Имена, записываемые в операнде А пары должны быть идентичны. Оператор служит приглашением ко входу в одно из устройств модели. Транзакт, подойдя к блоку SEIZE, пытается занять устройство, названное в операторе. Если устройство занято, транзакт ожидает освобождения устройства перед этим оператором. Перед оператором SEIZE может находиться любое количество транзактов. При попадании первого транзакта на обслуживание в устройство, происходит переключение, осуществляемое программой, запрещающее вход в устройство до окончания обслуживания.
Формат:< SEIZE А>,
где А - имя (или номер) устройства.
Функция оператора RELEASE - моделировать освобождение устройства. Пройдя обслуживание в операторе ADVANCE, и исполнив, оператор RELEASE, транзакт переключает поименованное в операторе устройство из положения «занято» в положение «свободно» и разрешает вход в ADVANCE, первому из транзактов, ожидающих перед оператором SEIZE .
Формат: <RELEASE А>,
где А - имя (или номер) устройства.
ADVANCE ( продвижение вперед, успех)
Этот оператор моделирует задержку транзакта в устройстве (в терминах теории СМО - обработку заявки).
Формат:< ADVANCE A,[B]>, где
А - среднее время задержки,
В - разброс относительно среднего значения (модификатор).
На месте операнда А, как и в операторе GENERATE, может быть задана любая встроенная функция, тогда операнд В отсутствует.
Три описанных выше оператора составляют модель простейшей СМО на языке GPSS/H. Программа, в которой имеется такая последовательность операторов, будет отслеживать все статистические характеристики устройства.
ENTER ( войти), LEAVE (отпустить)
Эта пара операторов выполняет те же функции, что и SEIZE и RELEASE, но не для устройств, а для STORAGE - «хранилищ», то есть для ресурсов, к которым может обращаться более одного транзакта. Такие объекты могут быть полезны при моделировании, например, распараллеленного процесса: обработки потока деталей на нескольких одинаковых станках, выхода публики из театра через несколько дверей и т.д. Эти «хранилища», или устройства параллельной обработки, должны быть предварительно описаны в программе при помощи оператора описания STORAGE (см. ниже). По логике своей работы связки операторов SEIZE – ADVANCE – RELEASE; ENTER- ADVANCE- LEAVE; абсолютно одинаковы, но употребляются для разных объектов.
QUEUE ( образовать очередь), DEPART (выйти из очереди)
Помимо устройств, в которых происходит обработка заявок (задержка транзактов), необходимо собирать сведения о таких объектах, как очереди, образующиеся на входах устройств. В языке GPSS/H по умолчанию очередь образуется и функционирует нормально, но никаких сведений о ней не аккумулируется. Для организации сбора таких данных используется пара связанных операторов: QUEUE, который отмечает постановку заявки-транзакта в «хвост» очереди (в терминах модели это называется «конец очереди»), и DEPART, собирающий статистику об уходе транзактов из очереди при освобождении устройства. Эти два оператора ставятся по желанию пользователя, не влияют на основные статистические результаты листинга и могут быть поставлены для получения интересующей пользователя информации с любого объекта модели, где может происходить образование и накопление очереди. Они не препятствуют входу транзактов и имеют нулевое время входа. Последовательность постановки операторов:
QUEUE(имя)- SEIZE…. RELEASE- DEPART (то же самое имя).
Можно создавать несколько вложенных друг в друга очередей, при этом вначале выходят из более короткой очереди, затем из длинной (см. 3.7).
Формат:< QUEUE А,[B]>, где
А - имя очереди (имена такого рода используются не только для удобства идентификации в процессе работы с моделью, но и для указания необходимых сведений при работе в оболочке);
В - число добавляемых в очередь элементов.
Строго говоря, оператор QUEUE увеличивает текущее содержимое очереди, определенной в поле А, на величину, указанную в поле В.
При прохождении оператора DEPART транзакт покидает указанную очередь, причем счетчик длины очереди уменьшается.
Формат: <DEPART A,[B]>, где
А - имя очереди,
В - число удаляемых из очереди элементов.
Обычно описанные выше операторы применяются в программах языка GPSS/H в традиционном порядке, обеспечивающем моделирование работы устройства (простейшей СМО) с учетом образующейся очереди и со сбором всей необходимой статистической информации. Тело программы на языке GPSS/H может, например, выглядеть следующим образом.
Пример
Предположим, в почтовое отделение приходят посылки приблизительно раз в три часа, независимо от времени суток. В зависимости от размеров посылки, ее «обслуживание» в отделении может с равной вероятностью занимать два, три или четыре часа. Ниже приведена простейшая программа (точнее, тело программы с опущенной нумерацией) на GPSS/H, моделирующая такой процесс:
GENERATE | 3 | Ввод в модель транзактов - посылок с интервалом в 3 часа |
QUEUE | Q1 | Постановка транзактов в очередь Q1 |
SEIZE | POST | Занятие транзактом устройства POST (начало обработки посылки) |
ADVANCE | 3,1 | Задержка транзакта на время от 2 до 4 часов |
RELEASE | POST | Освобождение устройства POST (окончание обработки посылки) |
DEPART | Q1 | Выход транзакта из очереди |
TERMINATE | 1 | Вывод транзактов из модели по одному |
Для облегчения процедуры сбора и анализа статистической информации об очередях в GPSS/H предусмотрены следующие стандартные числовые атрибуты очередей: