Портал GPSS.RU    

Королев  А.Г.

anatoliygk@hotmail.com


Северодонецкий Технологический институт, Северодонецк, Украина.

Сравнение команд и блоков GPSS- World и Object GPSS.


 Введение


Имитационное моделирование, как и моделирование вообще – мощное средство для изучения сложных систем. Для имитационного моделирования используется целый спектр языков, в частности язык GPSS. Лучше всего он описан в известной книге Шрайбера Т. Дж. «Моделирование на GPSS» , которая также известна, как «красная книга». Эта книга является фундаментальным самоучителем по языку GPSS и прекрасно описывает как проблематику задач моделирования систем массового обслуживания, так и методы их решения с помощью данного языка.

Язык GPSS существует более 40 лет, и за время своего существования многократно подвергался нападкам как недостаточно гибкий и устаревший. Тем не менее, сам дискретно – событийный подход, заложенный в его основу, был достаточно прочен, чтобы обеспечить его жизнеспособность в течение всех этих десятилетий. Язык GPSS был и остается весьма эффективным при решении множества простых задач, посвященных исследованию систем массового обслуживания. Очень негативно на языке GPSS отразилось то, что в восьмидесятых годах фирма IBM прекратила его поддержку. Поэтому, его дальнейшая история связана c работой таких его энтузиастов, и даже можно сказать подвижников, как Thomas J. Schriber, Springer Cox, Julian Reitman, James O. Henriksen, Peter Lorenz, Ingolf Stahl и целый ряд других.

В целом, ценность такого языка как GPSS для исследования систем массового обслуживания не подлежит сомнению. Однако, многолетний опыт преподавания этого языка в университете, показал, что за годы своего развития, язык вобрал в себя и немало негативного, такого, что не выдержало проверку временем, и на сегодня мешает освоению GPSS студентами. Кроме того, этот язык, даже в новой версии, GPSS World, плохо сочетается с теми новыми возможностями, которые предоставляет программисту операционная система Windows. Короче говоря, назрела задача попытаться модернизировать язык GPSS, и расширить его возможности по работе с Windows.

 

Конкретные предложения

Попытка осмыслить эту проблему в целом, привела к пониманию, что начинать все нужно с погружения возможностей языка GPSS в один из хороших языков программирования, обеспечивающих эффективную работу с Windows. Естественно, что в первую очередь рассматривались возможности таких языков, как Delphi, С++ Builder и C# . Очевидно, что реализация основных блоков GPSS не так уж и сложна. Она включает в себя работу со списками заявок и работу с такими объектами, как очереди, устройства, таблицы, и так далее.

Вопрос о том, как реализовать порядок выполнения блоков, управляемый заявками, имеет свое очевидное решение. Нужно чтобы все блоки модели были оформлены как вызовы процедур и находились в операторе Switch для языка C++, или в операторе Case для языка Delphi. Тогда выбор нужного блока (вызова процедуры) можно выполнять на основе номера следующего блока активной заявки, которая продвигается в данный момент. После выполнения очередного блока, управление вновь передается активной заявке. Естественно, что в качестве блоков возможно использование не любых процедур языка высокого уровня, а только тех, которые обеспечивают корректную работу со списками заявок, в частности, с номерами текущего и следующего блока активной заявки.

Таким образом, основные блоки, команды и стандартные числовые атрибуты языка GPSS можно представить как процедуры и функции языка C++ или Delphi, причем код модели на GPSS может быть адекватно представлен как последовательность соответствующих вызовов процедур языка программирования. Например, это может выглядеть следующим образом на языке Delphi:

Procedure modeltxt (NextBlock:integer);

Begin With BL,SYS do case NextBlock of

{::ng1_} 1:ng1.Generate(100,90);

2: que1.Queue;

3: fac1.Seize;

4: que1.Depart;

5: Advance(95,90);

6: fac1.Release;

7: Buffer;

8: Terminate(1);

