Пояснения к тексту примера программной модели



Текст программной модели приведён ниже (Рисунок 1.5).

; GPSS World Sample File - BARBER.GPS.
***********************************************************************
* *
* Barber Shop Simulation *
* *
***********************************************************************
Waittime QTABLE Barber,0,2,15;Histogram of Waiting times
GENERATE 3.34,1.7;Create next customer.
TEST LE Q$Barber,1,Finis;Wait if line 1 or less
* else leave shop
SAVEVALUE Custnum+,1;Total customers who stay
ASSIGN Custnum,X$Custnum;Assign number to customer
QUEUE Barber;Begin queue time.
SEIZE Barber;Own or wait for barber.
DEPART Barber;End queue time.
ADVANCE 6.66,1.7;Haircut takes a few minutes.
RELEASE Barber;Haircut done. Give up the barber.
Finis TERMINATE 1;Customer leaves.

Рисунок 1.5 — Текст примера программной модели Barber.gps

Имеется парикмахерская с одним креслом парикмахера. Через некоторые промежутки времени появляются клиенты, чтобы постричься. Если кресло пустое, то парикмахер начинает обслуживать очередного клиента. Если кресло занято, то клиент встаёт в очередь. Модель позволяет определить размер очереди (средний за время моделирования, максимальный и минимальный) и некоторые другие параметры.

Текст программы располагается по строкам — каждый оператор в собственной строке. Могут быть пустые строки, которые игнорируются. Данная программа начинается с комментариев. Строки с комментариями помечаются звёздочками "*" (в первом слева столбце) или точкой с запятой ";" (в любом месте строки). Содержание комментариев может быть любым, в том числе на русском языке, так как они игнорируются транслятором.

Первая строка с оператором имеет вид:

Waittime QTABLE Barber,0,2,15;Histogram of Waiting times

Слово Waittime является меткой оператора QTABLE. Обычно метки служат для организации перехода из других мест программы, если это требуется. Метка располагается в левых крайних позициях строки перед оператором. Но в данном случае метка привязана к таблице, которая служит для построения гистограммы. Оператор QTABLE означает "таблица очередей": первая буква Q — начальная буква английского слова queue = очередь (читается "кью"). Этот оператор применяется для фиксации данных об очередях. В данном случае речь идёт об очереди клиентов перед занятием ими кресла парикмахера. Таким образом метка превращается в имя таблицы для построения гистограммы после окончания моделирования (гистограммой называется специальный график, отображающий некоторые статистические параметры). Слово Waittime выбрано произвольно, а слово QTABLE — является оператором GPSS. Сочетание Barber,0,2,15 является набором операндов оператора QTABLE. С точки зрения обычного языка программирования это примерно эквивалентно записи QTABLE(Barber,0,2,15). Но в GPSS операнды отделяются от оператора пробелами и разделяются между собой запятыми. Если какой-то операнд отсутствует, вместо него ставится запятая (могут быть две и более запятые подряд). Если отсутствуют все последние операнды, то их можно не помечать.

Операнд Barber означает имя очереди (задаётся произвольно и присутствует ниже), величину которой необходимо записывать в таблицу. Число 0 означает верхнюю границу первого частотного класса, число 2 означает размер частотного интервала — разницу между верхней и нижней границей каждого частотного класса, число 15 означает число частотных интервалов. Все эти параметры относятся к параметрам гистограмм.

Вторая строка программы:

GENERATE 3.34,1.7;Create next customer.

Здесь нет метки. Слово GENERATE является оператором GPSS и используется для генерации (создания) транзактов. В разных случаях транзакты могут иметь разную природу. В данном случае это — клиенты парикмахерской. В других случаях транзакты могут представлять из себя детали для сборки, документы, минуты и др. У оператора GENERATE имеется два числовых операнда: 3.34 и 1.7, разделённых запятой. Первое число означает интервал времени, через который появляется очередной транзакт (в данном случае через каждые 3,34 единицы времени). Чему равна единица времени, определяется разработчик модели, когда задаёт время в разных местах программы. В GPSS можно говорить лишь о некоторых временных пропорциях. Число 1.7 означает разброс времени. Поэтому данный оператор имитирует появления нового клиента через каждые 3,34±1,7 единицы времени. В этом интервале (1,64…5,04) единицы времени принято равномерное распределение.

Следующая строка программы:

TEST LE Q$Barber,1,Finis;Wait if line 1 or less
* else leave shop

