Язык GPSS (General Purpose Simulation System), ориентированный на процессы, разработан еще в 1961 г., но продолжает широко использоваться. Язык реализован в ряде программ имитационного моделирования, так, версия программы GPSS/PС в среде Windows создана в 2000 г.
Модель (программа) на языке GPSS представляет собой последовательность операторов (их называют блоками), отображающих события, происходящие в СМО при перемещениях транзактов. Поскольку в интерпретаторах GPSS реализуется событийный метод и в СМО может быть одновременно много транзактов, то интерпретатор будет попеременно исполнять разные фрагменты программы, имитируя продвижения транзактов в текущий момент времени до их задержки в некоторых устройствах или очередях.
Операторы (блоки) GPSS имеют следующий формат:
<метка> <имя_оператора> <поле_операндов> [<комментарий>]
Метка может занимать позиции, начиная со второй, имя оператора — с восьмой, поле операндов — с девятнадцатой, комментарий обязательно отделяется от поля операндов пробелом.
Поле операндов может быть пусто, иметь один или более операндов, обозначаемых ниже при описании блоков символами A, B, C,... Операндами могут быть идентификаторы устройств, накопителей, служебные слова и стандартные числовые атрибуты (СЧА). К СЧА относятся величины, часто встречающиеся в разных задачах. Это, например, такие операнды, как S — объем занятой памяти в накопителе, F — состояние устройства, Q — текущая длина очереди, P — параметр транзакта (каждый транзакт может иметь не более L параметров, где L зависит от интерпретатора), V — целочисленная переменная (вещественная и булева переменные обозначаются FV и BV соответственно), X — хранимая переменная (переменная, для которой автоматически подсчитывается статистика), K — константа, AC1 — текущее время, FN — функция, RN — случайная величина, RN1 — случайная величина, равномерно распределенная в диапазоне [0, 1] и др. При этом ссылки на СЧА записываются в виде <СЧА>$<идентификатор>. Например, Q$ORD означает очередь ORD или FN$COS — ссылка на функцию COS.
Рассмотрим наиболее часто встречающиеся операторы, сопровождая знакомство с ними простыми примерами моделей.
Источники заявок обычно описываются блоком
       GENERATE   A,B,C,D,E
Здесь A и B служат для задания интервалов между появлениями заявок, при этом можно использовать один из следующих вариантов:
C — задержка в выработке первого транзакта; D — число вырабатываемых источником заявок; E — приоритет заявок. Если D пусто, то число вырабатываемых транзактов неограничено. Например:
       GENERATE   6,FN$EXP,,15
Этот оператор описывает источник, который вырабатывает 15 транзактов с интервалами, равными произведению числа 6 и значения функции EXP;
       GENERATE   36,12
Здесь число транзактов неограничено, интервалы между транзактами — случайные числа в диапазоне [24, 48].
Функции, на которые имеются ссылки в операторах, должны быть описаны с помощью блока следующего типа:
 M     FUNCTION   A,B
За ним следует строка, начинающаяся с первой позиции :
X1,Y1/X2,Y2/X3,/.../Xn,Yn
Здесь метка M — идентификатор функции, A — аргумент функции, B — тип функции, Xi и Yi — координаты узловых точек функции, заданной таблично. Например:
 EXP   FUNCTION   RN1,C12
0,0/.2,.22/.4,.51/.5,.6/.6,.92/.7,1.2/.8,1.61/.9,2.3/.95,3/.99,4.6/.999,6.9/1,1000
Это описание непрерывной (C) функции EXP, заданной таблично 12-ю узловыми точками, аргументом является случайная величина (RN1), равномерно распределенная в диапазоне [0, 1]; или:
 BBB   FUNCTION   *4,D6
1,2/2,5/3,11/4,20/5,18/6,12/7,9
Дискретная (D) функция BBB задана 6-ю узловыми точками, аргумент — четвертый параметр транзакта, возбудившего обращение к функции BBB.
Здесь аргумент задан с использованием косвенной адресации, признаком которой является символ *, т.е. запись *4 означает, что аргументом является величина, указанная в 4-м параметре транзакта, вызвавшего функцию (в данном примере можно было бы использовать равноценную запись *p4). В общем случае косвенная адресация выполняется путем записи операнда в виде СЧА*СЧА, например: S*X2, что означает емкость памяти, занятая в накопителе, именем которого является значение переменной X2, или Q*p5 — длина очереди с именем, записанным в парамтере 5 транзакта.
Тразакты могут порождаться и оператором размножения:
       SPLIT      A,B,C
