УДК 62. 529

 

 АНАТОЛИЙ ГЕОРГИЕВИЧ КОРОЛЁВ

к.т.н, доцент.

 

СИСТЕМА OBJECT GPSS и её новая версия  GPSS – Future.

В статье приводится сравнение команд и блоков для GPSS –World и  Object GPSS. Object GPSS – это средство для написания моделей в стиле GPSS непосредственно на языке Delphi (Object Pascal). Каждая модель на Object GPSS представляет собой Include –файл (Model.pas), содержащий  описание всех объектов модели и набор из 6 процедур:  Initial, CloseAllObj, ResetAll, ModelTxt, Report, Modeling. Практически все части модели, кроме «начинки» процедуры ModelTxt, создаются программой – конвертером. Для создания исполняемой модели следует скомпилировать модель вместе с остальными стандартными частями проекта. Полученный .EXE – файл является моделью конкретной системы и с ней можно проводить эксперименты. В этой системе моделирования  легко расширять набор команд и блоков для моделирования.

Система GPSS – Future развивает 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 может быть адекватно представлен как последовательность соответствующих вызовов процедур языка программирования.

 Модели в системе Object GPSS состоят из следующих частей.

1.      Описания констант, переменных и объектов модели, а также специальных процедур и функций, используемых в модели.

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

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

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

5.      Процедуры  Report, в которой выполняется вывод дополнительных элементов выходной статистики. Обычно эта процедура пуста.

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

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

 Пусть заявки поступают в систему со средним интервалом 100, распределенным по экспоненциальному закону. Они  должны обслуживаться одним из 3 устройств. 4- канальным, за время 800+-400, или 6- канальным, за время 1100+-500, или 1- канальным, за время 600+-300. промоделировать обслуживание 10000 заявок. Выполнить табулирование времени обслуживания заявок.

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

{\Gen} ::Gen_ *:Gen.Generate(Exponential(100));

   *:Que.Queue;

   *:Transfer ([mm1,mm2,mm3]);

::mm1  *:Stor.Enter;

     *:Que.depart;

     *:Advance (800,400);

     *:Stor.Leave;

     *:Tab.Tabulate (m1);

     *:Terminate (1);

 

::mm2  *:Stor0.Enter;

     *:Que.depart;

     *:Advance (1100,500);

     *:Stor0.Leave;

     *:Tab.Tabulate (m1);

     *:Terminate (1);

 

::mm3  *:Fac.Seize;

     *:Que.depart;

     *:Advance (600,300);

     *:Fac.Release;

     *:Tab.Tabulate (m1);

     *:Terminate (1);

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

Stor Storage 4

Stor0 Storage 6

tab table m1,0,50,100

   Generate (Exponential(1,0,100))

   Queue Que

   Transfer all,mm1,mm3,6

mm1  Enter Stor

     Depart Que

     Advance 800,400

     Leave stor

     Tabulate Tab

     Terminate 1

mm2  Enter Stor0

     Depart Que

     Advance 1100,500

     Leave Stor0

     Tabulate Tab

     Terminate 1

mm3 Seize Fas;

    Depart Que

    Advance 600,300

    Release Fas

    Tabulate Tab

    Terminate 1

 start 10000

Полная модель этой системы в  Object GPSS выглядит следующим образом.

  {~vb} Var

{\Gen} Gen:TGenerate;

{\Stor} Stor:TStorage;

{\Stor0} Stor0:TStorage;

{\Fac} Fac:TFacility;

{\Que} Que:TQueue;

{\Tab} Tab:TTable;

  {~ve}

  {~pfe}

  {~ib} procedure Initial;begin

  setstart(10000);

{\Gen} Init(Gen,'Gen',Gen_,Exponential(100));

{\Stor} Init(Stor,'Stor',4);

{\Stor0} Init(Stor0,'Stor0',6);

{\Fac} Init(Fac,'Fac');

{\Que} Init(Que,'Que');