Она содержит оператор TEST, аналогичный оператору IF в обычных языках программирования. Этот оператор тестирует (проверяет) выполнение условия и осуществляет переход на какую-либо метку (или без перехода на метку). Стоящий справа вспомогательный оператор LE как раз и означает, какой именно контроль осуществляет основной оператор TEST: LE означает "меньше или равно". Могут быть и другие вспомогательные операторы: E "равно", L "меньше", G "больше", NE "не равно", LE "меньше или равно", GE "больше или равно"). Сравниваются между собой два первых операнда, в данном случае: Q$Barber ≤ 1? Если условие выполняется, то осуществляется переход на следующий (нижестоящий) оператор. Если условие не выполняется, то осуществляется переход на метку, заданную в третьем операнде: Finis. Переменная Q$Barber имеет значение количества человек в очереди. Тогда смысл этого оператора TEST заключается в том, что просматривается длина очереди. Если есть очередь и в очереди более 1 человека, то новый клиент не задерживается, а покидает парикмахерскую. Для этого и сделан переход на метку Finis в конце программы. Если же очереди нет или в ней всего лишь 1 человек, то клиент занимает очередь. Поэтому в данном случае очередь не может быть больше 2 человек.

Здесь можно варьировать максимально допустимую длину очереди и смотреть, сколько же всего может набраться в ней человек.

Следующая строка программы:

SAVEVALUE Custnum+,1;Total customers who stay

Оператор SAVEVALUE означает Сохраняемая величина. Имя этой переменной (любое) задаётся первым операндом: Custnum. Знак "+" не относится к имени переменной. В сравнении с обычными языками программирования это — обычная переменная, используемая как счётчик. Знак "+" означает, что к ней прибавляется следующий операнд (в данном случае 1). Можно использовать также знак "–" и тогда второй операнд будет отниматься от первого. Если не будет ни "+", ни "–", то произойдёт присваивание значения второго операнда первому. Второй операнд может быть как числом, так и переменной (а также строкой). С помощью переменной Custnum в данном случае подсчитывается число клиентов, посетивших парикмахерскую и оставшихся в очереди.

Следующая строка программы:

ASSIGN Custnum,X$Custnum;Assign number to customer

Оператор ASSIGN означает присвоение значения второго операнда первому. Второй операнд в данном случае имеет то же имя, что переменная в предыдущем операторе, а именно X$Custnum, но имя Custnum стоит после специфического сочетания знаков X$. В данном случае имеется пример так называемых Системных числовых атрибутов (СЧА) — Системным числовым атрибутом является сочетание знаков X$. Смысл СЧА будет рассмотрен ниже, а пока достаточно принять, что выражение X$Custnum означает "содержимое переменной Custnum", которое ранее было подсчитано.

Смысл последних двух операторов следующий. Когда оператор GENERATE создаёт очередной транзакт, он присваивает ему очередной номер по порядку. Некоторые из транзактов (клиентов) покидают парикмахерскую из-за очереди. Последние два оператора занимаются тем, что присваивают транзактам новые номера (перенумеровывают их). Новый порядок номеров относится только к тем транзактам, которые решились встать в очередь. Например, пусть генерируются транзакты с номерами 1, 2, 3, 4, 5, 6, 7, 8, 9 и т. д. И пусть транзакты 2, 5 и 8 "испугались" очереди и покинули парикмахерскую. Тогда оставшиеся транзакты будут перенумерованы этими двумя операторами следующим образом:

Прежний номер транзакта                  
Новый номер транзакта                  

Жирным шрифтом выделены покинувшие парикмахерскую транзакты (клиенты).

Для чего нужно делать такую перенумерацию? В данном случае — это просто учебная демонстрация работы конкретных операторов. В некоторых практических случаях это может оказаться необходимым. Например, если каждому оставшемуся (и обслуженному впоследствии) транзакту выдаётся чек за оплаченную им услугу и номер чека соответствует номеру транзакта. Или когда требуется перенумеровать очередь. Возможны и другие реальные случаи (кто первый? кто последний?).

Следующая строка программы:

QUEUE Barber;Begin queue time.

Здесь оператор QUEUE означает Очередь, а операнд Barber — её имя (в данном случае "парикмахер"). Работа этого оператора заключается в фиксации транзакта, который направляется к креслу парикмахера. Оператор QUEUE "знает", свободно ли кресло. Если оно свободно, то оператор QUEUE пропускает транзакт через себя без задержки. Если же кресло занято, то оператор QUEUE задерживает очередной транзакт и создаёт очередь. В функции оператора QUEUE входит также фиксировать время, когда очередной транзакт вошёл в очередь, а также время выхода его из очереди, время нахождения в очереди и др. параметры. Все эти данные можно использовать в программе, обращаясь к переменной Barber с помощью Системных числовых атрибутов.