Новые транзакты порождаются, когда в данный блок входит некоторый транзакт. При этом создается семейство транзактов, включающее основной (вошедший в блок) транзакт и A его копий. Основной транзакт переходит в следующий по порядку блок, а его копии переходят в блок с меткой B. Для различения транзактов параметр C основного транзакта увеличивается на 1, а транзактов-копий — на 2, 3, 4,... и т.д.
Обратное действие — сборка транзактов выполняется операторами:
       ASSEMBLE   A
       GATHER     A
Согласно оператору ASSEMBLE первый из вошедших в блок транзактов выйдет из него только после того, как в этот блок придут еще A-1 транзактов того же семейства. Второй оператор отличается от предыдущего тем, что из блока выходят все A транзактов.
Операторы занятия транзактом и освобождения от обслуживания устройства A:
       SEIZE      A
       RELEASE    A
Задержка в движении транзакта по СМО описывается оператором:
       ADVANCE    A,B
A и B имеют тот же смысл, что и в операторе GENERATE.
Пример 1
Обслуживание транзакта в устройстве WST продолжительностью единиц времени, где — равномерно распределенная в диапазоне [7,11] случайная величина, описывается следующим фрагментом программы
       SEIZE      WST
       ADVANCE    9,2
       RELEASE    WST
Аналогично описывается занятие транзактом памяти в накопителе:
       ENTER      A,B
Здесь помимо имени накопителя (A) указывается объем занимаемой памяти (B).
Освобождение B ячеек памяти в накопителе A выполняется оператором:
       LEAVE      A,B
Для накопителей в модели нужно задавать общий объем памяти, что делается в следующем описании накопителя:
 M     STORAGE    A
Здесь: M — имя накопителя, A — объем его памяти.
Если транзакт приходит на вход занятого устройства или на вход накопителя с недостаточным объемом свободной памяти, то транзакт задерживается в очереди к этому устройству или накопителю. Слежение за состоянием устройств и очередей выполняет интерпретатор. Но если в модели требуется ссылаться на длину очереди или собирать статистику по ее длине, то требуется явное указание этой очереди в модели. Делается это с помощью операторов входа в очередь и выхода из очереди:
       QUEUE      A,B
       DEPART     A,B
Согласно этим операторам очередь A увеличивается и уменьшается на B единиц соответственно, если B=1, то поле B можно оставить пустым.
Движение транзактов выполняется по маршруту, заданному последовательностью операторов в модели. Если требуется изменение естественного порядка, то используется оператор перехода. Оператор условного перехода имеет вид:
       TEST XX    A,B,C
В соответствии с ним переход к оператору, помеченному меткой C, происходит, если не выполняется условие A XX B, где XX {E, NE, L, LE, G, GE}; E — равно; NE — неравно; L — меньше; LE — меньше или равно; G — больше; GE — больше или равно (XX всегда размещается в позициях 13 и 14).
Пример 2
Приходящие пользователи ожидают обслуживания, если длина очереди не более 4, иначе от обслуживания отказываются. Соответствующий фрагмент программы
       TEST LE    Q$STR,4,LBL
       QUEUE      STR
       SEIZE      POINT
       DEPART     STR
       ADVANCE    50,16
       RELEASE    POINT
...
 LBL   TERMINATE  1
В примере 2 использован оператор выхода транзактов из СМО:
       TERMINATE  A
Согласно этому оператору из итогового счетчика вычитается число A. С помощью итогового счетчика задается длительность моделирования. В начале исполнения программы в счетчик заносится число, указанное в операнде A оператора
       START      A,B,C
Моделирование прекращается, когда содержимое счетчика будет равно или меньше нуля. Операнд C — шаг вывода статистики на печать. Если B=0 и С=0, то выполняется только стандартная печать по окончании моделирования. В стандартную печать входят собранные за время моделирования статистические данные по основным параметрам модели: средние и максимальные значения длин очередей, объемов занимаемой памяти в накопителях, времени занятого состояния устройств и др. От печати можно отказаться, указав B=NP.
Пример 3
Общая структура программы на GPSS имеет вид
       SIMULATE
<описания, в том числе функций, накопителей, массивов и т.п.>
<операторы, моделирующие движение транзактов>
       START      A,B,C
       END.
Оператор безусловного перехода записывается следующим образом:
       TRANSFER   ,B
Здесь B — метка оператора, к которому следует переход.
Используется ряд других разновидностей оператора TRANSFER. Например:
       TRANSFER   P,B,C
