<label FUNCTION A,B,[C] основной формат
X1,Y1/X2,Y2/,…/Xn,Yn> точки функции
Label – ярлык употребляется в обязательном порядке и служит для идентификации функции .
А - не имеет значения по умолчанию, определяет независимую переменную функции (аргумент), например, если используется равномерное распределение и БСВ берётся с 3-го генератора, то запись будет иметь вид RN3 (randomnumber). Операнд может кодироваться дополнительным выражением. Единственным ограничением является то, что аргумент не может прямо или косвенно ссылаться на функцию для которой он является независимой переменной. Значения функции могут задаваться числом с плавающей точкой.
B - не имеет значения по умолчанию, состоит из двух символов ( без пробела), первый из которых представляет собой обозначение типа функции, вида: C- непрерывная числовая, D – дискретная числовая, L - список числовых значений, E - дискретная символьная, M – список дискретных символов, S- селектор объектов; второй символ представляет собой целое число связанных пар значений функции, которые представляют собой точки функции и приводятся во второй строке описания формата. Если используется символ S, то он уточняется операндом С, используемым только в этом случае .
С - по умолчанию равен 0, применяется для перечисления типов объектов, если используются объекты разных типов, то приводятся их символы, разделяемые запятой без пробелов.
Рассмотрим пример записи функции :
SERVTIME FUNCTION RN7,D5
2,4/.55,7.5/.7,10.5/.8,13.5/1,16.5
2.10 STORAGE (Запомнить )
Используется для определения ёмкости одной или нескольких памятей. Исполнение STORAGE (впрочем, как и всех рассмотренных ) происходит только после успешного завершения процесса компиляции, при этом вводится в действие оговорённое число ресурсовSTORAGE . STORAGE в силу своей специфики должен располагаться в модуле описания, до того как началось движение транзактов, так как после компиляции программа последовательно исполняет все, стоящие до первого START. Формат STORAGE может быть представлен двумя способами :
<label STORAGE A >,
Label - не имеет значения по умолчанию, отсутствие ярлыка приводит к ошибке компиляции. Ярлык является идентификатором памяти, ёмкость которой определяется. При этом формате можно определить только одну память.
А - не имеет значения по умолчанию, отсутствие приводит к ошибке компиляции. Операнд определяет ёмкость памяти, т.е. число моделируемых устройств обслуживания. Необходимо иметь в виду, что в этом формате можно использовать одну единицу ёмкости в заданный момент времени.
Приведём примеры записи:
1. SAM STORAGE 10,
2. 3 STORAGE 5.
В первом примере памяти SAM определяется ёмкость 10 , во втором примере памяти за номером 3 определяется ёмкость 5.
Используя многоканальное обслуживание можно не определять STORAGE, в этом случае ёмкость по умолчанию практически равна бесконечности ( а именно , 2147483647 ).
При записи во втором формате - <STORAGESname1,A/Sname2, B/Sname3,C … > - можно определять несколько памятей сразу. Определитель памяти представляет пары обозначений, разделённых запятой, между собой пары отделяются слешем. Вначале пишется символ памяти, а затем её имя – первый член пары, после запятой пишется операнд А,В, характеризующий ёмкость памяти второй член пары. Символ S может быть отделён от имени памяти символом $ или имя может быть включено в круглые скобки, памяти одинаковой ёмкости могут записываться через тире.
Рассмотрим пример GPSS-ной модели и текст программы на языке GPSS, соответствующий этой модели.
1 Представим модель графически (рисунок 2.1)
B1 B2 B3
- генератор
-накопитель
- устройство
Рисунок 2.1
Опишем сеть аналитически.
Количество узлов – 5.
1 узел - для источника (генератора) заявок.Закон поступления заявок -равномерный;
2 узел - обслуживающее устройство. Закон обслуживания – экспоненциальный;
3 узел - обслуживающее устройство. Закон обслуживания – экспоненциальный;
4 узел - обслуживающее устройство. Закон обслуживания – экспоненциальный;
5 узел - приемник. Поглощает по 1 заявке.
Матрица переходов для примера сети представлена на рисунке 2.2
- | 1 | 2 | 3 | 4 | 5 |
1 | 0 | 1 | 0 | 0 | 0 |
2 | 0 | 0 | 1 | 0 | 0 |
3 | 0 | 0,9 | 0 | 0,1 | 0 |
4 | 0,9 | 0 | 0 | 0 | 0,1 |
5 | 0 | 0 | 0 | 0 | 1 |
Рисунок 2.2 Матрица переходов для примера сети.
Модель на языке GPSSдолжна выглядеть так:
GENERATE 10
L3 QUEUE 1
SEIZE B1
DEPART 1
ADVANCE (EXPONENTIAL(1,0,2.1))
RELEASE B1
L1 QUEUE 1
SEIZE B2
DEPART 1
ADVANCE (EXPONENTIAL(1,0,6))
RELEASE B2
TRANSFER 0.9,L2,L1
L2 QUEUE 1
SEIZE B3
DEPART 1
ADVANCE (EXPONENTIAL(1,0,10))
RELEASE B3
TRANSFER 0.9,L4,L3
L4 TERMINATE 1
START 1000
Занесём данный текст в программу GPSS WORLD и получим стандартный отчёт.
В отчете собираются следующие статистические данные:
- START TIME – начальное значение времени моделирования;
- END TIME – конечное значение времени моделирование;
- BLOCKS – число блоков, использованных при моделировании;
- FACILITIES – число устройств, использованных при моделировании;
- STORAGE – число многоканальных устройств, использованных при моделировании.
Информация об устройствах содержит следующие колонки:
- FACILITY - имя устройства;
- ENTRIES - количество транзактов, входивших в устройство;
- UTIL. - коэффициент загрузки устройства;
- AVE.TIME - среднее время пребывания транзакта в устройстве;
- AVAILABLE - состояние устройства в момент окончания моделирования (1 - устройство доступно, 0 - недоступно);
- OWNER - номер последнего транзакта, вошедшего в устройство;
- PEND - количество транзактов, ожидающих выхода устройства из режима прерывания;
- INTER - количество транзактов, пребывание которых в устройстве было прервано;
- RETRY - количество транзактов, ожидающих каких-либо условий, зависящих от состояния данного устройства;
- DELAY - количество транзактов, ожидающих возможности входа в устройство (обычно это транзакты, находящиеся в очереди);
Информация об очередях содержит следующие колонки:
- QUEUE - имя очереди;
- MAX - максимальная длина очереди (т.е. количество транзактов в ней) за время моделирования;
- CONT.- длина очереди в момент окончания моделирования;
- ENTRIES - количество транзактов, входивших в очередь;
- ENTRIES(0) - количество транзактов, которым не потребовалось ждать в данной очереди (нулевые входы);
- AVE.CONT.- средняя длина очереди;
- AVE.TIME - среднее время пребывания транзактов в очереди;
- AVE.(-0) - среднее время пребывания транзактов в очереди без учета нулевых входов (т.е. без учета транзактов с нулевым временем пребывания в очереди);
- RETRY - количество транзактов, ожидающих каких-либо условий, зависящих от состояния данной очереди.
3 Проектирование системы
В окончательном виде любая программа представляет собой набор инструкций процессора. Всё, что написано на любом языке программирования, - более удобная, упрощённая запись этого набора инструкций, облегчающая написание, отладку и последующую модификацию программы. Чем выше уровень языка, тем в более простой форме записывается одни и те же действия.
С ростом объёма программы становится невозможным удерживать в памяти все детали, и становится необходимым структурировать информацию, выделять главное и отбрасывать несущественное. Этот процесс называется повышением степени абстракции программы.
Первым шагом к повышению абстракции является использование функции. Следующий шаг – описание собственных типов данных, позволяющих структурировать и группировать информацию.
Объединение в модули описаний типов данных и функций, предназначенных для работы с ними, со скрытием от пользователя модуля несущественных деталей, является дальнейшим развитием структуризации программы.
Введение понятия класса является естественным развитием идей модульности. В классе структуры данных и функции их обработки объединяются. Класс используется только через его интерфейс – детали реализации для пользователя класса несущественны.
Класс является типом данных, определяемым пользователем. В классе задаются свойства и поведение какого-либо предмета или процесса в виде полей данных (аналогично структуре) и функции для работы с ними. Создаваемый тип данных обладает практически теми же свойствами, что и стандартные типы. В нашей программе мы использовали три класса:
- Класс FuncStandart содержит описание всех стандартных функций, определённых языком имитационного моделирования GPSS.
В зависимости от выбранной пользователем функции вызывается соответствующий ей метод класса FuncStandart. Вызванный метод отправляет на консоль запрос пользователю на ввод параметров выбранной функции. В зависимости от введенныхпараметров, метод генерирует строку, содержащуюописание стандартной функции с уже заданными параметрами на языке имитационного моделирования GPSS.
- Класс GPSSOperatori содержит описание операторов языка имитационного моделирования GPSS.В зависимости от матрицы, сгенерированной в методе Matrixкласса GPSSText, вызываются соответствующие методы класса GPSSOperatori. Все методы класса возвращают строковое значение, содержащее описание требуемых операторов языка имитационного моделирования GPSS. Причем стандартные функции, которые используются в операторах как параметры, генерируются в классе FuncStandart.
- Класс GPSSText описывает сгенерированный текст языка имитационного моделирования GPSS. Во-первых, метод класса Matrix, выводит на консоль запрос об операторах узлов, содержащихся в имитационной модели и о движении транзакта по соответствующим узлам. В зависимости от полученных данных генерируется матрица переходов. Во-вторых, в методе Programma, по матрице переходов совершается соответствующий вызов метода классаGPSSOperatori. В конечном итоге, результат работы программы записывается в файл GPSStext.txt. Этот файл содержит окончательно сгенерированный текст программы на языке имитациооного моделирования GPSS.