Следующая строка программы:

SEIZE Barber;Own or wait for barber.

Оператор SEIZE означает "захват транзактом Обслуживающего устройства", в данном случае — устройства по имени Barber "парикмахер". Операнд Barber является именем Обслуживающего устройства. В данном случае это имя совпадает с именем другого (предыдущего) блока — Очереди QUEUE. Это — именно совпадение. Имена Очереди и Обслуживающего устройства могут быть одинаковыми или разными — это не имеет значения (можно проверить в программе). Программа понимает, что если имя используется с оператором SEIZE, то речь может идти только об Обслуживающем устройстве. Захват возможен только в том случае, если Обслуживающее устройство свободно. Именно сигнал от оператора SEIZE учитывается оператором QUEUE при постановке транзакта в очередь. Если Обслуживающее устройство занято, то транзакт остаётся в очереди. Если Обслуживающее устройство освободилось, то транзакт перемещается в него и программа переходит к следующему оператору:

DEPART Barber;End queue time.

Оператор DEPART означает "освободить Очередь с именем Barber на 1 транзакт".

Следующая строка программы:

ADVANCE 6.66,1.7;Haircut takes a few minutes.

Оператором ADVANCE задаётся время обработки в том Обслуживающем устройстве, имя которого было в ближайшем (предыдущем) операторе SEIZE (в данном случае это устройство с именем Barber). Первый и второй операнды аналогичны таковым у оператора GENERATE, т. е. означают, что время обработки составляет 6,66±1,7 единиц времени (с равномерным распределением в заданном диапазоне). Когда оператор SEIZE "впихивает" транзакт в Обслуживающее устройство, начинается отсчёт времени. Когда время заканчивается (через 6,66±1,7 единиц), транзакт "выпихивается" из Обслуживающего устройства:

RELEASE Barber;Haircut done. Give up the barber.

Оператор RELEASE осуществляет это "выпихивание" из устройства с именем, заданным в его операнде.

Последний оператор программы:

Finis TERMINATE 1;Customer leaves.

Здесь Finis — метка (на неё осуществляется переход оператором TEST LE). Оператор TERMINATE означает, что при его выполнении уничтожается 1 транзакт. "Уничтожение" транзакта означает, что он покидает систему (модель), т. е. парикмахерскую. На этот оператор выводят два пути: "испугавшиеся очереди" транзакты попадают на выход через оператор TEST LE, а оставшиеся и дождавшиеся обслуживания — естественным путём после последовательного перемещения через все операторы.

Анализируя эти фрагменты, можно заметить, что существуют пары операторов:

QUEUE "включить в Очередь" — DEPART "освободить Очередь"

SEIZE "захватить Обслуживающее устройство" — RELEASE "освободить Обслуживающее устройство".

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

1.4 Запуск программы на счёт

Для запуска на счёт выполняется следующая последовательность действий (Рисунок 1.6) через меню Command → START

Рисунок 1.6 — Задание продолжительности работы программы
числом транзактов

В данном окне необходимо ввести количество транзактов, которые должны пройти через систему до окончания счёта. По умолчанию стоит 1, но может потребоваться большее число транзактов. В данном случае можно ввести 100. Слово START является командой GPSS и его можно стереть и заново ввести в этом окне. Его можно набить и в конце самой программы, указав там число задаваемых транзактов. Тогда программа после трансляции сразу начнёт считать. Использование окна позволяет постепенно просматривать работу системы, задавая порциями число вводимых транзактов. После окончания начавшегося счёта появится новое окно поверх прежних (Рисунок 1.7):

Это окно представляет собой так называемый Стандартный отчёт, в котором показываются конечные результаты моделирования. Результатами являются различные данные, связанные с Очередью, Обслуживающим устройством, транзактами.

Рисунок 1.7 — Окно Стандартного отчёта

Вверху — некоторые данные о моделировании: имя файла (Barber.1.1), дата и время моделирования, время старта (START TIME — в данном случае 0.000 единицы), время окончания счёта (END TIME — в данном случае 353.895 единицы времени), общее число блоков (BLOCKS — в данном случае 10), число обслуживающих устройств (FACILITIES — в данном случае 1, парикмахер), число многоканальных накопителей (STORAGES — данном случае их нет). Ниже располагаются имена переменных (и меток) и их номера, присвоенные им программой при трансляции. Это — вспомогательная информация.