Переход происходит к оператору с меткой, равной сумме значения параметра B транзакта и числа C.
       TRANSFER   FN,B,C
То же, но вместо параметра транзакта слагаемым является значение функции B.
       TRANSFER   PICK,B,C
Это оператор равновероятного перехода к операторам, метки которых находятся в интервале [B,C].
Важное место в СМО занимает переход по вероятности:
       TRANSFER   A,B,C
Здесь A — вероятность перехода к оператору с меткой C, переход к оператору с меткой B будет происходить с вероятностью 1A.
Оператор перехода в циклических процедурах выглядит так:
       LOOP       A,B
Здесь A — номер параметра транзакта, в котором содержится число повторений (витков) цикла, B — метка оператора, с которого начинается повторяющаяся часть.
Пример 4
Заказы, поступающие в СМО в случайные моменты времени в диапазоне [20,40], выполняет сначала бригада WGR1, затем параллельно работают бригады WGR2 и WGR3, каждая над своей частью заказа. Заданы экспоненциальные законы для времен выполнения работ бригадами WGR1, WGR2 и WGR3 с интенсивностями 0,05, 0,1 и 0,125 соответственно. Моделирование нужно выполнить на временном отрезке, соответствующем выполнению 1000 заказов.
Программа:
       SIMULATE
 EXP   FUNCTION   RN1,C12
0,0/.2,.22/.4,.51/.5,.6/.6,.92/.7,1.2/.8,1.61/.9,2.3/.95,3/.99,4.6/.999,6.9/1,1000
       GENERATE   30,10
       SEIZE      WGR1
       ADVANCE    20,FN$EXP
       RELEASE    WGR1
       SPLIT      1,MET1
       SEIZE      WGR2
       ADVANCE    10,FN$EXP
       RELEASE    WGR2
       TRANSFER   ,MET2
 MET1  SEIZE      WGR3
       ADVANCE    8,FN$EXP
       RELEASE    WGR3
 MET2  ASSEMBLE   2
       TERMINATE  1
       START      1000
       END.
Рис. 1.  Функция экспоненциального закона распределения
В этом примере использован экспоненциальный закон распределения с плотностью

где — интенсивность. Функция распределения экспоненциального закона

Из рис. 1 ясно, что поскольку искомыми являются значения случайной величины , то, задавая значение , как равномерно распределенной в диапазоне случайной величины, по формуле
 (1)

находим искомое значение. Именно в соответствии с (1) в операторах ADVANCE множителями были значения .
Приведем еще несколько операторов языка GPSS.
Оператор изменения параметров транзактов:
       ASSIGN     A,B
Здесь A — номер параметра транзакта, B — присваиваемое ему значение.
В следующих операторах параметр A увеличивается (уменьшается) на значение B:
       ASSIGN     A+,B
       ASSIGN     A-,B
Оператор фиксации времени события
       MARK       A 
его выполнение заключается в запоминании значения текущего модельного времени в параметре вошедшего в оператор MARK транзакта, в поле А указывается номер параметра.
Пример 5
На вход производственной линии поступают и проходят обработку на станке TOOL1 детали типов X и Y. Далее детали типа X обрабатываются на станке TOOL2, а детали типа Y — на станке TOOL3. Интервал моделирования соответствует обработке 600 деталей (ниже у операторов GENERATE и ADVANCE значения операндов не конкретизированы):
       SIMULATE
       GENERATE   A,B
       ASSIGN     1,LBL4
       TRANSFER   ,LBL1
       GENERATE   A,B
       ASSIGN     1,LBL2
 LBL1  SEIZE      TOOL1
       ADVANCE    A,B
       RELEASE    TOOL1
       TRANSFER   P,1
 LBL4  SEIZE      TOOL2
       ADVANCE    A,B
       RELEASE    TOOL2
 LBL3  TERMINATE  1
 LBL2  SEIZE      TOOL3
       ADVANCE    A,B
       RELEASE    TOOL3
       TRANSFER   ,LBL3
       START      600
       END.
Расширение возможностей управления движением транзактов достигается благодаря операторам, реализующим механизм семафора:
       LOGIC X    A
       GATE XX    A,B
Первый оператор при X = S устанавливает переключатель A в единичное состояние, при X = R сбрасывает его в нулевое состояние, при X = I инвертирует значение состояния. Второй оператор при XX = LR и значнии переключателя, указанного в A, равном 1, или при XX = LS и состоянии переключателя 0 передает транзакт оператору с меткой B (или задерживает его в блоке GATE, если поле B пусто), а при других сочетаниях XX и значений переключателя — направляет к следующему оператору.
Вычислительный оператор присваивает переменной с номером M значение арифметического выражения A:
 M     VARIABLE   A