{\Tab} Init(Tab,'Tab',0,50,100);

  {~ie} end;

  {~mtb}procedure ModelTxt;begin with SYS do case ActiveBlock of

{\Gen} ::Gen_ *:Gen.Generate(Exponential(100));

   *:Que.Queue;

   *:Transfer ([mm1,mm2,mm3]);

::mm1  *:Stor.Enter;

     *:Que.depart;

     *:Advance (800,400);

     *:Stor.Leave;

     *:Tab.Tabulate (m1);

     *:Terminate (1);

::mm2  *:Stor0.Enter;

     *:Que.depart;

     *:Advance (1100,500);

     *:Stor0.Leave;

     *:Tab.Tabulate (m1);

     *:Terminate (1);

::mm3  *:Fac.Seize;

     *:Que.depart;

     *:Advance (600,300);

     *:Fac.Release;

     *:Tab.Tabulate (m1);

     *:Terminate (1);

  {~mte} end;end;

  {~mb} procedure Simulation;  begin

  start(GetTg1);

  Show(Tab,1);

  {~me}end;

  {~rb} procedure Report;begin

  {~re} end;

  {~cab} procedure CloseAllObj;begin

  {~cae} end;

 

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

Для создания модели ее текст должен пройти конвертирование в текст на языке Object Pascal. Конвертирование состоит в том, что пары символов *: заменяются на номера блоков, а метки блоков преобразуются в константы целого типа, значения которых равны номеру блока с меткой. В итоге получается файл Model.pas, который компилируется совместно с другими модулями. В результате компиляции получается модель системы в виде .Exe - файла, с которой уже можно проводить эксперименты.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Завершение моделирования.

Созданная программа может быть переименована и перенесена  в другую папку.

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

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

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

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

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

То, что для реализации системы выбран язык Delphi, а не C++, или, например, C#  - не является принципиальным. Просто на этом языке код модели выглядит несколько более привычным, по сравнению с аналогичным кодом на  языке C++.  Однако, нет никаких принципиальных трудностей в построении аналогичной системы на языке C++.

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

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

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

 Набор блоков общего назначения содержит основные функции и блоки системы GPSS.  Некоторые функции и блоки имеют другие имена, по нашему мнению, более подходящие, чем, например,  в  GPSS – World. Так вместо СЧА M1 – текущее время жизни заявки, TG1 – текущее значение счетчика завершений используются функции TranAge и Term. В принципе, процедуры блоки и функции этого набора повторяют то, что есть в GPSS World. К существенным изменениям набора функций можно отнести замену параметров заявки и системы (СЧА P и X)  на функции RP(Num), IP(Num), BP(Num),  SP(Num), которые выдают значения вещественных, целых, логических и строковых параметров заявок, по умолчанию – активных заявок.  Для работы с параметрами системы, (СЧА X) имейте в виду, что любой объект имеет свой набор параметров системы. Так как параметры системы и заявки аналогичны, то для работы с параметрами системы можно использовать те же блоки, процедуры и функции, что и для заявок. В  этом случае последний аргумент процедур, функций и блоков работы с параметрами заявок должен быть NameObject.N . Хотя параметры заявок и системы задаются номерами, вместо номеров всегда можно использовать целые именованные константы, тогда текст модели становится более наглядным.

 В наборе блоков общего назначения возможно присваивание значений переменным, в том числе элементам массивов. Для этого используется блок LET.

 Параметры заявок и системы – типизированы, а поэтому вместо блоков ASSIGN и SAVEVALUE используются блоки RPLet(Num, Value), IPLet(Num, Value), BPLet(Num, Value), SPLet(Num, Value) для вещественных, целых, логических и строковых параметров заявок соответственно. Если вы используете параметры системы, то последним (третьим) аргументом должен быть NameObject.N . Значения  параметров системы можно менять как при моделировании, так и при подготовке к новому моделированию. Имеются функции для проверки существования параметров с данным номером.

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

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

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

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