В центре отчёта имеется текст программы (без комментариев). Текст программы расположен в виде таблицы (без прочерченных строк и столбцов). Самая левая колонка — LABEL (метка). Единственная метка в программе — FINIS.

Название таблицы WAITTIME не является меткой и здесь не отражено. Колонка LOC содержит номера блоков, присвоенные им программой. В колонке BLOCK TYPE располагаются имена блоков. В колонке ENTRY COUNT помещено количество "вошедших" транзактов, а в колонке CURRENT COUNT — оставшихся в них на данный момент. Видно, что на момент остановки программы в системе осталось два транзакта — один сидит в кресле парикмахера (оператор SEIZE) и один — в очереди (оператор QUEUE). Колонка RETRY содержит информацию о числе транзактов, которые пытались дважды (и более раз) войти в эти блоки (неудачи могли быть связаны, например, если бы их обошли транзакты с более высоким приоритетом). Таковых в данном случае не было.

Ниже идёт информация об обслуживающих устройствах (в GPSS они называются FACILITY). В данном случае имеется только одно обслуживающее устройство (был один оператор SEIZE) по имени BARBER. По нему выдаётся следующая информация:

ENTRIES — число входов в обслуживающее устройство, равно 54 (столько обслужено транзактов);

UTIL — коэффициент использования (отношение времени работы к полному времени моделирования), составил 0,987 (максимально возможное число 1,000; вообще-то парикмахер работал всё время, так как к нему непрерывно была очередь, и поэтому коэффициент использования должен был бы быть равным 1,000, но в самом начале работы он немного подождал первого клиента и из-за этого коэффициент использования оказался всё же меньше 1,000);

AVE. TIME — среднее время обслуживания, оказалось равным 6,470 ед. времени;

AVAIL. — доступность обслуживающего устройства для очередных транзактов на момент окончания счёта характеризуется как "доступно" (стоит 1, если бы был 0, то было бы "недоступно"). Доступность или недоступность задаются программно: некоторые из устройств могут быть "выключенными" из работы (например, когда имитируется поломка);

OWNER — порядковый номер транзакта, обслуживаемого в данный момент, равен 98. Транзакты различаются в основном номерами (это их имена) и к транзактам обращаются по номерам;

PEND — число транзактов, ожидающих поступления на обслуживание и помещённых в специальную Цепь ожидания, равно 0 (их нет);

INTER — число транзактов, движение которых было принудительно прервано, равно 0 (их нет);

DELAY — число транзактов, ожидающих обслуживания и имеющих для этого необходимый приоритет, равно 1 (имеется 1 транзакт, очевидно, находящийся сейчас в очереди). Приоритет присваивается транзакту по сравнению с другими транзактами, и имеющие более высокий приоритет обслуживаются раньше других (вне очереди). Обычно изначально у всех транзактов одинаковый приоритет и они обслуживаются по очереди. Но приоритет можно изменять программно.

Аналогичные параметры рассчитаны и приведены для очереди. В программе имелась только одна очередь с именем BARBER. Одинаковые имена очереди и Обслуживающего устройства — совпадение. Имена могут быть разными. В то же время, программа никогда не спутает Очередь и Обслуживающее устройство с одинаковыми именами, так как эти элементы обрабатываются по-разному и имеют совершенно разные параметры. Иногда оказывается удобным давать Очереди и Обслуживающему устройству одинаковые имена, чтобы указать на их взаимосвязь. Для Очереди в отчёте указаны следующие параметры:

MAX — наибольшее (максимальное) число клиентов в очереди (выше в программе осуществляется проверка длины очереди и клиенты встают в очередь только при условии, что её длина не более 1 человека, поэтому длина очереди не могла превышать 2);

CONT. — текущее содержание очереди на момент окончания сеанса моделирования (в данном случае 2);

ENTRY — общее число вошедших в очередь клиентов с начала моделирования (счётчик клиентов), в данном случае через очередь прошло 55 клиентов (некоторые не стали становиться в очередь, когда там уже был клиент);

ENTRY(0) — общее число вошедших в очередь клиентов, не считая тех, кто не ждал в очереди, а прошёл через неё сразу (например, первый клиент всегда проходит сразу, так как в очереди вначале никого нет);

AVE.CONT. — среднее число клиентов в очереди, определяется как число клиентов, делённое на общее число вошедших в очередь клиентов;