Например в следующем операторе переменной номер 3 присваивается разность числа 216 и объема занятой памяти в накопителе MEM2:
 XINIT VARIABLE   K216-S$MEM2
Знаки арифметических операций сложения, вычитания, умножения, деления +, -, #, / соответственно. В случае логических выражений имя оператора должно быть BVARIABLE, а знаками операций дизъюнкции и конъюнкции являются + и #. Если операции выполняются над числами типа real, то имя оператора FVARIABLE.
Следующий оператор присваивает хранимой переменной, указанной в A. значение, записанное в B:
       SAVEVALUE  A,B
Прерывание обслуживания заявки в устройстве A происходит при входе некоторой другой заявки в блок:
       PREEMT     A
а возобновление прерванного обслуживания заявки — при входе в блок:
       RETURN     A
Оператор синхронизации, реализующий механизм рандеву, имеет, например, вид:
 LBL   MATCH      NUMB
Приходящий в него транзакт задерживается до тех пор, пока в некоторой другой части модели в сопряженный оператор не войдет транзакт того же семейства. Сопряженный оператор выглядит так:
 NUMB  MATCH      LBL
Часто сведения о некоторых величинах, характеризующих моделируемый процесс, удобно представлять в виде гистограмм. Задание гистограммы выполняют в разделе описаний с помощью оператора:
 M     TABLE      A,B,C,D
Здесь M — имя гистограммы; A — табулируемая величина; B — верхняя граница левого интервала гистограммы; C — ширина интервалов; D — число интервалов. Формирование гистограммы происходит с помощью оператора:
       TABULATE   A
Выполнение этого оператора увеличивает на единицу число попаданий в -й интервал гистограммы, имя которой указано в A. При этом -й интервал соответствует текущему значению переменной, являющейся аргументом для гистограммы.
Пример 6
Требуется разработать модель процессов возникновения и устранения неисправностей в некоторой технической системе, состоящей из множества однотипных блоков; в запасе имеется один исправный блок; известны статистические данные об интенсивностях возникновения отказов и длительностях таких операций, как поиск неисправностей, замена и ремонт отказавшего блока. Поиск и замену отказавшего блока производит бригада TEAM1, а ремонт замененного блока — бригада TEAM2.
       SIMULATE
       GENERATE   A,B   моделируется возникновение отказов
       SEIZE      TEAM1
       ADVANCE    A,B   поиск неисправности
       ENTER      MEM,1 получение запасного блока из резерва
       ADVANCE    A,B   замена блока
       RELEASE    TEAM1
       SEIZE      TEAM2
       ADVANCE    A,B   ремонт
       LEAVE      MEM,1 восстановление резерва
       RELEASE    TEAM2
       TERMINATE  1
       START      1000
       END.
Пример 7
Требуется разработать модель сборки изделия из 30 деталей типа А1 и 16 деталей типа А2, поступающих на сборочный участок от независимых экспоненциальных источников с интенсивностями λ , равными 0,1 и 0,04 мин-1 соответственно. Длительность сборочной операции находится в пределах [12,18] мин. Промоделировать выпуск 600 изделий. Табулировать наполнение входного бункера с деталями типа А2 перед началом сборки.
       SIMULATE
 MEM1  STORAGE      30
 MEM2  STORAGE      16
 TAB   TABLE        MEM2,32,16,6
 EXP   FUNCTION     RN1,C12
0,0/.2,.22/.4,.51/.5,.6/.6,.92/.7,1.2/.8,1.61/
.9,2.3/.95,3/.99,4.6/.999,6.9/1,1000
       GENERATE     10, FN$EXP
       ENTER        MEM1,1
       TRANSFER     ,MMM
       GENERATE     25, FN$EXP
       ENTER        MEM2,1
 MMM   TEST GE      S$MEM1,30,LLL
       TEST GE      S$MEM2,16,LLL
       TABULATE     TAB
       SEIZE        MONT
       ADVANCE      15,3
       RELEASE      MONT
       TERMINATE    1
 LLL   TERMINATE
       START        600
       END.
Список литературы
1. Томашевский В., Жданова Е. Имитационное моделирование в среде GPSS. — М.: Бестселлер, 2003.
2. GPSS. — http://www.compmodel.ru/394/