Набор функций очень велик, и включает в себя, в частности, аналоги функций типов 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 описывает группы заявок. Его набор функций и процедур  заметно расширен, во первых, за счет типизации данных, то есть в данном случае параметров заявки, а во вторых, за счет обеспечения доступа к параметрам заявок из списка группы при отборе нужных заявок. Отбор нужных заявок и изменение значений параметров заявки, ведется с помощью отдельно описанных функцию выбора и функций вычисления значений. Эта особенность повышает возможности блоков работы с группами заявок. В этом классе блоки SCAN и ALTER заменены  блоками RScan, IScan, BScan, SScan и RAlter, IAlter, BAlter, SAlter,  которые отыскивают и изменяют значения вещественных, целых, логических и строковых параметров заявок соответственно.

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

Имеются также функции анализа значений заявок из списка пользователя – это функции Sum Avg Min Max Count. В функциях можно указывать все те же элементы управления выбором, что и при выборе удаляемых заявок, а кроме того, в них используются функции значений для формирования результата, по которому собственно и проводится суммирование, усреднение, и так далее.

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

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

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

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

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

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

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

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

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

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

3. Выполнить пункт «Сonvert And Run» в приложении converter.exe. Если в файле Model.pas имеются ошибки, то нужно их исправить и вновь выполнить шаг 3. Если  ошибок нет, то запускается приложение с конкретной моделью и с ним можно проводить опыты..

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

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

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

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

 Система поддерживает работу с текстовыми файлами.

 

Выводы.

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

Оценивая опыт эксплуатации Object GPSS, следует отметить, что сами модели на нем, выглядят более естественно,  чем  на традиционных версиях GPSS. Логика построения моделей более прозрачна и более соответствует логики обычных программ. При этом, основные усилия разработчика моделей тратятся на саму модель, а не на борьбу с «особенностями» языка GPSS.

Развитые средства визуализации, дополнительные блоки вывода, и возможность приостановить исполнение модели в любой момент и посмотреть полные результаты моделирования,  благотворно сказываются на отладке моделей, в то время как многие модели на GPSS, даже попадая в разряд «образцовых», на самом деле содержат ошибки, иногда довольно грубые.

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

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

objectgpss@yandex.ru

 

Приложение: GPSS - Future:

Всем, кто активно использует GPSS,  известно,  что концепция будущего в этой системе весьма ущербна. То есть, если вы запланировали задержку заявки на некоторое время в блоке Advance, то с этой заявкой уже практически ничего сделать нельзя. Нужно ждать, пока она вновь появится  в списке текущих событий. В определённом смысле, это концепция плановой экономики, когда всё, что произойдет в будущем – планируется заранее и не подлежит никакой ревизии.  В новой системе – GPSS – Future список будущих событий рассматривается как наследник списка пользователя. А поэтому всегда можно извлечь из него заявки, удовлетворяющие нужным вам условиям, в том числе, и продвинув текущее время в системе к новому значению. В этом случае, вы полностью контролируете заявки из списка будущих событий, пока они находятся в этом списке.

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

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

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

  В новой системе для генерации заявок используются процедура Future.NewWaitProc (инициализация) и блок Future.NewWait (генерация). Задержку выполняет блок Future.Wait. Здесь Future – это список будущих событий, который предлагается системой.

 Новая система уже доступна всем желающим!

(См адрес objectgpss@yandex.ru )

 

Литература

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. Конвертер.

 

 

 

Рисунок 2.  Внешний вид программы - конвертера.

 

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

 

      

 

  Рисунок 3.  Головная форма модели.

 

Отчет по модели.

 

Date Time Stamp= 01.06.2006 13:31:47

REPORT    AnatoliyGk@Sty.Lg.Ua : Product Num 816920

E:\work\gpss\КОНФЕРЕНЦИИ\МОДЕЛЬ.rtf