AVE.TIME — среднее время нахождения клиента в очереди (в данном случае 10,628 мин), определяется как суммарное время нахождения в очереди всех клиентов (по каждому из них собирается такая информация), делённая на число вошедших клиентов;

AVE.(-0) — то же, что и AVE.TIME, но без учёта тех клиентов, которые не ждали в очереди и прошли её "насквозь";

RETRY — число попыток повторных входов, если бы были неудачи (в данном случае их нет).

Ниже находится информация о Таблицах гистограмм TABLE. В программе имеется одна такая таблица с именем WAITTIME. По ней приводятся следующие данные:

MEAN — среднее значение (в данном случае — среднее значение времени нахождения транзактов в очереди);

STD.DEV. — среднеквадратическое отклонение (в данном случае времени нахождения транзактов в очереди);

RANGE — область (первая колонка нижней таблицы — от и вторая колонка нижней таблицы — до);

RETRY — число попыток повторных входов, если бы были неудачи (в данном случае их нет).

FREQUENCY — число транзактов, время нахождения которых в очереди в рамках указанного диапазона времени;

CUM.% — процент транзактов, время нахождения которых в очереди в лежит внутри указанного диапазона времени, нарастающим итогом.

Ниже в Стандартном отчёте приводится содержимое Таблицы гистограмм TABLE, рассчитанной в ходе имитационного эксперимента. Эту таблицы можно переписать для удобства восприятия иначе, поменяв столбцы и строки (Таблица 1.1).

Таблица 1.1 — Таблица для гистограммы программы-примера

Время в очереди, мин от 0 до 2 от 2 до 4 от 4 до 6 от 6 до 8 от 8 до 10 от 10 до 12 от 12 до 14 от 14 до 16 от 16 до 18 от 18 до 20 от 20 до 22 от 22 до 24 от 24 до 26 от 26 до 28 от 28 до 30
Число тран-зактов                              
% 1,89 3,77 3,77 11,32 33,96 66,04 92,45 100,00              

В первой строке переписанной таблицы (Таблица 1.1) приводятся значения диапазона времени с шагом 2 минуты.

Во второй строке переписанной таблицы (Таблица 1.1) приводится число транзактов (клиентов), находившихся в очереди это время.

В третьей строке переписанной таблицы (Таблица 1.1) приводится процентное значение всех рассмотренных значений числа клиентов нарастающим итогом.

В частности, Таблица 1.1 означает, что 1 транзакт находился в очереди 2…4 минуты, 4 транзакта — 6…8 минут, 12 транзактов — 8…10 минут, 17 транзактов — 10…12 минут, 14 транзактов — 12…14 минут, 4 транзакта — 14…16 минут. Дольше 16 минут ни один транзакт в очереди не задерживался. Проценты можно трактовать следующим образом: 3,77% транзактов находились в очереди до 4 минут, 11,32% транзактов — до 8 минут, 33,96% транзактов — до 10 минут, 66,04% транзактов — до 12 минут, 92,45% транзактов — до 14 минут, все транзакты находились в очереди не более 16 минут.

Внешний вид гистограммы можно посмотреть, пройдя по меню: Window → Simulation window → Table Window (Рисунок 1.8).

Рисунок 1.8 — Гистограмма в Окне гистограмм Table Window

Из строки в тексте программы

Waittime QTABLE Barber,0,2,15

следует, что в Таблице с именем Waittime собирается информация об Очереди Barber. Эта информация представляет собой данные о том, сколько времени провели транзакты в данной Очереди. Всего необходимо собрать 15 интервалов времени с шагом 2 минуты. Смысл полученной гистограммы (Рисунок 1.8) рассмотрен выше с применением таблицы (Таблица 1.1).

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

Гистограммы являются весьма распространённым инструментом визуального анализа результатов. В частности, по ним можно видеть, какие именно значения (в данном случае времени нахождения в очереди) встречались чаще всего. По графику (Рисунок 1.8) видно, что больше всего транзактов находилось в очереди от 10 до 12 минут (наибольший столбец графика), на втором месте — транзакты, находившиеся в очереди от 12 до 14 минут (правее наибольшего столбца графика), на третьем месте — транзакты, находившиеся в очереди от 8 до 10 минут (левее наибольшего столбца) и т. д.

Работа программы фиксируется в Журнале Journal, который автоматически появляется в специальном окне. В данном случае Журнал содержит следующие записи:

 


Дата добавления: 2015-12-17; просмотров: 48; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!