{//end_model}

Else modelerror;end;end;

Эквивалентный код на языке GPSS World выглядит следующим образом:

Generate 100,90

Queue que1

Seize fac1

Depart que1

Advance 95,90

Release fac1

Buffer

Terminate 1

Для представления списков заявок и работы с ними удобно использовать таблицы баз данных. Таблицы хорошо подходят и для представления X и P – параметров, а также для представления групп заявок и списков прерывания.

Развитие такой идеи построения моделей систем, привело к тому, что для языка Delphi были созданы процедуры, обеспечивающие возможность включения моделей, написанных в стиле GPSS в любую программу на языке Delphi. Как следствие этого, в модели, написанной в стиле GPSS, доступны все возможности самого языка Delphi. В частности, в такой модели можно легко использовать файлы для ввода и вывода данных, можно просто и естественно, отображать ход моделирования в виде графиков или перемещения компонентов. Можно описывать массивы и матрицы любых объектов модели, в частности, многоканальных устройств, списков пользователей, таблиц, числовых функций, и многого другого.

Достаточно просто здесь можно построить произвольную процедуру управления ходом моделирования, и сбора статистики, в том числе, и управляемую пользователем.

Здесь просто и естественно создаются исполнимые файлы (программы) – являющиеся моделями конкретных систем массового обслуживания. Нет никаких проблем в создании новых блоков для построения модели, в том числе и блоков, которые нужны только для конкретной модели. Фактически, возможности разработчика модели более не ограничены набором имеющихся блоков GPSS, а определяются только его потребностями.

Именно такая система для построения моделей в стиле GPSS и названа автором объектным GPSS. Некоторое увеличение времени набора кода модели и несколько большее процессорное времени моделирования, в сравнении, например, с GPSS World, с избытком компенсируется расширенными возможностями системы.

То, что для реализации системы выбран язык Delphi, а не C++, или, например, C# - не является принципиальным. Просто на этом языке код модели выглядит несколько более привычным, по сравнению с аналогичным кодом на языке C++. Однако, нет никаких принципиальных трудностей в построении аналогичной системы на языке C++. Правда язык Microsoft C++ плохо сочетается с идеологией предлагаемой системой, для Object GPSS больше подходят RAD языки ( Rapid Application Design).

В данной системе предусмотрена возможность прекращения моделирования, с сохранением текущего состояния модели. Это позволяет позднее продолжить моделирование именно с этого состояния.

В отличие от других версий GPSS, здесь предусмотрена типизация данных. Непосредственно в модели можно использовать следующие базовые типы данных: Integer, Double, Boolean, String. В этой связи, X и P параметры могут быть значениями любого из этих 4 типов.

В рассматриваемой системе, GPSS – модель представляет собой Include –файл, который вставляется в головную программу с помощью указания компилятору вида:

{$INCLUDE model}

Файл Model.pas содержит описание конкретной модели на Delphi в стиле GPSS.

Весь проект ObjectGPSSProject вместе с моделью, компилируется системой Delphi с получением конкретной модели, с которой уже можно проводить эксперименты.

Всего в проект входят 6 модулей:

ModelingUnit – модуль главной формы модели.

ModelUnit – модуль, в который помещается модель (файл Model.pas)

GPSS_SYS – модуль с основными командами и блоками Object GPSS, ядро всей системы.

AddModelUnit – модуль с дополнительными командами и блоками Object GPSS, используемыми для взаимодействия с главной формой.

InputBoxUnit – модуль с диалоговым окном ввода данных.

TableUnit - модуль с таблицами базы данных.

Все файлы проекта, кроме файла Model.pas , в принципе, не зависят от конкретной модели и вместо их кодов можно использовать DCU – файлы, то есть они могут быть представлены в виде уже откомпилированных частей, которые нуждаются только в сборке в единую программу. Правда, так как в модуль ModelUnit включается файл Model.pas , то для компиляции всего проекта нужен его код, то есть файл ModelUnit.pas .

Как следствие вышесказанного, при распространении системы нет нужды поставлять исходные коды наиболее важных частей модели, а можно ограничиться поставкой кодов модуля ModelUnit.

Взаимные связи модулей отражены на Рис.1.



Рис.1. Связи модулей проекта Object GPSS.



Пример полного файла Model.pas для приведенной выше модели, выглядит следующим образом.

// Model description auto.

Const modelname='E:\object GPSS\models\trial1.txt’;

ng1_=1; 

num_bl=8; 

{/sh} {//end_const}

{/sh} var

{/ng1} ng1: Tgenerate;

{/fac1} fac1: Tfacility;

{/que1} que1: Tqueue;

{/sh} {//end_var}

{/sh} {//end_proc_func}

{/sh} procedure initial; begin

{/ng1} tgenerate.init(ng1,ng1_,100,90);

{/fac1} Tfacility.init(fac1);

setstart(1000);

{/que1} Tqueue.init(que1);

{/sh} {//end_init} end;

{/sh} procedure closeallobj; begin {//begin_close}

{/que1} que1.freeobj;

{/fac1} fac1.freeobj;

{/ng1} ng1.freeobj;

{/sh} end;

{/sh} procedure resetall; begin

{/fac1} fac1.reset;

{/que1} que1.reset;

{/sh} {//end_reset} end;

{/sh} procedure modeltxt(NextBlock:integer);begin

With BL,SYS do case NextBlock of

{/ng1} {::ng1_} 1:ng1.Generate(100,90);

2: que1. Queue;

3: fac1.Seize;

4: que1.Depart;

5: Advance(95,90);

6: fac1.Release;

7: Buffer;

8: Terminate (1);

{/sh} {//end_model} else modelerror;end;end;

{/sh} procedure report; begin

{/fac1} fac1.report('fac1');

{/que1} que1.report('que1');

{/sh} {//end_report} end;

{/sh} procedure modeling(tg:integer); begin

{/sh} start(tg);

{/sh} end;

Этот файл содержит следующие части:

Описание констант, переменных и объектов модели.

Процедуру Initial, в которой выполняется инициализация всех переменных и объектов модели.

Процедуру CloseAllObj, в которой выполняется уничтожение всех переменных и объектов модели.

Процедуру ResetAll, в которой выполняется сброс статистики по объектам модели.

Процедуру ModelTxt, в которой и описывается собственно модель системы.

Процедуру Report, в которой выполняется формирование выходной статистики по объектам модели.

Процедуру Modeling, в которой указаны конкретные команды манипуляции с моделью.

В процедуре Modeling можно управлять моделью, и готовить ее к новому моделированию. В частности, можно менять значения X – параметров, функций, многоканальных устройств, таблиц, переменных и так далее.

Если используются массивы объектов, то в частях 2,3,4,6 модели, соответствующие вызовы процедур должны выполняться в циклах. Причем в части 3 цикл должен выполняться в обратном порядке.

Несмотря на кажущуюся громоздкость описания модели, практически все ее части, кроме «начинки» процедуры ModelTxt, создаются программой – конвертером формирования модели, по сути дела, автоматически.

В данном случае, корректировке была подвергнута только строка

{/ng1} tgenerate.init(ng1,ng1_,100,90);

и была вставлена строка

setstart(1000); .

Эта строка задает начальное значение счетчика завершений TG1 , отображаемое на главной форме.

Модель, в той форме, в какой она представлена в файле Model.pas, не удобна для разработки и модификации, поэтому ее лучше сохранять и создавать в некоторой промежуточной форме. И только непосредственно перед компиляцией их следует конвертировать, с тем, чтобы получить собственно файл модели Model.pas. Это также обеспечивает программа – конвертер.

Наиболее ценная часть всей системы – это модуль GPSS_SYS, который и обеспечивает собственно моделирование.

Головой модуль системы обеспечивает следующие возможности проведения опытов с моделью.

Запуск модели, то есть вызов процедуры Modeling с указанным значением счетчика TG1.

Временную, точнее досрочную остановку процесса моделирования, с возможностью продолжения текущего моделирования.

Полную очистку модели с возвратом ее в начальное состояние.

Сброс собранной статистики по модели.

Формирование полного или частичного отчета по моделированию.

Настройку перечня выводимой в отчет информации.

Просмотр выводимой в ходе моделирования, или выведенной по окончании моделирования графической информации.

Завершение моделирования, как с сохранением текущего состояния модели, так и без его сохранения.

Если для модели потребуется другая головная программа, то можно использовать и другую головную программу. Однако она должна соблюдать соглашения о связях. Естественно, это потянет за собой изменения и в других модулях проекта. Однако при соответствующе аккуратности, можно избежать перекомпиляции модуля GPSS_SYS.

Созданная программа может быть переименована и перенесена в другую папку, правда вместе с файлом, имя которого совпадает с именем файла модели в промежуточной форме. Его расширение должно быть GPR. Этот файл нужен для формирования отчета и подготавливается программой - конвертером.

Так как Object GPSS создает модели на основе классов объектов, то при работе с объектами вначале должно указываться имя объекта, затем точка, а затем, имя процедуры или функции из класса. Например, fac1.Seize – означает «занять устройство с именем fac1», fac1.Report('fac1') – «вывести отчет по устройству с именем fac1» и так далее.

Система Object GPSS содержит следующие классы объектов:

Класс TSYS, который содержит основные функции системы GPSS. Фактически это класс нужен только потому, что функции GPSS имеют слишком простые имена, которые могут понадобиться разработчику модели. Так, например, в GPSS – World есть СЧА M1 – текущее время жизни заявки, TG1 – текущее значение счетчика завершений. Аналогичные функции в Object GPSS будут выглядеть так SYS.M1 и SYS.TG1. Функции этого класса, в основном, совпадают с теми, которые есть, в GPSS World. К существенным изменениям набора функций можно отнести замену СЧА P и X на функции RP, IP, BP, SP, RX, IX, BX, SX, которые выдают значения вещественных, целых, логических и строковых P и X параметров соответственно.

В отличие от GPSS – World , X – параметры имеются не только у системы, но и у любого объекта, включая пустой объект, у которого ничего нет, кроме этих параметров. 

Класс TFUNCTION описывает числовые функции, эквивалентные функциям типов C и D в GPSS World. Аналоги остальных видов функций реализованы непосредственно в виде общих функций системы моделирования. Числовые функции можно задавать при их инициализации и при переопределении. Функции можно также выводить в виде графиков.

Класс TGENERATE описывает генераторы заявок, то есть фактически блоки GENERATE. Каждый блок GENERATE должен быть описан и проинициализирован. Дополнительно, у блока GENERATE может указываться условие, которое определяет, будет ли выпущена из него заявка. Приход новой заявки планируется, только если предыдущая заявка вышла из блока.

Класс TTABLE описывает таблицы, предназначенные для сбора статистики. Он пополнен процедурой, которая выводят таблицы в виде гистограмм.

Класс TQUEUE описывает очереди. Его процедуры и функции, по сути, не отличаются от аналогичных блоков и СЧА GPSS– World.

Класс TSTORAGE описывает многоканальные устройства. Он пополнен блоком SETSTORAGE, который устанавливает новую предельную емкость устройства, и блоком SETGOTO, который задает перенаправление заявок с входа устройства на другой блок, или обеспечивает запрет на вход заявок в многоканальное устройство.

Класс TFACILITY описывает одноканальные устройства. Для таких устройств также имеется блок SETGOTO, и несколько иначе построена система блоков для реализации прерываний, и для реализации доступности и недоступности устройства. А именно: блоки PREEMPT, RETURN, FAVAIL и FUNAVAIL заменены блоками EXTRACT, EXTRACTPREEMPT, PREEMPT, PREEMPT0, RETURN, RETURN0, которые удаляют обслуживаемые и прерванные на устройстве заявки, прерывает обслуживание заявки с занятием и без занятия устройства, а также возвращает из прерывания заявку после обслуживания текущей заявки или принудительно, после периода недоступности устройства.

Классы TGROUP, TIGROUP, TSGROUP описывают группы для вещественных чисел, целых чисел и для строк. Их процедуры и функции, по сути, мало отличаются от аналогичных блоков и СЧА GPSS World.

Класс TTGROUP описывает группы заявок. Его набор функций и процедур заметно расширен, в первых, за счет типизации данных, то есть в данном случае P – параметров, а во вторых, за счет обеспечения доступа к параметрам заявок из списка группы при отборе нужных заявок. Отбор нужных заявок и изменение значений их P – параметров ведется с помощью отдельно описанных функцию выбора и функций вычисления значений. Эта особенность повышает возможности блоков работы с группами заявок. В этом классе блоки SCAN и ALTER заменены блоками RSCAN, ISCAN, BSCAN, SSCAN и RALTER, IALTER, BALTER, SALTER, которые отыскивают и изменяют значения вещественных, целых, логических и строковых P параметров соответственно.

Класс TUSER описывает списки пользователя. Его набор функций заметно расширен за счет доступа к параметрам заявок из списка пользователя при выборе удаляемых заявок. Отбор нужных заявок ведется с помощью отдельно описанных функцию выбора. Эта особенность повышает возможности блоков работы со списками пользователя.

Набор блоков, которые используются без объектов, в основном, совпадает с теми, которые есть в обычном GPSS. Формально, все они отнесены к объекту BL. Однако здесь возможно присваивание значений переменным, в том числе элементам массивов. Для этого используются блоки RLET, ILET, BLET, SLET для вещественных, целых, логических и строковых переменных соответственно.

P и X - параметры – типизированы, а поэтому вместо блоков ASSIGN и SAVEVALUE используются блоки RASSIGN, IASSIGN, BASSIGN, SASSIGN и RSAVEVALUE, ISAVEVALUE, BSAVEVALUE, SSAVEVALUE для вещественных, целых, логических и строковых P и X параметров соответственно. Значения X – параметров можно менять как при моделировании, так и при подготовке к новому моделированию.

Возможна установка нового значения счетчика завершений в ходе моделирования, блок SETTG1.

Роль блоков GATE, TEST и TRANSFER взял на себя расширенный блок TEST, который обеспечивает разветвление на произвольное число направлений, в зависимости от выполнения условий, а также задержку заявки, если все условия неверны. Блок TRANSFER остался только как блок перехода на подпрограмму, или как блок безусловного перенаправления заявок.

Появился блок розыска указанной заявки FINDXN1, который определяет для нее текущий и следующий блок, а также список, в котором она находится.

Модель может использовать и блоки, которые предназначены для использования возможностей конкретной головной программы. Они, строятся на основе имеющихся блоков. К ним относятся блоки TOPOINT, TOSTRING, TOVALUE и CURRENBLOCKS, которые выводят очередную точку, очередную строку, очередное значение и текущую информацию о блоках. 

Имеется обширный набор функций, которые, в основном, совпадает с теми, которые есть в GPSS World. Однако к ним добавлены функции, которые выбирают значения по логическим условиям, или по номеру. Это функции RBYBOOL, IBYBOOL, SBYBOOL, RBYNUN,IBYNUM, SBYNUM для вещественных, целых и строковых значений соответственно.

Значения функций можно получать и из диалогового окна или компонента Memo главного окна. Это функции RINPUT, IINPUT, BINPUT, SINPUT, INPUTITEM и RGET, IGET, BGET, SGET для вещественных, целых и строковых значений соответственно.

Имеется также ряд других блоков, процедур и функций для организации моделей и процесса моделирования.

Если возникает необходимость создания новых блоков, то это возможно сделать следующим образом.

Можно просто вместо блока в процедуре ModelTxt, поместить составной оператор, обрамленный ключевыми словами Begin - End. Составной оператор должен содержать блоки Object GPSS, и должен быть устроен таким образом, чтобы при любых ситуациях, в нем выполнился ровно один блок, из числа описанных в системе. 

Можно также оформить этот составной оператор как процедуру, и тогда ее можно использовать как новый блок. Для облегчения создания новых блоков, в системе имеется блок NOP, который не выполняет никаких полезных действий, а просто продвигает активную заявку в следующий блок модели. Именно на его основе и рекомендуется создавать новые блоки.

Программа - конвертер подготовки моделей позволяет легко вставлять и удалять описания объектов модели и требуемые вызовы процедур. Она позволяет выполнить открытие, редактирование и сохранение модели в промежуточной форме, а также выполнить ее конвертирование для включения кода модели в программу. Имена объектов можно оставить такими, какие они предлагаются по умолчанию, а можно ввести их вручную. Типы объектов выбираются из списка.

Код модели в промежуточной форме выглядит, например, следующим образом.

{/sh} {//end_const}

{/sh} var

{/ng1} ng1:Tgenerate;

{/fac1} fac1:Tfacility;

{/que1} que1:Tqueue;

{/sh} {//end_var}

{/sh} {//end_proc_func}

{/sh} procedure initial; begin

{/ng1} tgenerate.init(ng1,ng1_,100,90);

{/fac1} Tfacility.init(fac1);

setstart(1000);

{/que1} Tqueue.init(que1);

{/sh} {//end_init} end;

{/sh} procedure closeallobj; begin {//begin_close}

{/que1} que1.freeobj;

{/fac1} fac1.freeobj;

{/ng1} ng1.freeobj;

{/sh} end;

{/sh} procedure resetall; begin

{/fac1} fac1.reset;

{/que1} que1.reset;

{/sh} {//end_reset} end;

{/sh} procedure modeltxt(NextBlock:integer);begin

With BL,SYS do case NextBlock of

{/ng1} ::ng1_ *:ng1.Generate(100,90);

*: que1.Queue;

*: fac1.Seize;

*: que1.Depart;

*: Advance(95,90);

*: fac1.Release ;

*: Buffer;

*: Terminate(1);

{/sh} {//end_model} else modelerror;end;end;

{/sh} procedure report; begin

{/fac1} fac1.report('fac1');

{/que1} que1.report('que1');

{/sh} {//end_report} end;

{/sh} procedure modeling(tg:integer); begin

{/sh} start(tg);

{/sh} end;

Как видно, он мало отличается от кода файла Model.pas .

Работа по созданию конкретной модели требует выполнения следующих шагов.

1. Запустить оболочку системы Delphi

2. Открыть в ней проект ObjectGPSSProject.dpr

3. Открыть в ней файл Model.pas .

4. Запустить приложение converter.exe

5. Открыть в нем имеющуюся модель, или создать новую. Если создана новая модель, то ее следует сохранить на диске.

6. Выполнить пункт «convert model» в приложении converter.exe . В системе Delphi появится сообщение об изменении файла Model.pas и предложение перезагрузить его. Нужно выбрать ответ Yes.

7. Затем следует запустить весь проект на выполнение. Если в файле Model.pas имеются ошибки, то нужно их исправить в приложении converter.exe и вновь выполнить шаги 6 и 7. Если ошибок нет, то запускается приложение с конкретной моделью и с ним можно проводить опыты.

При отладке модели наиболее опасной ошибкой является появление блоков вне процедуры ModelTxt или появления вызовов процедур, не являющихся блоками в процедуре ModelTxt. Для защиты от такого рода ошибок, можно записывать блоки в формате BL.вызов_процедуры, например, Bl.Advance, вместо Advance. Дело в том, что все блоки находятся в объекте BL, и это дает дополнительную защиту от ошибок. Кроме того, некоторую защиту обеспечивает пункт меню «Test Names», который проверяет, не встречаются ли в модели имена процедур и функций, которые недопустимы в конкретном разделе.

Для создания очередной модели, (её EXE – файла) достаточно повторить пункты 5,6,7.

Для сохранения в файле отчета о результатах моделирования или графиков, сформированных моделью, нужно щелкнуть по отчету или графику правой кнопкой мыши, выбрать пункт «Save» во всплывающем меню, а затем в диалоге сохранения указать желаемый файл.

В заключение, следует отметить, что эксперименты с системой Object GPSS полностью подтвердили реалистичность всех возложенных на нее ожиданий. Она устойчиво работает и создает программы для конкретных моделей систем массового обслуживания на языке Delphi, в том числе и довольно сложных. В системе легко обеспечивается развитие за счет создания новых блоков и функций. Она может взаимодействовать с компонентами головной программы, как в ходе моделирования, так и на стадии подготовки модели к моделированию. Если разработчику понадобится дополнить главное окно системы новыми компонентами, то это также несложно сделать. При этом главный файл (GPSS_SYS) не понадобится даже перекомпилировать.

Система содержит 12 типов объектов, 74 блока, 73 команды для процедуры Modeling и 123 функции. Естественно, что часть этих команд будет использоваться крайне редко, так что реально нужно знать и использовать не более 150 команд, блоков и функций.

Что касается возможности работы с файлами, то эта возможность сознательно не включена в систему, так как всегда можно воспользоваться операторами ввода – вывода самого языка Delphi.

 

Выводы

казанный подход можно легко использовать и в других языках программирования, например, в Borland C++ или в C#. Преимущества рассматриваемой системы в том, что вся работа модели происходит совершенно прозрачно, и модель может использовать все возможности базового языка программирования, в данном случае - Delphi. При моделировании выполняется только то, что явно описал разработчик модели. Система легко может быть развита или расширена в любом направлении, которое необходимо автору модели. Так как Delphi относится к языкам класса 4GL, то развитие системы не требует высокой квалификации. Систему можно также использовать и для обучения. Тогда ее прозрачность и легкость развития окажется особенно полезной. Фактически, при работе с системой, вы пишете код программы на языке высокого уровня (Object Pascal ), поэтому для работы с ней нужно знать только основы этого языка, и знать набор процедур и функций, используемых для моделирования. Наборы личных процедур и функций для моделирования можно записывать как непосредственно в модели, так и в дополнительном файле, который можно включать в систему. В модуль ModelUnit и в AddModelUnit также можно включать разработанные вами процедуры и функции. Все они будут «невидимы » для модуля GPSS_SYS, который реализует базовые возможности GPSS.

Разработанная система может быть полезна как для тех, кто начинает осваивать дискретно- событийное моделирование, и хочет, чтобы его модели выглядели профессионально, так и для тех, кто разрабатывает сложные модели «под заказ».

Автор заинтересован выполнять работы для фирм, занимающихся имитационным моделированием. С ним можно связаться по электронной почте по адресу

anatoliygk@hotmail.com
или anatoliygk@sti.lg.ua



Ссылки.


Minuteman Software. 2000. GPSS World Reference Manual. Holly Springs NC: Minuteman Software.

Ståhl, I. 2001. GPSS – 40 years of development. In Proceedings of the 2001 Winter Simulation Conference, ed B. A. Peters et al. Piscataway, New Jersey: IEEE.

Wolverine Software Corporation. 1996. SLX: An introduction for GPSS/H users. Alexandria, Virginia: Wolverine Software Corporation.

Lorenz, P., H. Dorwarth, K.-C. Ritter, and T. J. Schriber. 1997. Towards a web based simulation environment. In Proceedings of the 1997 Winter Simulation Conference, ed. S. Andradottir, K. J. Healy, D. H. Withers, and B. L. Nelson. Piscataway, NJ: IEEE.

Приложение 1 Object GPSS. Конвертор.

Модель состоит из следующих разделов:

1. Раздел описаний личных переменных и объектов модели. Он заканчивается строкой

{/sh} //end_var

2. Раздел описаний личных процедур и функций, которые используются разработчиком именно в этой модели. Он заканчивается строкой

{/sh} //end_proc_func

3. Раздел инициализации (процедура Initial). Здесь создаются нужные объекты, и задаются начальные значения переменным. Здесь же может быть выполнена любая другая подготовительная работа для начала моделирования. Он заканчивается строкой.

{/sh} //end_init

4. Раздел закрытия объектов (их очистки) (procedure closeallobj) Здесь удаляются все объекты, созданные в Initial. Он начинается строкой.

{/sh} //begin_close

Удаление его объектов идет в порядке, обратном их созданию. Содержимое этого раздела лучше не менять.

5. Раздел сброса статистики (процедура ResetAll). Здесь выполняется сброс накопленной статистики по всем объектам. Он заканчивается строкой

{/sh} //end_reset

Содержимое этого раздела лучше не менять.

6. Раздел описания собственно модели (процедура Modeltxt). Здесь последовательно располагаются блоки модели. (фактически вызовы процедур GPSS). Они размещаются после строки

{/sh} case _next_numb of

Блоки модели должны иметь вид:

::метка *: блок; или *: блок;

В файле модели, в ее комментариях, категорически запрещены фрагменты вида ::метка и *: они непременно помешают нормальной работе модели.

Категорически запрещается удаление или редактирование строк с комментарием {/sh} . Любая модификация этих строк может разрушить работоспособность модели!! Эти строки изначально должны быть в модели. Если модель испорчена, то нужно строить ее заново.

В коде модели, ссылки на метки указываются непосредственно, и могут входить в корректные выражения целого типа. После конвертирования, метки представляются как константы целого типа, а конструкции *: - как номера блоков. Вместо метки следующего блока можно указывать конструкцию *! . Она также может участвовать в выражениях.

Если блок модели является составным, то есть, составлен из нескольких операторов языка Pascal, то он обрамляется ключевыми словами Begin End, и должен работать так, чтобы непременно пройти ровно один блок GPSS, лучше всего блок Nop. Раздел собственно модели заканчивается двумя завершающими ключевыми словами end;end; .

7. Раздел формирования отчета (процедура report). Здесь выполняется формирование выходной статистики по результатам моделирования. Раздел завершается строкой

{/sh} //end_report

8. Раздел манипуляций с моделью (процедура Modeling). Здесь указаны конкретные команды манипуляции с моделью. Здесь можно управлять моделью, и готовить ее к новому моделированию. В частности, можно менять значения X – параметров, функций, многоканальных устройств, таблиц, и переменных, выводить графики и гистограммы и делать многое другое. Раздел завершается строкой

{/sh} end;

При определении объектов, для упрощения заполнения разделов 1,3,4,5,7 лучше использовать пункт меню "Insert obj". Тогда имя объекта должно вводиться в соответствующем поле, а тип объекта выбирается из списка. В принципе, можно использовать автоматически сгенерированное имя переменной или объекта. Все нужные вызовы процедур для работы с объектом автоматически размещаются в соответствующих разделах. Часть вызовов процедур из процедуры Initial нуждаются в дополнительном редактировании, тогда это сразу видно по их виду.

В процедуре Initial нуждаются в редактировании вызовы процедур для объектов, следующих типов:

Tgenerate;

Tfunction;

Вообще не нуждаются в редактировании вызовы процедур для объектов, следующих типов:

Tfacility;

Tqueue;

Tuser;

Tgroup;

TIgroup;

TSgroup;

TTgroup;

В процедуре Initial допускается редактирование вызовов процедур для объектов, следующих типов:

Tstorage;

Ttable;

Var Integer;

Var Double;

Var Boolean;

Var String;

Особый случай представляют собой заготовки для блоков Generate, и заготовки для личных процедур и функций на языке Pascal. Они будут вставляться в текущую строку. Тип функции можно выбрать из дополнительного списка, появляющегося после выбора функции.

Вставка блока Generate создает в разделе инициализации вызов процедуры Init, которую непременно нужно согласовать с Generate.

Для удаления всех вызовов процедур работы с объектом и его описания, вставленных с помощью пункта "Insert obj", удобно воспользоваться пунктом "Delete obj". Для этого нужно поместить курсор в строку, содержащую сгенерированный для объекта код, и щелкнуть по "Delete obj". За счет комментария в начале строки, будут удалены все строки кода, сгенерированные для объекта пунктом " Insert obj". Фактически, при использовании пунктов "Insert obj" и "Delete obj" ваши затраты времени на построение модели сравнимы, с временем на ввод собственно кода модели в разделе 6.

При определенных навыках, можно заметно упростить набор кода модели, используя возможности самой системы Delphi. Действовать при этом следует так.

В программе – конвертер описываются все нужные для модели переменные и объекты, а также все нужные генераторы заявок.

Далее, полученный код конвертируется, то есть переносится в файл Model.pas .

В открытом файле, ModelUnit, в процедуре TMP набирается код модели ( содержимое процедуры ModelTxt ) в следующем виде.

метка блок; или блок; 

Аналогичным образом можно набирать код процедуры управления моделью (содержимое процедуры Modeling). При наборе кода всплывают подсказки, как это всегда бывает при работе с Delphi. Эти подсказки можно вызывать и принудительно, нажав Ctrl+’ ‘ .

Набранные коды следует переместить, (то есть удалить и вставить) из процедуры TMP в нужные места модели в программе – конвертер, что гораздо проще, чем полностью набирать нужный код вручную.

Далее, можно выделить нужную часть кода в процедуре ModelTxt и выполнить пункт “Convert Selected ”. Выделенная часть будет оформлена в соответствии с требованиями оформления кода в этой процедуре, то есть будет выглядеть следующим образом.

::метка *: блок; или *: блок;

Таким образом, используя совместно возможности программы – конвертера и Delphi, можно заметно упростить себе работу по созданию кода модели.

Когда вы будете завершать сессию по работе с Delphi, и вам будет предложено сохранить изменения в файле ModelUnit, лучше ответить отказом, так как, в принципе, вы не должны были бы менять код в этом файле, и, скорее всего, он действительно останется прежним. 

Приложение 2. Пример.



Головная форма.

 

Отчет.

// model description auto.

const modelname='E:\ProjectGPSS\Object GPSS\models\trial1.txt' ;

ng1_=1; 

NG2_=11; 

num_bl=14; 

{/sh} {//end_const}

{/sh} var

//

{/ng1} ng1:Tgenerate;

{/fac1} fac1:Tfacility;

{/que1} que1:Tqueue;

{/NG2} NG2:Tgenerate;

{/tabl} tabl:Ttable;

{/sh} {//end_var}

{/sh} {//end_proc_func}

{/sh} procedure initial; begin

{/ng1} tgenerate.init(ng1,ng1_,EXPONENTIAL(120));

{/fac1} Tfacility.init(fac1);

setstart(10000);

{/que1} Tqueue.init(que1);

{/NG2} tgenerate.init(NG2,NG2_,250000);

{/tabl} Ttable.init(tabl,0,100,100);

{/sh} {//end_init} end;

{/sh} procedure closeallobj; begin {//begin_close}

{/tabl} tabl.freeobj;

{/NG2} NG2.freeobj;

{/que1} que1.freeobj;

{/fac1} fac1.freeobj;

{/ng1} ng1.freeobj; 

{/sh} end;

{/sh} procedure resetall; begin

{/fac1} fac1.reset;

{/que1} que1.reset;

{/tabl} tabl.reset;

{/sh} {//end_reset} end;

{/sh} procedure modeltxt(NextBlock:integer);begin

{/sh} With BL,SYS do case NextBlock of

{/ng1} {::ng1_} 1:ng1.generate(EXPONENTIAL(120));

2: que1.queue ;

3: fac1.seize ;

4: que1.depart ;

5: advance(EXPONENTIAL(105)) ;

6: fac1.release ;

7:topoint(0,sys.ac1,que1.a);

8: tabl.tabulate(SYS.M1) ;

9: buffer ;

10: terminate(1) ;

{/NG2} {::NG2_} 11:NG2.generate(25000);

12: CurrentBlocks;

13:toValue(1,que1.a);

14: terminate(0) ;

{/sh} {//end_model} else modelerror;end;end;

{/sh} procedure report; begin

{/fac1} fac1.report('fac1');

{/que1} que1.report('que1');

{/tabl} tabl.report('tabl');

{/sh} {//end_report} end;

{/sh} procedure modeling(tg:integer); var i:integer; begin

valuetitle(1,'que1.a');

valuecolor(1,clblue);

showValue(2,10);

for i:=1 to InputValueI(' cicle num ') do

begin

Linecolor(1, rgb(random(256),random(256),random(256)));

Linetitle(1,'gue1.a '+inttostr(i));

{/sh} start(tg);

SetXvalue(i,que1.a);

addtomemo(inttostr(i)+' '+floattostr(que1.a) );

end;

tabl.show(1);

{/sh} end;

//end----

StartTime 0.00000 EndTime 5964784.03323

BLOCK REPORT

Location Entries Current

1 50011 0

2 50011 10

3 50001 0

4 50001 0

5 50001 1

6 50000 0

7 50000 0

8 50000 0

9 50000 0

10 50000 0

11 229 0

12 229 0

13 229 0

14 229 0

REPORT CURRENT LIST 

XN1 A1 Pr Current Next TimeStamp TimeEnter Preempt

50232 50232 0 2 3 5963564.90132 5963564.90132 0

50233 50233 0 2 3 5963666.71782 5963666.71782 0

50234 50234 0 2 3 5964073.56799 5964073.56799 0

50235 50235 0 2 3 5964365.65348 5964365.65348 0

50236 50236 0 2 3 5964381.26818 5964381.26818 0

50237 50237 0 2 3 5964453.23756 5964453.23756 0

50238 50238 0 2 3 5964592.81713 5964592.81713 0

50239 50239 0 2 3 5964636.40224 5964636.40224 0

50240 50240 0 2 3 5964672.80576 5964672.80576 0

50241 50241 0 2 3 5964760.26999 5964760.26999 0

REPORT FUTURE LIST 

XN1 A1 Pr Current Next TimeStamp EndTime Preempt

50231 50231 0 5 6 5963500.30576 5964826.85649 0

50242 50242 0 0 1 5965173.07294 5965173.07294 0

50109 50109 0 0 11 5975000.00000 5975000.00000 0

REPORT X LIST ( DOUBLE )

Num double

1 5.24675

2 5.14753

3 4.82243

4 5.60328

5 5.90207

Facility Entries Current Utility AverTime NextGo XN1 XN1P NumObj

fac1 50001 1 0.87753 104.68313 0 50231 0 2

Queue Entries Current Max Zero AverQueue AverTime AverTime(-Ze) NumObj

que1 50011 10 47 6137 5.90207 703.93611 802.40116 3

Table tabl Entries 50000.00000

Mean 808.65707 StdDev 776.34189 NumObj 5

Range Frequency

0.00000 0.00000

100.00000 5407.00000

200.00000 4907.00000

300.00000 4526.00000

400.00000 4027.00000

500.00000 3454.00000

600.00000 3372.00000

700.00000 2790.00000

800.00000 2672.00000

900.00000 2219.00000

1000.00000 1910.00000

1100.00000 1743.00000

1200.00000 1588.00000

1300.00000 1419.00000

1400.00000 1207.00000

1500.00000 1034.00000

1600.00000 926.00000

1700.00000 762.00000

1800.00000 691.00000

1900.00000 747.00000

2000.00000 611.00000

2100.00000 585.00000

2200.00000 453.00000

2300.00000 411.00000

2400.00000 302.00000

2500.00000 252.00000

2600.00000 264.00000

2700.00000 192.00000

2800.00000 143.00000

2900.00000 158.00000

3000.00000 127.00000

3100.00000 111.00000

3200.00000 86.00000

3300.00000 113.00000

3400.00000 82.00000

3500.00000 66.00000

3600.00000 56.00000

3700.00000 63.00000

3800.00000 60.00000

3900.00000 53.00000

4000.00000 58.00000

4100.00000 45.00000

4200.00000 42.00000

4300.00000 41.00000

4400.00000 43.00000

4500.00000 38.00000

4600.00000 29.00000

4700.00000 31.00000

4800.00000 24.00000

4900.00000 15.00000

5000.00000 11.00000

5100.00000 17.00000

5200.00000 4.00000

5300.00000 4.00000

5400.00000 6.00000

5500.00000 2.00000

5600.00000 1.00000

5700.00000 0.00000 

График очереди, que1.A 

График времени обслуживания, SYS.M1



Распечатано с портала GPSS.RU
(c) А.Г. Королев, 2004 г.