ADOPT – определение или смена семейства активной заявки. При создании заявки оператором GENERATE параметру семейства присваивается исходное значение, равное порядковому номеру заявки. Если создаются копии заявки (оператор SPLIT), то все они принадлежат к семейству порождающей заявки.
При входе заявки в оператор ADOPT происходит присоединение заявки к семейству, номер или имя которого определено операндом А:
ADOPT А
Операнд А быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр. Например, ADOPT 2000– все активные заявки, прошедшие оператор, становятся членами семейства с номером 2000 (значение присваивается параметру Assembly Setvalue заявки).
SPLIT – создание копий заявок. Оператор GENERATE является основным средством создания заявок и ввода их в модель. Вход заявок в оператор GENERATE не допускается. Кроме оператора GENERATE для создания заявок используется оператор SPLIT (расщепить). Но, в отличие от GENERATE, оператор SPLIT не создает самостоятельных заявок, а лишь генерирует заданное число копий входящего в него заявки – порождающей. Оператор SPLIT имеет следующий формат:
SPLIT А,[В],[С]
Операнд А – число создаваемых копий одного семейства. Он может быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр. Все копии формируются в момент входа порождающей заявки в оператор SPLIT. Операнд В – номер оператора, к которому переходят копии порождающей заявки. Значение операнда В вычисляется для каждой копии отдельно.
После прохождения оператора SPLIT порождающая заявка направляется в следующий оператор, а все копии направляются по адресу, указанному операндом В (или к следующему оператору, если операнд В не указан – по умолчанию). Таким образом, если операнд А равен k, то из оператора выйдут k+1 заявка. Далее порождающая заявка и копии являются равноправными и при необходимости могут проходить снова через любое число операторов SPLIT.
Операндом С может быть задан номер параметра, используемого для присвоения копиям последовательных номеров (нумерации). Если операнд С не используется, по умолчанию номеров выходящих из оператора SPLIT заявок в их параметрах нет.
Операнды В и С могут быть такими же, как и операнд А. Например:
- SPLIT 6 – из оператора SPLIT выйдет 1+6=7 заявок, шесть копий вслед за порождающий заявкой будут направлены к следующему оператору, так как операнд В не используется. Записи номеров в параметр порождающей и копий заявок также не будет – операнд С опущен. Копии имеют тот же приоритет, значения параметров и время входа в модель, что и порождающая заявка.
- SPLIT 9,Met11 – оператор SPLIT сгенерирует 1+9=10 заявок. Порождающая заявка перейдет к следующему оператору, а девять копий – к оператору с меткой Met11. Записи номеров в параметры заявок также нет.
- SPLIT 4,Met1,5 – оператор SPLIT при входе порождающей заявки генерирует четыре копии, которые направляются к оператору с меткой Metl. Каждая копия имеет тот же приоритет, время входа в модель и значения параметров, что и порождающая заявка, за исключением параметра номер 5. В параметр номер 5 каждой копии будет записан порядковый номер. Если параметр номер 5 порождающей заявки не определен заранее, он будет создан, и ему будет присвоено значение 0. Если параметр номер 5 порождающей заявки определен заранее и его значение равно n, то в параметре номер 5 порождающей заявки и копий после выхода из блoкa SPLIT будут записаны n+1, n+2, n+3, n+4 и n+5 соответственно.
- SPLIT 3,P$Adr,Adr– оператор, к которому должны направляться копии заявок, указывается операндом В, значение которого, т. е. номер оператора, вычисляется для каждой вновь создаваемой копии. Если параметр с именем Adr содержит номер оператора, например n, то первая копия будет направлена к оператору n+2, вторая – к n+3, третья – к n+4. Эти же номера будут записаны в параметр с именем Adr копий порождающей заявки. Сама же порождающая заявка со значением n+1 параметра с именем Adr перейдет к следующему оператору.
Каждая новая копия, создаваемая оператором SPLIT, становится членом семейства заявок, порожденных исходной заявкой оператора GENERATE. Заявки, принадлежащие к одному семейству, объединяются планировщиком в список. Если оператором SPLIT не производит нумерацию порождающей заявки и ее копий, то внутри семейства нельзя установить, какая из заявок является порождающей. Число заявок в семействе произвольно. Каждая заявка, созданная оператором GENERATE, является отдельным семейством (номер заявки равен номеру семейства, т. е. сколько сгенерировано оператором GENERATE в модели заявок, столько и семейств). Таким образом, число семейств (ансамблей) в системе произвольно и семейство существует до тех пор, пока в нем находится хотя бы одна заявка. К семейству заявок можно применять операторы MATCH, ASSEMBLE, GATHER.
ASSEMBLE – объединение заявок. Оператор ASSEMBLE (объединить) используется для объединения заданного числа заявок, принадлежащих одному семейству, в одну заявку. Из оператора ASSEMBLE выходит только одна заявка, который переходит в следующий оператор. Оператор ASSEMBLE имеет следующий формат:
ASSEMBLE A
Операнд А это число заявок одного семейства, участвующих в сборке (начальное число счетчика сборки). Может быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр. В одном и том же операторе ASSEMBLE возможна одновременная сборка заявок нескольких семейств. Так как сборка длится в течение какого-то промежутка модельного времени, оператор ASSEMBLE имеет список синхронизации. В список синхронизации помещаются первые вошедшие в оператор ASSЕМВLE заявки каждого собираемого семейства. Они ожидают прихода заявок своих семейств.
При входе заявки в оператор ASSEMBLE проверяется: есть ли в списке синхронизации заявка такого же семейства. Если заявки такого же семейства в списке синхронизации нет, т. е. вошедшая заявка первая из собираемого семейства, то вычисляется операнд А, округляется до целого числа и уменьшается на 1. В зависимости от полученного результата S, сохраняемого в ячейке (счетчике сборки) первой заявки собираемого семейства, выполняются следующие действия:
- если S<0, то происходит останов по ошибке «Счетчик сборки не положителен»;
- если S=0, то заявка сразу пытается войти в следующий оператор;
- если S>1 то заявка исключается из списка текущих событий и помещается в список синхронизации оператора ASSEMBLE.
Если в списке синхронизации уже есть заявка того же семейства, что и вошедшая в оператор ASSEMBLE, то вошедшая заявка уничтожается, а счетчик сборки, сохраненный в ячейке находящейся в списке синхронизации заявки, уменьшается на 1. Когда этот счетчик сборки становится равным нулю, т. е. в оператор ASSEMBLE вошло заданное число заявок, ожидающая заявка выводится из списка синхронизации. Если обслуживание этой заявки не было прервано ни одним из устройств, она пытается перейти к следующему оператору и в случае успеха возвращается в список текущих событий. Например:
- ASSEMBLE 7 – собирает 7 заявок одного семейства, 6 уничтожаются, одна переходит в следующий оператор.
- ASSEMBLE *1 – собирает число заявок, равное значению параметра 1 первого пришедшего в оператор ASSEMBLE заявки семейства. Этим способом задания счетчика сборки удобно пользоваться, когда неизвестно заранее количество собираемых заявок, и оно определяется в ходе моделирования. В этом случае нужно в параметр номер один всех собираемых заявок записать значение счетчика сборки, так как неизвестно, какая заявка придет первой и установит счетчик сборки.
Прерванной заявке запрещается покидать оператор ASSEMBLE до тех пор, пока все его прерванные обслуживания не будут закончены. Поэтому рекомендуется строить модель так, чтобы заявки, обслуживание которых было прервано без удаления (без освобождения устройства), не входили в оператор ASSEMBLE.
Пример совместного использования операторов SPLIT и ASSEMBLE. На пункт управления, состоящий из 4-х автоматизированных рабочих мест (АРМ), поступают группы сообщений. Интервалы времени поступления групп сообщений подчинены экспоненциальному закону со средним значением 5 часов. Количество сообщений в группе распределено по нормальному закону с математическим ожиданием 20 сообщений и стандартным отклонением 3 сообщения. Время обработки одного сообщения на одном АРМ распределяется по экспоненциальному закону со средним значением 25 мин. После обработки сообщения вновь собираются и хранятся вместе. Ограничений на количество обрабатываемых сообщений нет.
Для имитации группы сообщений и одного сообщения следует использовать заявки. АРМ в модели будет представлять многоканальное устройство (МКУ), заданное накопителем (см. ЛР№4).
Общая идея построения модели заключается в следующем. Оператор GENERATE имитирует поступление заявок. Одна заявка – одна группа сообщений. Затем случайным образом определяется количество сообщений в группе. Далее поступившая группа сообщений – исходная заявка входного потока копируется оператором SPLIT и результат копирования – число заявок по числу сообщений в группе, поступают на АРМ – МКУ и обрабатываются. После обработки сообщения, входящие в группу, собираются оператором ASSEMBLE. Когда все заявки-сообщения будут обработаны и поступят в оператор ASSEMBLE, из него выйдет одна заявка, имитирующая снова собранную группу сообщений. Реализация в GPSS имеет вид, приведенный в примере 1.
Пример 1
; Задание исходных данных
Tpt EQU 300 ; Средний интервал поступления групп сообщений
Moka EQU 30 ; Матожидание числа сообщений в группе
Soka EQU 5 ; Стандартное отклонение числа сообщений в группе
Троа EQU 25 ; Среднее время обработки одного сообщения
VrMod EQU 4320 ; Время моделирования
P0br STORAGE 4 ; Число каналов МКУ
; Сегмент имитации поступления и обработки сообщений
GENERATE (Exponential(13,0,Tpt)) ; Источник групп сообщений
ASSIGN 1,(Normal(451,Moka,Soka)) ; Определение числа сообщений в
; группе
SPLIT *1 ; Деление группы на сообщения
QUEUE Rr1 ; Занять очередь
ENTER PObr ; Занять канал МКУ
DEPART Rr1 ; Покинуть очередь
ADVANCE (Exponential(13,0,Tpoa)) ; Обработка сообщения
LEAVE PObr ; Освободить один канал МКУ
ASSEMBLE *1 ; Собрать сообщения в группу
TERMINATE ; Выход обработанных групп
; сообщений
; Сегмент задания времени моделирования
GENERATE VrMod
TERMINATE 1
В операторе ASSIGN случайным образом определяется количество сообщений в поступившей группе и запоминается в первом параметре заявки. Сделано это потому, что в операторе ASSEMBLE использована запись ASSEMBLE *1, значит, он собирает число заявок, равное значению параметра 1 первой пришедшего в оператор ASSEMBLE заявки семейства, а какая именно заявка придет первым после обработки на МКУ РР1 – исходная или копия – неизвестно.
GATHER – пакетирование заявок. Оператор GATHER (собирать) предназначен для сбора заданного количества заявок одного семейства, движущихся по одному и тому же пути. Отличие оператора GATHER от оператора ASSEMBLE состоит в том, что в нем заявки не уничтожаются (не «сливаются» в одну), а после сбора все направляются к следующему оператору. Формат оператора:
GATHER A
Операнд А задает число заявок, принадлежащих одному семейству, которое нужно собрать при их движении по одному пути (начальное число счетчика сбора). Может быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр.
Оператор GATHER также может одновременно производить сбор заявок нескольких семейств и также имеет список синхронизации.
Пусть при входе заявки в оператор GATHER в результате проверки оказалось, что в его списке синхронизации нет заявок этого же семейства, т. е. вошедшая заявка из данного семейства является первой. Тогда вычисляется операнд А, округляется до целого числа, уменьшается на 1 и запоминается полученный результат S в ячейке заявки – счетчике сбора. В зависимости от результата S возможны следующие действия:
- если S<0, то происходит останов программы по ошибке «счетчик сбора не положителен»;
- если S=0, то заявка сразу пытается войти в следующий оператор;
- если S>1, то заявка помещается в список синхронизации оператора для ожидания прибытия других заявок своего семейства.
Если проверкой в списке синхронизации обнаружены заявки семейства, к которому принадлежит только что вошедшая в оператор GATHER заявка, то она помещается в список синхронизации, а счетчик сбора уменьшается на 1. Если его значение становится равным нулю, т. е. в оператор GATHER вошло заданное число заявок данного семейства, все собранные заявки исключаются из списка синхронизации и помещаются в список текущих событий.
Если среди собранных заявок одного семейства обнаруживаются прерванные заявки, то после окончания сбора они не переводятся в СТС. Прерванные заявки будут находиться в операторе GATHER, но не в списке синхронизации, до тех пор, пока все прерванные обслуживания не будут закончены. Поэтому в модели нужно предусмотреть, чтобы прерванные без удаления, т. е. без освобождения устройства, заявки, если в этом нет необходимости, не входили в оператор GATHER.
Дополнительный пример, демонстрирующий различие в использовании операторов GATHER и ASSEMBLE в режиме пошагового прогона, приведен в Приложении 4.
MATCH – синхронизация движения заявок. Оператор MATCH (синхронизировать) предназначен для синхронизации движения заявок одного семейства, продвигающихся по разным путям. Для синхронизации необходимы два оператора MATCH, находящихся в соответствующих местах модели и называемых сопряженными. Формат записи:
Name MATCH A
Операндом А каждого оператора MATCH указывается метка или номер сопряженного ему оператора. Операнд может быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр. Например:
Kont1 MATCH Kont2
Kont2 MATCH Kont1
В модели эти операторы будут помещены раздельно в параллельных путях продвижения заявок. При входе заявки в оператор MATCH операнд А вычисляется и округляется до целого числа. По полученному значению определяется сопряженный оператор MATCH. При его отсутствии происходит останов по ошибке.
Если сопряженный оператор есть, проверяется наличие в нем заявки из того же семейства. Если в операторе нет ни одной заявки данного семейства, поступившая заявка помещается в список синхронизации и будет ожидать в нем входа заявки своего семейства в сопряженный оператор MATCH. При поступлении такой заявки в сопряженный оператор MATCH обе заявки одного семейства будут исключены из списка синхронизации и одновременно будут пропущены в следующие за оператором MATCH операторы. Одна и та же пара операторов MATCH может одновременно синхронизировать любое число пар заявок из разных семейств. Заявки одного семейства также можно синхронизировать в любом числе пар операторов MATCH. Если одна из синхронизируемых заявок будучи прерванной вошла в оператор MATCH, ей не разрешается выйти из него до тех пор, пока все его прерванные обслуживания не будут закончены. Поэтому строить модель нужно так, чтобы заявки, обслуживание которых прервано без удаления (без освобождения устройств), не входили в операторы MATCH.
Оператор MATCH может быть сопряжен сам себе (в этом случае его действие будет аналогично действию оператора GATHER с операндом А, равным 2) например:
Six MATCH Six
Пример применения оператора MATCH. Техническое обслуживание (ТО) средств связи (СС) проводят в два этапа две группы специалистов. Первый этап выполняется специалистами первой и второй групп параллельно со средним временем соответственно 80 и 70 минут. После первого этапа производится уточнение мероприятий ТО, время выполнения которого принимается равным нулю. После уточнения специалистами первой и второй групп параллельно выполняется второй этап со средним временем 30 и 40 минут соответственно. Затем третья группа специалистов производит комплексную проверку СС со средним временем 60 минут. Интервалы поступления СС и время их ТО подчиняются экспоненциальному закону. В модели группы специалистов целесообразно представить ОУ, а СС – заявками. Пусть первой группе специалистов соответствует ОУ Gto1, второй группе – Gto2, третьей группе – Gto3. реализация модели показана в примере 2.
Пример 2
; Задание исходных данных
Post EQU 11400 ; Интервал поступления СС на ТО
0bs2 EQU 4800 ; Среднее время ТО первой группой на этапе 1
Obs3 EQU 4200 ; Среднее время ТО второй группой на этапе 1
0bs4 EQU 1800 ; Среднее время ТО первой группой на этапе 2
0bs5 EQU 2400 ; Среднее время ТО второй группой на этапе 2
0bs6 EQU 3600 ; Среднее время ТО третьей группой на этапе 3
; Сегмент имитации поступления средств связи на ТО
GENERATE (Exponential(215,0,Post)) ; Источник средств связи
SPLIT 1, Anb ; Разделение на две заявки
; Сегмент имитации работы первой группы специалистов
SEIZE Tg1 ; Занять первую группу специалистов
ADVANCE (Exponential(215, 0, 0bs2)) ; Первый этап обслуживания
Par1 MATCH Par2 ; Уточнение мероприятий ТО
ADVANCE (Exponential(215,0,0bs4)) ; Второй этап обслуживания
RELEASE Tg1 ; Освободить первую группу
TRANSFER ,Ank
; Сегмент имитации работы второй группы специалистов
Anb SEIZE Tg2 ; Занять вторую группу специалистов
ADVANCE (Exponential(215,0,0bs3)) ; Первый этап обслуживания
Par2 MATCH Par1 ; Уточнение мероприятий ТО
ADVANCE (Exponential(215,0,0bs5)) ; Второй этап обслуживания
RELEASE Tg2 ; Освободить вторую группу
; специалистов
Ank ASSEMBLE 2 ; Передача СС третьей группе
; Сегмент имитации работы третьей группы специалистов
SEIZE Tg3 ; Занять третью группу специалистов
ADVANCE (Exponential(215,0,0bs6)) ; Третий этап обслуживания
RELEASE ТgЗ ; Освободить третью группу
TERMINATE 1 ; Готовые СС
В примере 2 после поступления в модель исходной заявки – одного образца средства связи – осуществляется расщепление ее с помощью оператора SPLIT на две заявки. Первая из них направляется на цепочку операторов, имитирующих работу специалистов первой группы, а вторая (копия) – на операторы, моделирующие работу специалистов второй группы. После выполнения первого этапа обслуживания специалистами обеих групп обе заявки задерживаются операторами MATCH и одновременно начинается второй этап работ. После его выполнения две заявки оператором ASSEMBLE объединяются в один и далее с использованием одной заявки имитируется проведение комплексной проверки.
INDEX – изменение параметра заявки. Изменить значение параметра заявки можно оператором INDEX следующего формата:
INDEX А,В
Операнд А – номер параметра заявки, он может быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр. Операнд В – числовое значение, которое прибавляется к значению параметра, указанного операндом А. Может быть именем, числом, выражением в скобках, СЧА или СЧА*параметр. Полученный результат заносится в первый параметр заявки.
Так, например, INDEX Slag1,(Normal(21,Mat,SreOtk)+X$post) – при входе заявки в такой оператор вычисляется выражение в скобках, которым указан операнд В, и складывается со значением параметра с именем Slag1. Результат сложения присваивается параметру номер один заявки. Если этот параметр не существует, он создается. Если же нет параметра, указанного операндом А, происходит останов по ошибке «Обращение к несуществующему параметру».
PLUS. В GPSS World значения параметров заявок можно также изменять оператором PLUS. Оператор PLUS вычисляет выражение и может записать его в параметр. Оператор PLUS имеет следующий формат:
PLUS А,[В]
Операнд А – выражение. Может быть именем, числом, строкой, выражением в скобках, СЧА или СЧА*параметр. Операнд В – номер параметра заявки, в котором сохраняется результат. Операнд может быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр. Так, например, PLUS (Exponential(23,0,32.7)+48.75),Itog– при входе заявки в такой оператор PLUS вычисляется выражение в скобках, которым задан операнд А. Затем полученный результат присваивается параметру с именем Itog. Если такой параметр не существует, он создается.