УДК 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, даже попадая в разряд «образцовых», на самом деле содержат ошибки, иногда довольно грубые.
Разработанная система может быть полезна как для тех, кто начинает осваивать дискретно- событийное моделирование, и хочет, чтобы его модели выглядели профессионально, так и для тех, кто разрабатывает сложные модели «под заказ».
Для получения академической версии системы следует написать автору письмо по адресу.
Приложение: 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. Гистограмма таблицы .