StartTime         0.00000 EndTime     993630.25414

Count4

 

 {\Gen} ::Gen_ 1:Gen.Generate(Exponential(100));

   2:Que.Queue;

   3:Transfer ([mm1,mm2,mm3]);

::mm1  4:Stor.Enter;

     5:Que.depart;

     6:Advance (800,400);

     7:Stor.Leave;

     8:Tab.Tabulate (m1);

     9:Terminate (1);

 

::mm2  10:Stor0.Enter;

     11:Que.depart;

     12:Advance (1100,500);

     13:Stor0.Leave;

     14:Tab.Tabulate (m1);

     15:Terminate (1);

 

::mm3  16:Fac.Seize;

     17:Que.depart;

     18:Advance (600,300);

     19:Fac.Release;

     20:Tab.Tabulate (m1);

     21:Terminate (1);

 

 

            BLOCK Report

    Location   Entries   Current

         1     10008         0

         2     10008         0

         3     10008         0

         4      4514         0

         5      4514         0

         6      4514         4

         7      4510         0

         8      4510         0

         9      4510         0

        10      4499         0

        11      4499         0

        12      4499         4

        13      4495         0

        14      4495         0

        15      4495         0

        16       995         0

        17       995         0

        18       995         0

        19       995         0

        20       995         0

        21       995         0

          Report FUTURE LIST   Count=  9

       XN1     Assem        Pr   Current      Next       TimeStamp         EndTime Interrupt

     10004     10004         0         6         7    993081.23565    993671.69849         0

     10009     10009         0         0         1    993685.58166    993685.58166         0

     10002     10002         0         6         7    992891.27547    993826.64873         0

      9997      9997         0        12        13    992422.77207    993838.96498         0

     10003     10003         0         6         7    993039.08621    993872.89724         0

     10007     10007         0         6         7    993564.13270    994287.92997         0

     10005     10005         0        12        13    993101.27414    994420.22182         0

     10008     10008         0        12        13    993581.35363    994628.88149         0

     10006     10006         0        12        13    993244.20028    994685.89171         0

   Storage   Entries   Current       Max       Min        AverStor        AverTime         Utility

      Stor      4514         4         4         0         3.62461       797.85529         0.90615

    NextGo       XN1             AC1    ACapac  Capacity    NumObj

         0     10007    993564.13270     4.000         4         4

   Storage   Entries   Current       Max       Min        AverStor        AverTime         Utility

     Stor0      4499         4         6         0         4.94197      1091.46279         0.82366

    NextGo       XN1             AC1    ACapac  Capacity    NumObj

         0      9998    993630.25414     6.000         6         5

  Facility   Entries   Current         Utility        AverTime    NextGo       XN1      XN1P    NumObj

       Fac       995         0         0.59741       596.58558         0         0      0         6

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

       Que     10008         0        19         0      5582         1.23681       122.79459       277.66114         7

 Table       Tab  Entries     10000.00000

 Mean      1033.04240 StdDev       369.58591    NumObj         8

           Range       Frequency

       300.00000         0.00000

       400.00000        80.00000

       500.00000       464.00000

       600.00000       563.00000

       700.00000       874.00000

       800.00000       987.00000

       900.00000      1059.00000

      1000.00000      1002.00000

      1100.00000       965.00000

      1200.00000      1013.00000

      1300.00000       690.00000

      1400.00000       625.00000

      1500.00000       520.00000

      1600.00000       519.00000

      1700.00000       203.00000

      1800.00000       139.00000

      1900.00000       105.00000

      2000.00000        72.00000

      2100.00000        42.00000

      2200.00000        27.00000

      2300.00000        17.00000

      2400.00000        17.00000

      2500.00000         5.00000

      2600.00000         7.00000

      2700.00000         3.00000

      2800.00000         2.00000

      2900.00000         0.00000

 

 

 

  Рисунок 4.  Гистограмма таблицы .

 

Hosted by uCoz