ВВЕДЕНИЕ
Процессы функционирования различных систем и сетей связи могут быть представлены той или иной совокупностью систем массового обслуживания (СМО) - стохастических, динамических, дискретно-непрерывных математических моделей. Исследование характеристик таких моделей может проводиться либо аналитическими методами, либо путем имитационного моделирования [1-6].
Имитационная модель отображает стохастический процесс смены дискретных состояний СМО в непрерывном времени в форме моделирующего алгоритма. При его реализации на ЭВМ производится накопление статистических данных по тем атрибутам модели, характеристики которых являются предметом исследований. По окончании моделирования накопленная статистика обрабатывается, и результаты моделирования получаются в виде выборочных распределений исследуемых величин или их выборочных моментов. Таким образом, при имитационном моделировании систем массового обслуживания речь всегда идет о статистическом имитационном моделировании [5;6].
Сложные функции моделирующего алгоритма могут быть реализованы средствами универсальных языков программирования (Паскаль, Си), что предоставляет неограниченные возможности в разработке, отладке и использовании модели. Однако подобная гибкость приобретается ценой больших усилий, затрачиваемых на разработку и программирование весьма сложных моделирующих алгоритмов, оперирующих со списковыми структурами данных. Альтернативой этому является использование специализированных языков имитационного моделирования [5-7].
Специализированные языки имеют средства описания структуры и процесса функционирования моделируемой системы, что значительно облегчает и упрощает программирование имитационных моделей, поскольку основные функции моделирующего алгоритма при этом реализуются автоматически. Программы имитационных моделей на специализированных языках моделирования близки к описаниям моделируемых систем на естественном языке, что позволяет конструировать сложные имитационные модели пользователям, не являющимся профессиональными программистами. Одним из наиболее эффективных и распространенных языков моделирования сложных дискретных систем является в настоящее время язык GPSS [1;4;7]. Он может быть с наибольшим успехом использован для моделирования систем, формализуемых в виде систем массового обслуживания. В качестве объектов языка используются аналоги таких стандартных компонентов СМО, как заявки, обслуживающие приборы, очереди и т.п. Достаточный набор подобных компонентов позволяет конструировать сложные имитационные модели, сохраняя привычную терминологию СМО. На персональных компьютерах (ПК) типа IBM/PC язык GPSS реализован в рамках пакета прикладных программ GPSS/PC [8]. Основной модуль пакета представляет собой интегрированную среду, включающую помимо транслятора со входного языка средства ввода и редактирования текста модели, ее отладки и наблюдения за процессом моделирования, графические средства отображения атрибутов модели, а также средства накопления результатов моделирования в базе данных и их статистической обработки. Кроме основного модуля в состав пакета входит модуль создания стандартного отчета GPSS/PC, а также ряд дополнительных модулей и файлов. В данном издании, состоящем из двух частей, излагаются основы моделирования систем и сетей связи с использованием пакета GPSS/PC. В первой части рассматриваются основные понятия и средства GPSS/PC, приемы конструирования GPSS-моделей и технология работы с пакетом. Изложение материала сопровождается небольшими учебными примерами. Относительно подробное рассмотрение языка GPSS/PC вызвано отсутствием в литературе учебного материала по данной версии языка. Во второй части рассматриваются примеры GPSS-моделей различных систем и сетей массового обслуживания, используемых для формализации процессов функционирования систем и сетей связи. Приводится также ряд примеров моделирования систем и сетей связи с использованием GPSS/PC. Подробно комментируются тексты GPSS-моделей и результаты моделирования. 1. ОБЩИЕ СВЕДЕНИЯ О GPSS/PC Исходная программа на языке GPSS/PC, как и программа на любом языке программирования, представляет собой последовательность операторов. Операторы GPSS/PC записываются и вводятся в ПК в следующем формате:
номер _строки имя операция операнды ; комментарии Все операторы исходной программы должны начинаться с номера 0_строки - целого положительного числа от 1 до 9999999. После ввода операторов они располагаются в исходной программе в соответствии с нумерацией строк. Обычно нумерация производится с некоторым шагом, отличным от 1, чтобы иметь возможность добавления операторов в нужное место исходной программы. Некоторые операторы удобно вводить, не включая их в исходную программу. Такие операторы вводятся без номера строки.
В настоящем издании при описании формата операторов и в примерах моделей номера строк будут опускаться для лучшей читаемости текста.Отдельные операторы могут иметь имя для ссылки на эти операторы в других операторах. Если такие ссылки отсутствуют, то этот элемент оператора не является обязательным.
В поле операции записывается ключевое слово (название оператора), указывающее конкретную функцию, выполняемую данным оператором. Это поле оператора является обязательным. У некоторых операторов поле операции включает в себя также вспомогательный операнд. В полях операндов записывается информация, уточняющая и конкретизирующая выполнение функции, определенной в поле операции. Эти поля в зависимости от типа операции содержат до семи операндов, расположенных в определенной последовательности и обозначаемых обычно первыми буквами латинского алфавита от A до G. Некоторые операторы вообще не имеют операндов, а в некоторых операнды могут быть опущены, при этом устанавливаются их стандартные значения (по умолчанию). При записи операндов используется позиционный принцип: пропуск операнда отмечается запятой. Необязательные комментарии в случае их присутствия отделяются от поля операндов точкой с запятой. Комментарии не могут содержатьбукв русского алфавита.
Операторы GPSS/PC записываются, начиная с первой позиции, всвободном формате, т.е. отдельные поля разделяются произвольным количеством пробелов. При вводе исходной программы в интегрированной среде GPSS/PC размещение отдельных полей операторов с определенным количеством интервалов между ними производится автоматически. Каждый оператор GPSS/PC относится к одному из четырех типов: операторы-блоки, операторы определения объектов, управляющие операторы и операторы-команды.
Операторы-блоки формируют логику модели. В GPSS/PC имеется около 50 различных видов блоков, каждый из которых выполняет свою конкретную функцию. За каждым из таких блоков стоит соответствующая подпрограмма транслятора, а операнды каждого блока служат параметрами этой подпрограммы.
Операторы определения объектов служат для описания параметров некоторых объектов GPSS/PC (о самих объектах речь пойдет дальше).Примерами параметров объектов могут быть количество каналов в многоканальной системе массового обслуживания, количество строк и столбцов матрицы и т.п.
Управляющие операторы служат для управления процессом моделирования (прогоном модели). Операторы-команды позволяют управлять работой интегрированной среды GPSS/PC. Управляющие операторы и операторы-команды обычно не включаются в исходную программу, а вводятся непосредственно с клавиатуры ПК в процессе интерактивного взаимодействия с интегрированной средой.
После трансляции исходной программы в памяти ПК создается так называемая текущая модель, являющаяся совокупностью разного типа объектов, каждый из которых представляет собой некоторый набор чисел в памяти ПК, описывающих свойства и текущее состояние объекта.
Объекты GPSS/PC можно разделить на семь классов:
динамические, операционные, аппаратные, статистические, вычислительные, запоминающие и группирующие. Динамические объекты, соответствующие заявкам в системах массового обслуживания, называются в GPSS/PC транзактами. Они "создаются" и "уничтожаются" так, как это необходимо по логике модели в процессе моделирования. С каждым транзактом может быть связано произвольное число параметров, несущих в себе необходимую информацию об этом транзакте. Кроме того, транзакты могут иметь различные приоритеты.
Операционные объекты GPSS/PC, называемые блоками, соответствуют операторам-блокам исходной программы. Они, как уже говорилось, формируют логику модели, давая транзактам указания: куда идти и что делать дальше. Модель системы на GPSS/PC можно представить совокупностью блоков, объединенных в соответствии с логикой работы реальной системы в так называемую блок-схему. Блок-схема модели может быть изображена графически, наглядно показывая взаимодействие блоков в процессе моделирования.
Аппаратные объекты GPSS/PC - это абстрактные элементы, на которые может быть расчленено (декомпозировано) оборудование реальной системы. К ним относятся одноканальные и многоканальные устройства и логические переключатели. Многоканальное устройство иногда называют памятью.
Одноканальные и многоканальные устройства соответствуют обслуживающим приборам в СМО. Одноканальное устройство, которое для краткости далее будем называть просто устройством, может обслуживать одновременно только один транзакт. Многоканальное устройство (МКУ) может обслуживать одновременно несколько транзактов. Логические переключатели (ЛП) используются для моделирования двоичных состояний логического или физического характера. ЛП может находиться в двух состояниях: включено и выключено. Его состояние может изменяться в процессе моделирования, а также опрашиваться для принятия определенных решений.
Статистические объекты GPSS/PC служат для сбора и обработки статистических данных о функционировании модели. К ним относятся очереди и таблицы . Каждая очередь обеспечивает сбор и обработку данных о транзактах, задержанных в какой-либо точке модели, например перед одноканальным устройством. Таблицы используются для получения выборочных распределений некоторых случайных величин, например времени пребывания транзакта в модели.
К вычислительным объектам GPSS/PC относятся переменные (арифметические и булевские) и функции. Они используются для вычисления некоторых величин, заданных арифметическими или логическими выражениями либо табличными зависимостями.
Запоминающие объекты GPSS/PC обеспечивают хранение в памяти ПК отдельных величин, используемых в модели, а также массивов таких величин. К ним относятся так называемые сохраняемые величины и матрицы сохраняемых величин.
К объектам группирующего класса относятся списки пользователя и группы. Списки пользователя используются для организации очередей с дисциплинами, отличными от дисциплины "раньше пришел – раньше обслужен". Группы в данном издании рассматриваться не будут.
Каждому объекту того или иного класса соответствуют числовые атрибуты, описывающие его состояние в данный момент модельного времени. Кроме того, имеется ряд так называемых системных атрибутов, относящихся не к отдельным объектам, а к модели в целом. Значения атрибутов всех объектов модели по окончании моделирования Выводятся в стандартный отчет GPSS/PC. Большая часть атрибутов доступна программисту и составляет так называемые стандартные числовые атрибуты (СЧА), 0которые могут использоваться в качестве операндов операторов исходной программы. Все СЧА в GPSS/PC являются целыми числами.
Каждый объект GPSS/PC имеет имя и номер. Имена объектам даются в различных операторах исходной программы, а соответствующие им номера транслятор присваивает автоматически. Имя объекта представляет собой начинающуюся с буквы последовательность букв латинского алфавита, цифр и символа "подчеркивание". При необходимости имени любого объекта, кроме имени блока, можно поставить в соответствие любой номер с помощью оператора описания EQU, имеющего следующий формат:
имя EQU номер
Блокам присваиваются их порядковые номера в исходной программе (не путать с номерами строк!).
Для ссылки 0на какой-либо стандартный числовой атрибут некоторого объекта соответствующий операнд оператора исходной программы записывается одним из следующих способов:
СЧА $имя
;
СЧА j
, где СЧА - системное обозначение (название) конкретного стандартного числового атрибута данного объекта; имя - имя объекта; j - номер объекта; $ - символ-разделитель.
Прогон текущей модели, т.е. собственно моделирование, выполняется с помощью специальной управляющей программы, которую называют симулятором (от английского SIMULATE - моделировать, имитировать). Работа GPSS-модели под управлением симулятора заключается в перемещении транзактов от одних блоков к другим, аналогично тому, как в моделируемой СМО перемещаются заявки, соответствующие транзактам. В начальный момент времени в GPSS-модели нет ни одного транзакта. В процессе моделирования симулятор генерирует транзакты в определенные моменты времени в соответствии с теми логическими потребностями, которые возникают в моделируемой системе. Подобным же образом транзакты покидают модель в определенные моменты времени в зависимости от специфики моделируемой системы. В общем случае в модели одновременно существует большое число транзактов, однако в каждый момент времени симулятор осуществляет продвижение только какого-либо одного транзакта. Если транзакт начал свое движение, он перемещается от блока к блоку по пути, предписанному блок-схемой. В тот момент, когда транзакт входит в некоторый блок, на исполнение вызывается подпрограмма симулятора, соответствующая типу этого блока, а после ее выполнения, при котором реализуется функция данного блока, транзакт "пытается" войти в следующий блок. Такое продвижение транзакта продолжается до тех пор, пока не произойдет одно из следующих возможных событий: 1) транзакт входит в блок, функцией которого является удаление транзакта из модели; 2) транзакт входит в блок, функцией которого является задержка транзакта на некоторое определенное в модели время; 3) транзакт "пытается" войти в следующий блок, однако блок "отказывается" принять его. В этом случае транзакт остается в том блоке, где находился, и позднее будет повторять свою попытку войти в следующий блок. Когда условия в модели изменятся, такая попытка может оказаться успешной, и транзакт сможет продолжить свое перемещение по блок-схеме.
Если возникло одно из описанных выше условий, обработка данного транзакта прекращается, и начинается перемещение другого транзакта.
Таким образом, выполнение моделирования симулятором продолжается постоянно.
Проходя через блоки модели, каждый транзакт вносит вклад в содержимое счетчиков блоков. Значения этих счетчиков доступны программисту через СЧА блоков: W - текущее содержимое блока и N – общее количество входов в блок.
Каждое продвижение транзакта в модели является событием, которое должно произойти в определенный момент модельного времени. Для того, чтобы поддерживать правильную временную последовательность событий, симулятор имеет таймер модельного времени, который автоматически корректируется в соответствии с логикой, предписанной моделью.
Таймер GPSS/PC имеет следующие особенности:
1) регистрируются только целые значения (все временные интервалы в модели изображаются целыми числами);
2) единица модельного времени определяется разработчиком модели, который задает все временные интервалы в одних и тех же, выбранных им единицах;
3) симулятор не анализирует состояние модели в каждый следующий момент модельного времени (отстоящий от текущего на единицу модельного времени), а продвигает таймер к моменту времени, когда происходит ближайшее следующее событие.
Значения таймера доступны программисту через системные СЧА C1 (относительное время) и AC1 (абсолютное время).
Центральной задачей, выполняемой симулятором, является определение того, какой транзакт надо выбрать следующим для продвижения в модели, когда его предшественник прекратил свое продвижение. С этой целью симулятор рассматривает каждый транзакт как элемент некоторого списка. В относительно простых моделях используются лишь два основных списка: список текущих событий и список будущих событий.
Список текущих событий включает в себя те транзакты, планируемое время продвижения которых равно или меньше текущего модельного времени (к последним относятся транзакты, движение которых было заблокировано ранее). Он организуется в порядке убывания приоритетов транзактов, а в пределах каждого уровня приоритета - в порядке поступления транзактов.
Список будущих событий включает в себя транзакты, планируемое время продвижения которых больше текущего времени, т.е. события, связанные с продвижением этих транзактов, должны произойти в будущем. Этот список организуется в порядке возрастания планируемого времени продвижения транзактов.
Симулятор GPSS/PC помещает транзакты в зависимости от условий в модели в тот или иной список и переносит транзакты из списка в список, просматривает списки, выбирая следующий транзакт для обработки, корректирует таймер модельного времени после обработки всех транзактов в списке текущих событий. 2. ОСНОВНЫЕ БЛОКИ GPSS/PC И СВЯЗАННЫЕ С НИМИ ОБЪЕКТЫ
2.1. Блоки, связанные с транзактами
С транзактами связаны блоки создания, уничтожения, задержки транзактов, изменения их атрибутов и создания копий транзактов.
Для создания транзактов, входящих в модель, служит блок GENERATE (генерировать), имеющий следующий формат:
имяGENERATEA,B,C,D,E
В поле A задается среднее значение интервала времени между моментами поступления в модель двух последовательных транзактов. Если этот интервал постоянен, то поле B не используется. Если же интервал поступления является случайной величиной, то в поле B указывается модификатор среднего значения, который может быть задан в виде модификатора-интервала или модификатора-функции.
Модификатор-интервал используется, когда интервал поступления транзактов является случайной величиной с равномерным законом распределения вероятностей. В этом случае в поле B может быть задан любой СЧА, кроме ссылки на функцию, а диапазон изменения интервала поступления имеет границы A-B, A+B.
Например, блок
GENERATE100,40 создает транзакты через случайные интервалы времени, равномерно распределенные на отрезке [60;140].
Модификатор-функция используется, если закон распределения интервала поступления отличен от равномерного. В этом случае в поле B должна быть записана ссылка на функцию (ее СЧА), описывающую этот закон, и случайный интервал поступления определяется, как целая часть произведения поля A (среднего значения) на вычисленное значение функции.
В поле C задается момент поступления в модель первого транзакта. Если это поле пусто или равно 0, то момент появления первого транзакта определяется операндами A и B.
Поле D задает общее число транзактов, которое должно быть создано блоком GENERATE. Если это поле пусто, то блок генерирует неограниченное число транзактов до завершения моделирования. В поле E задается приоритет, присваиваемый генерируемым транзактам. Число уровней приоритетов неограничено, причем самый низкий приоритет - нулевой. Если поле E пусто, то генерируемые транзакты имеют нулевой приоритет.
Транзакты имеют ряд стандартных числовых атрибутов. Например, СЧА с названием PR позволяет ссылаться на приоритет транзакта. СЧА с названием M1 содержит так называемое резидентное время транзакта, т.е. время, прошедшее с момента входа транзакта в модель через блок GENERATE. СЧА с названием XN1 содержит внутренний номер транзакта, который является уникальным и позволяет всегда отличить один транзакт от другого. В отличие от СЧА других объектов, СЧА транзактов не содержат ссылки на имя или номер транзакта. Ссылка на СЧА транзакта всегда относится к активному транзакту, т.е. транзакту, обрабатываемому в данный момент симулятором.
Важными стандартными числовыми атрибутами транзактов являются значения их параметров. Любой транзакт может иметь неограниченное число параметров, содержащих те или иные числовые значения. Ссылка на этот СЧА транзактов всегда относится к активному транзакту и имеет вид Pj или Р$ имя, где j и имя - номер и имя параметра соответственно. Такая ссылка возможна только в том случае, если параметр с указанным номером или именем существует, т.е. в него занесено какое-либо значение.
Для присваивания параметрам начальных значений или изменения этих значений служит блок ASSIGN (присваивать), имеющий следующий формат:
имя ASSIGNA,B,C
В поле A указывается номер или имя параметра, в который за носится значение операнда B. Если в поле A после имени (номера) па раметра стоит знак + или -, то значение операнда B добавляется или вычитается из текущего содержимого параметра. В поле С может быть указано имя или номер функции-модификатора, действующей аналогично функции-модификатору в поле B блока GENERATE.
Например, блок
ASSIGN5,0 записывает в параметр с номером 5 значение 0, а блок
ASSIGNCOUNT+,1 добавляет 1 к текущему значению параметра с именем COUNT.
Для записи текущего модельного времени в заданный параметр транзакта служит блок MARK (отметить), имеющий следующий формат:
имя MARKA
В поле A указывается номер или имя параметра транзакта, в ко торый заносится текущее модельное время при входе этого транзакта в блок MARK. Содержимое этого параметра может быть позднее использо вано для определения транзитного времени 0пребывания транзакта в какой-то части модели с помощью СЧА с названием MP.
Например, если на входе участка модели поместить блок
MARKMARKER
, то на выходе этого участка СЧА MP$MARKER будет содержать разность между текущим модельным временем и временем, занесенным в параметр MARKER блоком MARK.
Если поле A блока MARK пусто, то текущее время заносится на место отметки времени входа транзакта в модель, используемой при определении резидентного времени транзакта с помощью СЧА M1.
Для изменения приоритета транзакта служит блок PRIORITY (прио ритет), имеющий следующий формат:
имяPRIORITYA,B
В поле A записывается новый приоритет транзакта. В поле B мо жет содержаться ключевое слово BU, при наличии которого транзакт, вошедший в блок, помещается в списке текущих событий после всех остальных транзактов новой приоритетной группы, и список текущих событий просматривается с начала. Использование такой возможности будет рассмотрено ниже.
Для удаления транзактов из модели служит блок TERMINATE (за вершить), имеющий следующий формат:
имяTERMINATEA
Значение поля A указывает, на сколько единиц уменьшается со держимое так называемого счетчика завершений при входе транзакта в данный блок TERMINATE. Если поле A не определено, то оно считается равным 0, и транзакты, проходящие через такой блок, не уменьшают содержимого счетчика завершений.
Начальное значение счетчика завершений устанавливается управ ляющим оператором START (начать), предназначенным для запуска про гона модели. Поле A этого оператора содержит начальное значение счетчика завершений (см. разд. 3). Прогон модели заканчивается, когда содержимое счетчика завершений обращается в 0. Таким образом, в модели должен быть хотя бы один блок TERMINATE с непустым полем A, иначе процесс моделирования никогда не завершится.
Текущее значение счетчика завершений доступно программисту че рез системный СЧА TG1.
Участок блок-схемымодели, связанный с парой блоков GENERATE-ТERMINATE, называется сегментом. Простые модели могут состоять из одного сегмента, в сложных моделях может быть несколько сегментов. Например, простейший сегмент модели, состоящий всего из двух блоков GENERATE и TERMINATE и приведенный на рис. 1, в совокупности с управлящим оператором START моделирует процесс создания случайного потока транзактов, поступащих в модель со средним интервалом в 100 единиц модельного времени, и уничтожения этих транзактов. Начальное значение счетчика завершений равно 1000. Каждый транзакт, проходящий через блок TERMINATE, вычитает из счетчика единицу, и таким образом моделирование завершится, когда тысячный по счету транзакт войдет в блок TERMINATE. При этом точное значение таймера в момент завершения прогона непредсказуемо. Следовательно, в приведенном примере продолжительность прогона устанавливается не по модельному времени, а по количеству транзактов, прошедших через модель.
GENERATE100,40
TERMINATE 1
START1000
Если необходимо управлять продолжительностью прогона по модельному времени, то в модели используется специальный сегмент, называемый сегментом таймера.
GENERATE100,40
TERMINATE
GENERATE100000
TERMINATE 1
START1
Например, в модели из двух сегментов, приведенной на рис. 2, первый (основной) сегмент выполняет те же функции, что и в предыдущем примере. Заметим, однако, что поле A блока TERMINATE в первом сегменте пусто, т.е. уничтожаемые транзакты не уменьшают содержимого счетчика завершений. Во втором сегменте блок GENERATE создаст первый транзакт в момент модельного времени, равный 100000. Но этот транзакт окажется и последним в данном сегменте, так как, войдя в блок TERMINATE, он обратит в 0 содержимое счетчика завершений, установленное оператором START равным 1. Таким образом, в этой модели гарантируется завершение прогона в определенный момент модельного времени, а точное количество транзактов, прошедших через модель, непредсказуемо. В приведенных примерах транзакты, входящие в модель через блок GENERATE, в тот же момент модельного времени уничтожались в блоке TERMINATE. В моделях систем массового обслуживания заявки обслуживаются приборами (каналами) СМО в течение некоторого промежутка времени прежде, чем покинуть СМО. Для моделирования такого обслуживания, т.е. для задержки транзактов на определенный отрезок модельного времени, служит блок ADVANCE (задержать), имеющий следующий формат:
имяADVANCEA,B
Операнды в полях A и B имеют тот же смысл, что и в соответствующих полях блока GENERATE. Следует отметить, что транзакты, входящие в блок ADVANCE, переводятся из списка текущих событий в список будущих событий, а по истечении вычисленного времени задержки возвращаются назад, в список текущих событий, и их продвижение по блок-схеме продолжается. Если вычисленное время задержки равно 0, то транзакт в тот же момент модельного времени переходит в следующий блок, оставаясь в списке текущих событий.
Например, в сегменте, приведенном на рис. 3, транзакты, поступающие в модель из блока GENERATE через случайные интервалы времени, имеющие равномерное распределение на отрезке [60;140], попадают в блок ADVANCE. Здесь определяется случайное время задержки транзакта, имеющее равномерное распределение на отрезке [30;130], и транзакт переводится в список будущих событий. По истечении времени задержки транзакт возвращается в список текущих событий и входит в блок TERMINATE, где уничтожается. Заметим, что в списке будущих событий, а значит и в блоке ADVANCE может одновременно находиться произвольное количество транзактов.
GENERATE100,40
ADVANCE 80,50
TERMINATE 1 В рассмотренных выше примерах случайные интервалы времени подчинялись равномерному закону распределения вероятностей. Для получения случайных величин с другими распределениями в GPSS/PC используются вычислительные объекты: переменные и функции. Как известно, произвольная случайная величина связана со случайной величиной R, имеющей равномерное распределение на отрезке [0;1], через свою обратную функцию распределения. Для некоторых случайных величин уравнение связи имеет явное решение, и значение случайной величины с заданным распределением вероятностей может быть вычислено через R по формуле. Так, например, значение случайной величины E с показательным (экспоненциальным) распределением с параметром d вычисляется по формуле:
E= -(1/d) * ln(R) Напомним, что параметр d имеет смысл величины, обратной математическому ожиданию E, а, следовательно, 1/d - математическое ожидание (среднее значение) случайной величины E. Для получения случайной величины R с равномерным распределением на отрезке [0;1] в GPSS/PC имеются встроенные генераторы случайных чисел. Для получения случайного числа путем обращения к такому генератору достаточно записать системный СЧА RN с номером генератора, например RN1. Правда, встроенные генераторы случайных чисел GPSS/PC дают числа не на отрезке [0;1], а целые случайные числа, равномерно распределенные от 0 до 999, но их нетрудно привести к указанному отрезку делением на 1000.
Проще всего описанные вычисления в GPSS/PC выполняются с использованием арифметических переменных. Они могут быть целыми и действительными. Целые переменные определяются перед началом моделирования с помощью оператора определения VARIABLE (переменная), имеющего следующий формат:
имяVARIABLEвыражение
Здесь имя - имя переменной, используемое для ссылок на нее, а выражение - арифметическое выражение, определяющее переменную. Арифметическое выражение представляет собой комбинацию операндов, в качестве которых могут выступать константы, СЧА и функции, знаков арифметических операций и круглых скобок. Следует заметить, что знаком операции умножения в GPSS/PC является символ # (номер). Результат каждой промежуточной операции в целых переменных преобразуется к целому типу путем отбрасывания дробной части, и, таким образом, результатом операции деления является целая часть частного.
Действительные переменные 0определяются перед началом моделирования с помощью оператора определения FVARIABLE, имеющего тот же формат, что и оператор VARIABLE. Отличие действительных переменных от целых заключается в том, что в действительных переменных все промежуточные операции выполняются с сохранением дробной части чисел, и лишь окончательный результат приводится к целому типу отбрасыванием дробной части. Арифметические переменные обоих типов имеют единственный СЧА с названием V, значением которого является результат вычисления арифметического выражения, определяющего переменную. Вычисление выражения производится при входе транзакта в блок, содержащий ссылку на СЧА V с именем переменной. Действительные переменные могут быть использованы для получения случайных интервалов времени с показательным законом распределения. Пусть в модели из примера на рис. 3 распределения времени поступления транзактов и времени задержки должны иметь показательный закон. Это может быть сделано так, как показано на рис. 4.
TARRFVARIABLE -100#LOG((1+RN1)/1000)
TSRVFVARIABLE -80#LOG((1+RN1)/1000)
GENERATE V$TARR
ADVANCEV$TSRV
TERMINATE 1
Рис. 4 Переменная с именем TARR задает выражение для вычисления интервала поступления со средним значением 100, вторая переменная с именем TSRV - для вычисления времени задержки со средним значением 80. Блоки GENERATE и ADVANCE содержат в поле A ссылки на соответствующие переменные, при этом поле B не используется, так как в поле A содержится случайная величина, не нуждающаяся в модификации.
Большинство случайных величин не может быть получено через случайную величину R с помощью арифметического выражения. Кроме того, такой способ является достаточно трудоемким, так как требует обращения к математическим функциям, вычисление которых требует десятков машинных операций. Другим возможным способом является использование вычислительных объектов GPSS/PC типа функция. Функции используются для вычисления величин, заданных табличными зависимостями. Каждая функция определяется перед началом моделирования с помощью оператора определения FUNCTION (функция), имеющего следующий формат:
имяFUNCTIONA,B Здесь имя - имя функции, используемое для ссылок на нее; A – стандартный числовой атрибут, являющийся аргументом функции; B - тип функции и число точек таблицы, определяющей функцию.
Существует пять типов функций. Рассмотрим вначале непрерывные числовые функции, тип которых кодируется буквой C. Так, например, в определении непрерывной числовой функции, таблица которой содержит 24 точки, поле B должно иметь значение C24.
При использовании непрерывной функции для генерирования случайных чисел ее аргументом должен быть один из генераторов случайных чисел RNj. Так, оператор для определения функции показательного распределения может иметь следующий вид:
EXPFUNCTIONRN1,C24 Особенностью использования встроенных генераторов случайных чисел RNj в качестве аргументов функций является то, что их значения в этом контексте интерпретируются как дробные числа от 0 до 0,999999.
Таблица с координатами точек функции располагается в строках, следующих непосредственно за оператором FUNCTION. Эти строки не должны иметь поля нумерации. Каждая точка таблицы задается парой Xi (значение аргумента) и Yi (значение функции), отделяемых друг от друга запятой. Пары координат отделяются друг от друга символом "/" и располагаются на произвольном количестве строк. Последовательность значений аргумента Xi должна быть строго возрастающей.
Как уже отмечалось, при использовании функции в поле B блоков GENERATE и ADVANCE вычисление интервала поступления или времени задержки производится путем умножения операнда A на вычисленное значение функции. Отсюда следует, что функция, используемая для генерирования случайных чисел с показательным распределением, должна описывать зависимость y=-ln(x), представленную в табличном виде. Оператор FUNCTION с такой таблицей, содержащей 24 точки для обеспечения достаточной точности аппроксимации, имеет следующий вид:
EXPFUNCTIONRN1,C24
0,0/.1,.104/.2,.222/.3,.355/.4,.509/.5,.69/.6,.915
.7,1.2/.75,1.38/.8,1.6/.84,1.85/.88,2.12/.9,2.3
.92,2.52/.94,2.81/.95,2.99/.96,3.2/.97,3.5/.98,3.9
.99,4.6/.995,5.3/.998,6.2/.999,7/.9998,8
Вычисление непрерывной функции производится следующим образом. Сначала определяется интервал (Xi;Xi+1), на котором находится текущее значение СЧА-аргумента (в нашем примере - сгенерированное значение RN1). Затем на этом интервале выполняется линейная интерполяция с использованием соответствующих значений Yi и Yi+1. Результат интерполяции усекается (отбрасыванием дробной части) и используется в качестве значения функции. Если функция служит операндом B блоков GENERATE или ADVANCE, то усечение результата производится только после его умножения на значение операнда A.
Использование функций для получения случайных чисел с заданным распределением дает хотя и менее точный результат за счет погрешностей аппроксимации, но зато с меньшими вычислительными затратами (несколько машинных операций на выполнение линейной интерполяции). Чтобы к погрешности аппроксимации не добавлять слишком большую погрешность усечения, среднее значение при использовании показательных распределений должно быть достаточно большим (не менее 50). Эта рекомендация относится и к использованию переменных.
Функции всех типов имеют единственный СЧА с названием FN, значением которого является вычисленное значение функции. Вычисление функции производится при входе транзакта в блок, содержащий ссылку на СЧА FN с именем функции.
Заменим в примере на рис. 4 переменные TARR и TSRV на функцию EXP (рис. 5).
Поскольку в обеих моделях используется один и тот же генератор RN1, интервалы поступления и задержки, вычисляемые в блоках GENERATE и ADVANCE, должны получиться весьма близкими, а может быть и идентичными. При большом количестве транзактов, пропускаемых через модель (десятки и сотни тысяч), разница в скорости вычислений должна стать заметной.
EXPFUNCTIONRN1,C24
0,0/.1,.104/.2,.222/.3,.355/.4,.509/.5,.69/.6,.915
.7,1.2/.75,1.38/.8,1.6/.84,1.85/.88,2.12/.9,2.3
.92,2.52/.94,2.81/.95,2.99/.96,3.2/.97,3.5/.98,3.9
.99,4.6/.995,5.3/.998,6.2/.999,7/.9998,8
GENERATE100,FN$EXP
ADVANCE 80,FN$EXP
TERMINATE 1
Рис. 5
Особенностью непрерывных функций является то, что они принимают "непрерывные" (но только целочисленные) значения в диапазоне от Y1 до Yn , где n - количество точек таблицы. В отличие от них дискретные числовые функции, тип которых кодируется буквой D в операнде B оператора определения функции, принимают только отдельные (дискретные) значения, заданные координатами Yi в строках, следующих за оператором определения FUNCTION. При вычислении дискретной функции текущее значение СЧА-аргумента, указанного в поле A оператора FUNCTION, сравнивается по условию