К операторам, изменяющим последовательность продвижения заявок по системе, относятся операторы: DISPLACE (см. ЛР№6), TRANSFER (см. ЛР№4), TEST (см. ЛР№5), GATE (см. ЛР№4) и LOOP.
LOOP – организация циклов. Оператор LOOP предназначен для организации в модели циклов. Он имеет следующий формат:
LOOP А,В
Операнд А – параметр заявки или параметр цикла, в котором содержится число повторений какого-либо участка модели. Операнд В – метка оператора, с которого начинается цикл. Операнды А и В могут быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр, например: LOOP KolPovt,Start1– оператор с меткой Start1 является началом цикла, т. е. должен быть расположен раньше оператора LOOP. Когда заявка, пройдя участок модели, начинающийся оператором с меткой Start1, войдет в оператор LOOP, значение ее параметра с именем KolPovt уменьшается на 1. Если это значение не равно нулю, заявка переходит к оператору с меткой Start1, т. е. цикл повторяется. Если же после вычитания 1 значение параметра цикла равно нулю, следовательно, выполнено заданное число повторений, заявка переходит к следующему оператору. Если при входе заявки в оператор LOOP окажется, что параметра с именем KolPovt нет, произойдет останов по ошибке «обращение к несуществующему параметру».
При каждом входе заявки в оператор LOOP значение параметра цикла уменьшается на 1. Значит, значение параметра цикла можно использовать для выбора новых значений каких-либо факторов при очередном повторении. Однако это не всегда удобно, так как величина параметра цикла изменяется от большего к меньшему значению, а не наоборот. Функции, выполняемые оператором LOOP, могут быть реализованы, например, с использованием оператора TEST следующим образом:
. . .
ASSIGN 2,1
Met1 . . .
. . .
ASSIGN 2+,1
TEST G P2,10,Met1
Первым оператором ASSIGN в параметр 2 активной заявки заносится 1. Оператор с меткой Met1 является началом цикла. После выполнения последовательности операторов, составляющих тело цикла, второй оператор ASSIGN увеличивает значение параметра 2 на 1. Оператор TEST проверяет значение параметра 2. Если оно меньше десяти, заявка направляется к оператору с меткой Met1 и вновь повторяется цикл, если больше – заявка проходит к следующему по порядку оператору. Значения параметра 2 изменяются в порядке возрастания.
Рассмотрим использование оператора LOOP для моделирования одноканальной СМО с ожиданием и ограниченной очередью на три заявки. Пусть требуется в любой момент времени знать номера заявок, находящихся в очереди и на обслуживании. Реализация такой модели показана в примере 3.
Пример 3
; Задание длины очереди и булевой переменной
Emk EQU 3
Kontl1 BVARIABLE (Q$Dlina<Emk) ; Проверка длины очереди
; Сегмент имитации поступления и обслуживания заявок
GENERATE 2,,,7 ; Источник заявок
TEST E BV$Kont1,1,Met1 ; Есть ли место в очереди?
QUEUE Dlina ; Да, встать в очередь
; Учет номеров заявок, вошедших в очередь
ASSIGN 1, Emk ; Запись в параметр цикла
Met2 TEST E X*1,0,Met3 ; Есть ли свободное место?
SAVEVALUE P1,XN1 ; Да, записать номер заявки
TRANSFER ,Met4 ; Выйти из цикла
Met3 LOOP 1,Met2 ; Повторить или конец цикла
Met4 SEIZE Stan ; Занять устройство
DEPART Dlina ; Покинуть очередь
; Учет номеров заявок, покинувших очередь
ASSIGN 1, Emk ; Запись в параметр цикла
Met5 TEST E X*1,XN1,Met6 ; Есть ли заявка с таким номером?
SAVEVALUE P1,0 ; Да, тогда удалить
TRANSFER ,Met7 ; Выйти из цикла
Met6 LOOP 1,Met5 ; Повторить или конец цикла
; Учет номера заявки, находящейся на обслуживании
Met7 SAVEVALUE (Emk+1),XN1 ; Записать номер заявки
ADVANCE 4.5 ; Задержка на время обслуживания
RELEASE Stan ; Освободить ОУ
TERMINATE ; Обслуженные заявки
Met1 TERMINATE ; Потерянные заявки
; Задание времени моделирования
GENERATE 15
TERMINATE 1
Оператор GENERATE генерирует семь заявок с интервалами 2 единицы модельного времени, время прохождения которых представлено в таблице 39. В их нумерации, данной в скобках, отсутствует номер два (XN1=2), так как этот номер присвоен единственной заявке второго оператора GENERATE сегмента задания времени моделирования.
Таблица 39
События
Заявки
1(1)
2(3)
3(4)
4(5)
5(6)
6(7)
7(8)
Вход в модель
Занятие очереди
В очереди заявки
–
3, 4
4, 5
4, 5, 6
5, 6, 7
5, 6, 7
Занятие устройства
6,5
–
–
–
–
Освобождение устройства
6,5
15,5
–
–
–
–
Вывод из модели
6,5
15,5
–
–
–
Первый оператор TEST пропускает заявку к следующему оператору QUEUE, если в очереди на три заявки есть место. После постановки в очередь начинает работать сегмент учета номеров заявок, занявших место в очереди. Так как длина очереди ограничена тремя заявками, то в первый параметр – параметр цикла записывается число три. Далее организуется с помощью оператора LOOP цикл, в котором отыскивается возможность записи номера очередной заявки. Записать номер заявки можно будет тогда, когда значение какой-нибудь одной из трех ячеек сохраняемых величин X1, Х2 или ХЗ будет равно нулю. Таких ячеек может быть больше одной, а заявка поступает одна, поэтому после записи номера осуществляется выход из цикла. Заявка занимает оператор SEIZE с меткой Met3 и покидает очередь с именем Dlina. Теперь начинает работать сегмент учета номеров заявок, покинувших очередь. Вначале в параметр цикла записывается число три (по длине очереди). Затем в цикле находится одна из сохраняемых ячеек X1, Х2 или ХЗ, в которой записан номер заявки, покидающей очередь. Эта ячейка обнуляется. Так как учет номеров заявок, находящихся в очереди и на обслуживании, ведется раздельно, то в сохраняемую ячейку с номером (Emk+1), т. е. 3+1=4 записывается номер заявки, занявшей устройство Stan. После завершения обслуживания устройство Stan освобождается, а сохраняемая ячейка с номером (Emk+1) обнуляется, т. е. обслуженная заявка списывается с учета и выводится из модели. Анализ результатов моделирования подтверждает правильность работы модели. В t=14 восьмая заявка удалена из модели, так как очередь заполнена. Моделирование завершается в t=15. В очереди находятся пятая, шестая и седьмая заявки, а на обслуживании – четвертая.