6 МОДЕЛИРОВАНИЕ СИСТЕМ

ВВЕДЕНИЕ

 

Моделирование в широком смысле представляет собой способ замены реальной системы некоторым эквивалентом, позволяющим упростить ее проектирование и исследование. В данном пособии рассматривается вторая задача моделирования - исследование готовых и проектируемых систем (объектов) с целью получения необходимых знаний об их свойствах.

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

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

 

1. КОНЦЕПТУАЛЬНЫЕ  МОДЕЛИ

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

Возможны два различных концептуальных подхода к разработке имитационной модели: дискретное и непрерывное моделирование. Указанные подходы различаются способами задания времени в вычислительной среде ЭВМ.

При дискретном моделировании состояние моделируемого объекта (системы) может меняться только в определенные моменты времени TSOB (идентификаторы условны) при свершении некоторых событий SOB. Последние формируются двумя способами: безусловно (основные или временные события) или при выполнении определенных условий (вспомогательные или структурные события).

Основные события планируются во времени и реализуются по определенному алгоритму в начале имитации или в процессе работы модели.

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

Таким образом, в дискретной модели системное время TNOW всегда вторично и задается равным моменту TSOB свершения очередного (ближайшего) события SOB только после принятия решения о его программной реализации.

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

Если в непрерывной модели запланированы основные и возникают структурные события (комбинированные или гибридные модели), то в случае равенства или превышения независимо изменяющегося системного времени  TNOW ближайшего момента TSOB принимается решение о реализации сооответствующего события и  TNOW корректируется по формуле дискретных систем: TNOW = TSOB.

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

Понятие концептуальности  может быть основано на других, отличных от изложенных, принципах классификации. Так, основываясь на математических принципах [11], под дискретно-детерминированной (F-модель) и дискретно-стохастической (P-модель)  моделями принято понимать модели, основанные на теории конечных автоматов, где ход времени никак не меняет концептуальность модели (синхронные или асинхронные автоматы). Среди систем с параллельными процессами в отдельную концептуальнкю группу выделяют сети Петри (N-модели). Различают непрерывно-детерминированные (D-схемы) и непрерывно-стохастические (Q-схемы) системы. Комбинированные системы (А-схемы), включающие непрерывные, дискретные, детерминированные и стохастические компоненты, имеют свои особые структуру и взаимосвязи между элементами.

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

 

2. ЯЗЫКИ МОДЕЛИРОВАНИЯ

 

Языки моделирования относятся к средствам моделирования и представлены двумя группами: универсальные (общие) языки программирования и специальные системы (языки) моделирования.

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

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

 

3. СПОСОБЫ ДИСКРЕТНОГО МОДЕЛИРОВАНИЯ

 

Различают три подхода к дискретному моделированию: событийный, сканирование активностей и процессно-ориентированый.

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

Сканирование активностей - это способ определения момента возникновения структурных событий путем проверки выполнения оговоренных условий в течение всего времени имитационного прогона.

Процессно-ориентированный подход рассматривает процесс перемещения некоторых активных компонентов (транзактов) через исследуемую систему, с которыми вступают во взаимодействие другие элементы. Над транзактами совершаются любые действия и с ними происходят любые события.

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

 

4. СОБЫТИЙНОЕ МОДЕЛИРОВАНИЕ

4.1. ОБЩИЕ ПОЛОЖЕНИЯ

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

Планирование и реализация событий, разделенных временными интервалами, требуют хранения запланированных событий. Это делается с помощью специализированного файла-календаря или списка. Поскольку календарь используется не только для хранения событий, но и для анализа состояния имитационного процесса, события в нем расположены в порядке возрастания времени свершения. По ходу имитации из календаря события выбираются и реализуются (обрабатываются) по очереди. Имитационное время TNOW обновляется только после извлечения очередного события из календаря, когда становится известным его время свершения: TNOW=TSOB. В ходе имитации календарь поддерживается в должном состоянии подпрограммой GRUP, вызываемой после любого обращения к календарю, сопровождающегося нарушением порядка расположения его записей.

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

Если очередной NNRS-ный прогон заканчивается, вызывается подпрограмма оформления отчета по прогону (OTPUTN) и осуществляется переход к следующему имитационному прогону.

После завершения всех NNRNS прогонов вызывается процедура обработки результатов всех прогонов и оформления итогового отчета OTPUT.

Сбор данных ведется в любом месте программы моделирования и при любом  TNOW в соответствии с разработанным алгоритмом.

Переменные и параметры, используемые в модели, можно разделить на четыре группы:  системные (например, TNOW), не зависящие от объекта моделирования и применяемые многократно в различных задачах; пользовательские, определяемые типом объекта и вводимые разработчиком для каждой задачи заново; всепрогонные (например, NNRNS), используемые во всех имитационных прогонах; прогонные (например, TTFIN), используемые внутри одного прогона. Всепрогонные параметры задаются перед началом общей имитации, прогонные - в начале каждого прогона процедурой INTLC.

 

4.2. АЛГОРИТМ ДИСКРЕТНО-СОБЫТИЙНОЙ ИМИТАЦИИ

После запуска модели вначале производится инициализация всепрогонных переменных (в главном модуле) и, далее, прогонных для первого прогона (в процедуре INTLC).

Поскольку алгоритм имитации ориентирован на обработку событий, необходимо перед первым обращением к календарю запланировать хотя бы одно событие. Это делается после инициализации прогонных переменных в процедуре INTLC, куда помещается оператор вызова процедуры планирования SCHDL.

Модуль SCHDL передает в календарь все сведения о событии: его атрибуты, код класса KEVNT и интервал свершения DTIME, отсчитываемый от текущего времени TNOW.

Собственно имитация работы моделируемого объекта (системы) начинается с выбора из календаря первого события с минимальным временем свершения TSOB. Информация об извлеченном событии используется для проведения ряда операций. Так, интервал свершения  DTIME дает возможность обновить системное время: TNOW=TNOW+DTIME. Код класса KEVNT необходим для поиска соответствующего алгоритма обработки (реализации) события. Атрибуты события используются для определения направления действий при реализации события.

Поиск программы обработки события осуществляет специализированная процедура EVENT, в которую при ее вызове передается код события. По коду события программа EVENT либо вызывает саму подпрограмму обработки, либо ищет у себя внутри встроенные элементы алгоритма реализации события.

После обработки (реализации) события проверяются условия окончания прогона. Если прогон можно продолжить, идет обращение в календарь для извлечения очередного ближайшего по времени события. Если прогон должен быть завершен, то накопленная в процессе прогона информация обрабатывается и формируется отчет по прогону. Затем проверяются условия окончания всех прогонов. Если прогоны продолжаются, управление передается процедуре INTLC для выполнения очередного прогона. При завершении всех прогонов составляется итоговый отчет по всей имитации.

Нетрудно заметить, что все основные шаги по дискретно-событийной имитации будут повторяться для любых моделируемых объектов. Поэтому управление ходом имитации независимо от задачи поручают отдельной процедуре системного типа - процессору имитации СЛАМ, вызываемому в начале работы программы (рис.4.1).

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

 

4.3. ПРИМЕР СОБЫТИЙНОЙ МОДЕЛИ

 

В качестве примера событийной модели рассмотрим часть информационной системы, куда поступают, обрабатываются и транслируются дальше заявки в моменты времени, распределенные случайно экспоненциально с математическим ожиданием =20.0 единиц. Время обработки заявок распределено случайно равномерно от 10 до 25 единиц. Имитируется работа сети в течение 480 единиц времени.

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

 

Рис.4.1. Блок-схема алгоритма управления событийной  моделью

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Группировка событий. Из всех типов событий (поступление заявок, постановка их в очередь, обработка заявок, пересылка) ограничимся двумя классами: поступление (приход) и обработка (обслуживание), так как именно они регламентированы временными данными. Начало обработки и постановку в очередь следующего события (если еще не закончена обработка предыдущей заявки) совместим  с моментом поступления заявки, а пересылку - с окончанием обработки. Никаких особых операций по постановке в очередь и пересылке заявок  не предусматривается.

Атрибуты событий. Исходные данные никак не характеризуют поступающие заявки, кроме момента появления. Таким образом, число MATR атрибутов событий "приход заявки" равно единице, а сам атрибут совпадает с временем свершения (поступления) этих событий. Что касается обработки, то класс "обслуживание", не обнаруживающий никаких дополнительных характеристик событий, может иметь тот же атрибут.

Процедура планирования. Подпрограмма планирования SCHDL является системной и должна иметь три формальных параметра - код планируемого события KEVNT, интервал свершения DTIME и массив  A1, который принимает все атрибуты планируемого события. Организуем SCHDL следующим образом (ФОРТРАН):

SUBROUTINE SCHDL(KEVNT, DTIME, A1)

DIMENSION A1(MATR), A2(MATR+2), A3(MATR+2, NNQ1)

COMMON /COM/…

DO 1 N=1, MATR

1       A2(N)=A1(N)

A2(MATR+1)=KEVNT

A2(MATR+2)=TNOW+DTIME

READ(1'1) A3

DO 2 J=1, NNQ1

2       IF(A3(MATR+1, J).EQ.0) GOTO 3

3       WRITE(1'J) A2

CALL GRUP

RETURN

END

Здесь A2 - массив предварительной компоновки записи для ее дальнейшей пересылки в календарь событий (размерности всех массивов должны быть заданы); A3 - массив для копирования всего календаря в электронную память из внешнего носителя (файла); NNQ1 - число записей календаря. Поскольку планируемое событие содержит кроме атрибутов события также код класса и время (итервал) свершения, размерность массива A2 выше того же параметра для массива A1. Процедура SCHDL получает информацию из оператора ее вызова и из области COMMON (многоточие означает другие идентификаторы, используемые в программе для связи с процедурами).

С оператора DO 1 (цикл) начинается формирование записи календаря (пока массив A2), в которую поступают данные из A1. После этого в A2 копируются код и время свершения (можно ограничиться интервалом DTIME) события. Оператор READ переписывает в массив A3 (электронная память) файл календаря (номер один с прямым доступом, чтение - с первой записи) с внешнего носителя для работы с календарем. Оператор DO 2 проводит поиск первой свободной записи в календаре по коду события (запись свободна, если код отсутствует, что требует предварительного обнуления календаря в начале имитации), после чего оператор WRITE выводит в файл календаря (номер один с прямым доступом, вывод – начиная с  записи с номером J) данные из массива A2.

Оператор вызова процедуры планирования:

CALL SCHDL (KEVNTZ, DTIMEZ, ATRIB)

Здесь KEVNTZ - выражение, определяющее KEVNT, DTIMEZ - выражение для расчета DTIME, ATRIB - системный специализированный массив: при планировании события он передает информацию в календарь, при извлечении записи из календаря принимает необходимые данные.

Сортировка записей в календаре. Процедура поддержания порядка записей в календаре может иметь следующий вид:

SUBROUTINE GRUP

DIMENSION A2(MATR+2), A3(MATR+2, NNQ1)

COMMEN /COM1/ MATR, …

READ(1’1) A3

IF(A3(MATR+1, 1).EQ.0) GOTO 1

DO 2 J=1, NNQ1 –1

IF(A3(MATR+1, J).EQ.0) GOTO 3

K=J

Z=A3(MATR+2, J)

DO 4 L=J+1, NNQ1

IF(A3(MATR+1, L).EQ.0) GOTO 8

IF(A3(MATR+2, L).GE.Z) GOTO 4

Z=A3(MATR+2, L)

K=L

4   CONTINUE

8        DO 2  I=1, MATR+2

A2(I)=A3(I, J)

A3(I, J)=A3(I, K)

2        A3(I, K)=A2(I)

3        WRITE(1’1) A3

RETURN

1        DO 6  J=1, NNQ1 –1

DO 6  I=1, MATR+2

A3(I, J)=A3(I, J+1)

6        A3(I, J+1)=0

GOTO 3

RETURN

END

Как видно из приведенного фрагмента, после копирования в A3 календаря осуществляется проверка состояния первой записи. Если она пустая, ясно, что из календаря ранее выбрано событие с минимальным временем свершения и, следовательно, достаточно сдвинуть календарь на одну запись влево. Это делает блок с меткой 1, обнуляющий последним оператором с меткой 6 запись A3(I, J+1), используемую потом для планирования очередного события (хотя, возможно, эта запись уже была когда-то обнулена). Далее действие передается по метке 3, где производится вывод сформированного календаря из массива A3 в файл 1.

Если первая запись календаря не пуста, значит процедура вызвана после планирования какого-то события и необходимо расставить записи по возрастанию их времени свершения (запланированное событие могло иметь любое время свершения). Для этого с оператора DO 2 J=1, NNQ1 –1 начинается сравнение времени свершения J-й записи с аналогичным параметром остальных записей и перемещение этой записи на нужное место календаря (массива A3). Перед каждой такой последовательностью действий оператором IF(A3(MATR+1, J).EQ.0) GOTO 3  J-я запись проверяется по коду события. Если он равен нулю, календарь кончился и управление передается метке 3 для вывода готового календаря в файл.

 


Перед сортировкой календаря оператор K= J запоминает номер J–й записи, а оператор Z=A3(MATR+2, J) – ее время свершения. Следующий за ними блок DO 4: а) проверяет код очередной, сопоставляемой с J, записи L; б) сравнивает время двух записей; в) запоминает (обновляет K, Z) номер и время  свершения записи L. Если проверяемый код записи L равен нулю, календарь кончился и управление передается на метку 8 для обмена данными между записями J и L (K), так как в цикле DO 4 нормальный ход действий приводит к отысканию записи с временем, меньшим, чем у записи J. Если время свершения записи L оказывается больше или равным тому же для записи J, управление передается метке 4 с переходом к следующей записи календаря (в начало цикла DO 4).

 

После обработки всего календаря циклом DO 2 J=1, NNQ1 очередной оператор WRITE(1’1) A3 выводит данные в файл 1.

Извлечение первой записи. Пример процедуры извлечения первой записи из календаря:

SUBROUTINE RMOVE

DIMENSION A3(MATR+2, NNQ1)

COMMON /COM1/ MATR,…

READ(1’1) A3

TSOB=A3(MATR+2, 1)

I=A3(MATR+1, 1)

DO 1 N=1, MATR

1        ATRIB(N)=A3(N,1)

A3(MATR+1, 1)=0

WRITE(1’1) A3

CALL GRUP

RETURN

END

После копирования календаря в массив A3 из его первой записи извлекаются и запоминаются для передачи через COMMON-область: время свершения (в виде TSOB), код события I и атрибуты события (цикл DO 1). Затем код события первой записи обнуляется (запись становится условно пустой). Измененный календарь выводится в файл 1, а для восстановления порядка записей вызывается процедура GRUP.

Управление ходом  имитации. Порядок вызова рабочих процедур процессором  имитации ясен из рассмотрения следующего модуля:

SUBROUTINE SLAM

DIMENSION A2(MATR+2)

COMMON /COM1/ MATR,…

2        CALL INTLC

1         CALL RMOVE

TNOW=TSOB

CALL EVENT(I)

READ(1’1) A2

IF((TNOW.LT.TTFIN).AND.(A2(MATR+1).GT.0)) GOTO 1

CALL OTPUTN

IF(NRNS.LT.NNRNS) GOTO 2

CALL OTPUT

RETURN

END

Обновление системного времени происходит сразу после извлечения  записи из календаря. Время события TSOB передается в  SLAM через COMMON-область, как и другая информация. Обработка (реализация) события происходит после поиска соответствующей программы процедурой EVENT(J) по коду I извлеченного события (J - формальный параметр, получающий значение J=I при вызове процедуры EVENT). Оператор READ(1’1) A2 копирует первую запись файла календаря для определения одного из двух параметров, участвующих в анализе условия окончания прогона – кода записи. Проверку этого условия ведет оператор IF((TNOW.LT.TTFIN).AND.(A2(MATR+1).GT.0)) GOTO 1. Отчет по прогону и итоговый отчет оформляются соответственно процедурами OTPUTN и OTPUT. Для различения отчетов по прогонам в процедуре OTPUTN  должен быть отображен номер прогона NRNS. Вызов  OTPUTN осуществляется по результату сравнения NRNS и NNRNS в операторе IF(NRNS.LT.NNRNS) GOTO 2.

Процедура инициализации. Структура этого модуля в основном определяется объектными (пользовательскими) условиями. Обязательными являются оператор задания начального имитационного времени и оператор планирования события. Ниже дан учебный пример:

SUBROUTINE INTLC

DIMENSION A3(MATR+2, NNQ1)

COMMON /COM1/ MATR,…

TNOW=TTBEG

NRNS=NRNS+1

LO=0

MLO=0

NI=0

NL=0

READ(1’1) A3

DO 1 J=1, NNQ1

1        A3(MATR+1, J)=0

WRITE(1’1) A3

BUSY=0

CALL SCHDL(1,EXPONS(20.0), ATRIB)

RETURN

END

Здесь устанавливаются: время TNOW начала очередного прогона, номер прогона NRNS,  текущая длина LO очереди для обработки заявки, максимальное  значение MLO длины очереди (MLO увеличивается при LO>MLO и не меняется, если LO<MLO или  LO=MLO), номер NL постановки заявки в очередь К (позволяет фиксировать общее количество заявок, находившихся то или иное время в очереди в течение прогона), номер NI изъятия заявки из очереди (может использоваться для контроля обращения к файлу), содержание элементов массива A3 (предназначенных для кодов событий), состояние программы обработки (оператора приема заявки) BUSY (свободен). Последним рабочим оператором производится планирование очередного события “приход заявки”, где в качестве KEVNTZ употреблен сам код класса, а DTIME рассчитывается по формуле экспоненты.

Главный модуль. Зависит от языка программирования. Пример на фортране:

COMMON /COM1/ MATR,…

DEFINE FILE 1(K1…NZ), 2(K2…NK)

MATR=1

NNQ1=K1

TTFIN=480

TTBEG=0

NRNS=0

NNRNS=10

I1=0

I2=0

M=20.

CALL SLAM

STOP

END

Цифры 1, 2 в операторах объявления файлов – их номера; K1, K2 – количество планируемых записей; NZ, NK – указатели  рабочих записей. Переменные I1, I2 – параметры генератора случайных чисел (зависит от ЭВМ). CALL SLAM – оператор вызова процессора управления.

Обработка событий. Алгоритмы обработки (реализации) событий создаются применительно к особенностям моделируемого объекта. Рассмотрим, например, вариант модуля обработки событий класса 1 – “приход заявки”:

SUBROUTINE ARVL

COMMON /COM1/ MATR,…

CALL SCHDL(1, EXPONS(20.0), ATRIB)

ATRIB(1)=TNOW

IF(BUSY.EQ.0) GOTO 10

LO=LO+1

IF(LO.GT.MLO) MLO=LO

NL=NL+1

WRITE(2’NL) ATRIB

RETURN

10   BUSY=1

DTIMZ=10+15*RAN(I1,I2)

CALL SCHDL(2, DTIMZ, ATRIB)

RETURN

END

Оператор CALL SCHDL(1, EXPONS(20.0), ATRIB) планирует приход следующей заявки. Оператор ATRIB(1)=TNOW уточняет атрибут обрабатываемой заявки, так как переменная TNOW получила значение TSOB, равное времени прихода этой заявки до вызова процедуры ARVL (в модуле SLAM после извлечения  из календаря записи данного события). Оператор IF(BUSY.EQ.0) GOTO 10 по состоянию переменной BUSY проверяет возможность обслуживания данной заявки. Если BUSY может быть задействована, идет переход на  метку 10. При этом переменная BUSY принимает значение 1 (обслуживание заявки) и осуществляется расчет интервала  DTIMZ, который далее используется в операторе вызова процедуры планирования событий класса 2.  Отметим, что атрибут (в массиве ATRIB) заявки, подлежащей обслуживанию в будущем, точно известен.

Если в рассматриваемый момент TNOW (момент прихода обрабатываемой заявки)  BUSY=1, заявка ставится в очередь, длина последней увеличивается (LO=LO+1), корректируется переменная MLO и возрастает общее число NL находившихся в очереди заявок

Оператор WRITE(2’NL) ATRIB заносит данные о клиенте с номером NL в файл очереди.

Ниже дан пример процедуры “окончание обслуживания” (ENDSV):

SUBROUTINE ENDSV

COMMON /COM1/ MATR,…

BUSY=0

IF(LO.GT.0) GOTO 10

RETURN

10   LO=LO –1

NI=NI+1

READ(2’NI) ATRIB

BUSY=1

CALL SCHDL(2, 10+15*RAN(I1,I2), ATRIB)

RETURN

END

Поскольку процедура ENDSV означает окончание обслуживания, переменная BUSY становится равной нулю (оператор BUSY=0). Затем проверяется наличие заявок в очереди: IF(LO.GT.0) GOTO 10. Если очередь не пуста, с метки 10 производится выбор очередной заявки (LO=LO –1), увеличение номера изъятия из очереди (NI=NI+1) и выбор из соответствующей записи файла 2 атрибута события с номером NI (READ(2’NI) ATRIB).

Оператор BUSY=1 определяет новое состояние системы - проведение операции по обработке следующей заявки. Планирование операции начинается с вызова процедуры SCHDL, куда передаются фактические параметры, в том числе интервал обслуживания 10+15*RAN(I1,I2), рассчитываемый, в отличие от предыдущего примера, в операторе вызова.

Поиск алгоритма обработки. Основываясь на приведенных выше процедурах ARVL и ENDSV, организуем поиск программы обработки событий через вызов упомянутых модулей:

SUBROUTINE EVENT(J)

GOTO(1,2), J

1           CALL ARVL

RETURN

2           CALL ENDSV

RETURN

END

Код события I передается в процедуру при ее вызове (область COMMON при этом можно не указывать) . Это число в операторе GOTO(1,2), J задает метку оператора вызова соответствующей программы.

Процедуры сбора и обработки данных, как и модули их вывода (оформление отчета), оформляются изложенными выше способами и могут варьироваться в зависимости от цели имитации и объема представления материала. Например, для вывода данных о NRNS и MLO в записи 1, 2 файла 5 по соответствующему формату можно написать такую процедуру:

SUBROUTINE OTPUTN

COMMON /COM1/…

WRITE (5,1) NRNS

1                   FORMAT ('NRNS=', I2)

WRITE (5,2) MLO

2                   FORMAT ('MLO=', I2)

RETURN

END

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

 

5. СКАНИРОВАНИЕ АКТИВНОСТЕЙ

 

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

В непрерывной модели вначале проверяются условия выполнения  неравенств и только затем проводится уточнение момента реализации события. Для этого время TNOW при первом выполнении условий реверсируется назад на величину сделанного шага DTNOW, сам шаг DTNOW уменьшается, TNOW увеличивается затем на этот новый (меньший, чем  DTNOW) шаг и вновь проверяются указанные условия. Если они не подтверждаются, время продвигается вперед с последним шагом и вновь проверяются те же условия. В случае  любого повторного подтверждения условий время снова сдвигается назад на величину последнего шага, этот текущий шаг сокращается еще больше и поиск точного соблюдения условий продолжается.   При соблюдении заданной точности выполнения условий момент времени, при котором эта точность достигнута, становится временем реализации события по разработанному алгоритму, а модельное время далее продвигается с прежним шагом DTNOW. Для локализации операций проверки условий возникновения структурных событий можно оформить соответствующую процедуру SEVNT.

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

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

 

6. ПРОЦЕССНО-ОРИЕНТИРОВАННЫЙ ПОДХОД

 

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

Алгоритм имитации. После загрузки модели проводится инициализация всех переменных. Затем осуществляется планирование первых событий. Для этого просматриваются все блоки модели на предмет поступления транзактов в систему (генераторы транзактов) и наличия их в модели в начальный момент времени (узлы хранения транзактов). Если требуется, планируются поступления первых транзактов в модель и операции (события) с уже имеющимися транзактами.

Фаза выполнения имитации начинается с извлечения первого события из календаря. Обновляется время и далее производится обработка события по его алгоритму. Эти действия приводят к одному из трех результатов:

1)    транзакт направляется дальше по системе;

2)    транзакт уничтожается;

3)    транзакт задерживается в данной части (блоке, узле) системы.

 

При направлении транзакта в другую часть системы осуществляется проверка действий, начинающихся в узле, из которого он выходит. Если никаких действий не производится, планируют переход транзакта в другой узел (часть) системы. Если следующего узла нет, транзакт уничтожается. Если в узле начинается какое-либо действие, оно планируется и выполняется (освобождается) и транзакт направляется в узел, в котором действие завершается. Всегда время TNOW назначается равным старому времени плюс продолжительность действия любого события.

Проверка условий окончания прогонов и всей имитации, обработка результатов и оформление отчетов осуществляются известным образом, как и при событийном моделировании  (рис.6.1).

 


7. НЕПРЕРЫВНОЕ ИМИТАЦИОННОЕ МОДЕЛИРОВАНИ
Е

 

7.1. ОБЩИЕ ПОЛОЖЕНИЯ

 

При непрерывном имитационном моделировании поведение исследуемого

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

Зависимые переменные модели составляют группу переменных состояния (структурных переменных) SS(I), имеющих начальное значение SSL(I). Расчет SS(I) ведется либо по типу SS(I) = f(SSL(I),TNOW) (алгебраическая форма), либо в виде разностного уравнения: SS(I) =SSL(I)+DTNOW*RATE(I), где  RATE(I) - темп (скорость) изменения переменной SS(I). В последнем случае можно использовать для I-й переменной приведенную форму (символ * опущен; в скобках указон не номер I-й переменной, а номер шага):

yn=A1yn-1+A2yn-2+…+ANyn-N+C,

где  yn= SS(1), yn-1=SSL(1)=SS(2), … ,  yn-N=SSL(N)=SS(N-1). Тогда

SS(1)= A1SSL(1)+A2SSL(2)+…+ANSSL(N)+C,

SS(2)=SSL(1),

SS(3)=SSL(2),

………………

 

SS(N)=SSL(N-1).

Таким образом, искомое значение SS для I-й переменной на n-м шаге времени (SS(1)) находится через предыдущие значения y (равные SS(2) на шаге n-1; SS(3) - на шаге n-2 и т.д).

В дифференциальных уравнениях вместо RATE(I) используется переменная

DD(I) - производная от SS(I) - с начальным значением DDL(I) в момент TTLAS (конец предыдущего шага времени):

SS(I) = f(SSL(I),   TNOW) = SSL(I) +      ,

где DTFUL - шаг интегрирования.

Рис.6.1. Алгоритм работы процессно-ориентированной модели

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

На  любом  временном  отрезке  интегрирования  обычно  процедура STATE

вызывается несколько раз для уточнения производной DD(I), поэтому модельное время продвигается с шагом DTNOW, составляющим часть от DDFUL. Последний, в свою очередь, зависит от ряда условий. Поэтому в общем случае DTNOW=f(DDFUL), а DDFUL=min[DTF, TTSAV-TTLAS, TNEXT-TTLAS], где DTFÎ{f(RATE), DTACC}, f(RATE) - шаг, определяемый наибольшей скоростью RATE (рассчитывается по различным методикам), DTACC - шаг интегрирования, гарантирующий точность (зависит от метода численного решения уравнений) и меняющийся   в  зависимости  от  текущей  погрешности  расчетов  в  пределах  от

DTMIN до DTMAX (задаются пользователем); TTSAV - момент сбора статистических данных; TNEXT - время свершения ближайшего события. Следует обратить внимание на то, что в случае неопределенности при инициализации переменных в правой части выражения для DDFUL всем неизвестным переменным следует задать любые максимально возможные значения, чтобы они не мешали выбору минимальной величины среди остальных компонентов.

 

7.2. АЛГОРИТМ ИНТЕГРИРОВАНИЯ РУНГЕ-КУТТА-ФЕЛБЕРГА

 

Это самозапускающийся метод с переменным размером шага, позволяющий интегрировать системы обыкновенных дифференциальных уравнений первого порядка, представленных в виде

()=((),)

и при начальных условиях (), где ()=, () - в общем случае вектор. Причем ()=SS(I), ()=DD(I), ()=SSL(I).

Алгоритм представляет собой одношаговую процедуру, включающую вычисление шести функций в течение шага =DDFUL. Пусть =+, где =TTLAS. Для вычисления надо решить следующие уравнения:

=((),), где ()=() (начальный уровень),

=(()+,+), =DTNOW1«DTNOW =f( =DTFUL),

=(()++,+), =DTNOW1+DTNOW2 ,

=(()+-+,+), … ,

=(()+-+-,+),

=(()-+-+-,+),

EERR=--++,

()=()+++-,

TERR=AAERR+RRERR*ç()ç,

где AAERR, RRERR - заданные пользователем значения абсолютной и относительной ошибок. Усли EERR £ TERR, значение () считается допустимым. Если Q = êEERRê/TERR > 1, значение  уменьшают; если Q £ 1, значение  увеличивают: всегда DTMIN £  =  /Q1/5 = DTACC £ DTMAX.

Дифференциальные уравнения более высокого порядка должны быть приведены к канонической форме:

= (,,,…,,).

Далее: SS(1) =, SS(2)==DD(1), SS(3)==DD(2), … SS(N)==DD(N-1). Тогда DD(N)=(SS(1),SS(2),…,SS(N),t); =(SSL(1),…,SSL(N)); =SSL(N),…; =SS(2); =(SSL(1)+, SSL(2)+,…,SSL(N)+)… .

 


7.3. ПРИМЕР НЕПРЕРЫВНО-ДИСКРЕТНОЙ МОДЕЛИ

 

Рассмотрим упрощенный процесс приема данных, поступающих в реляционную базу равномерно с шагом DTNOW. В базе данных сначала заполняются ячейки единичного объема количеством К3=150, затем ячейки половинного объема. Вся база данных имеет объем ZP=200 единиц. После ее заполнения начинается обработка всего массива поступившей информации. Необходимо определить время заполнения единичных ячеек и общее время приема данных.

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

Если представить дискретную модель с событиями трех классов (приход порции данных, заполнение крупных ячеек, заполнение мелких ячеек), то неудобным обстоятельством оказывается большое количество реализаций всех событий (150 событий заполнения крупных ячеек, 100 событий заполнения ячеек половинного размера в оставшемся объеме 50 единиц базы данных и, таким образом, еще 250 событий поступления элементарных пакетов данных).

Если составить несложные уравнения процесса заполнения ячеек, а события сгруппировать в два класса по одному событию в каждом классе (окончание заполнения всех крупных ячеек, окончание заполнения всей базы данных), то общее количество реализаций окажется равным только двум. Алгоритм изменения времени прост: TNOW=TNOW+DTNOW.

Процедура SEVNT:

SUBROUTINE SEVNT

COMMON …

IF(ZP.GE.200) GOTO 2

IF(K.EQ.K3) GOTO 1

RETURN

1  I=1

CALL EVENT(I)

RETURN

2  I=2

CALL EVENT(I)

RETURN

END

Здесь первый оператор IF проверяет окончание приема всех данных, а второй - заполнение крупных ячеек (К - текущее число принятых элементарных пакетов). В зависимости от ситуации код I при вызове подпрограммы EVENT оказывается различным.

Процедура STATE:

SUBROUTINE STATE

COMMON…

IF(K.GE.K3) GOTO 1

K1=K1+1

GOTO 2

1  K1=K3

K2=K2+1

2  ZP=K1*EZP1+K2*EZP2

K=K1+K2

RETURN

END

Вначале, при К< К3, растет количество заполненных единичных ячеек К1 (начальное значение К1 должно быть задано). Затем идет переход по метке 2 и рассчитывается общий объем заполнения  ZP (EZP1 - размер крупной, а EZP2 - размер мелкой ячеек; К2 - число ячеек половинного размера - начальное значение должно быть определено заранее). Далее рассчитывается общее число заполненных ячеек для последующих проверок состояния базы данных.

Если  текущее К ³ К3, следует переход по метке 1, число К1 больше не меняется, растет количество заполненных ячеек половинного объема, что учитывается в следующем операторе для  ZP.

Процедура EVENT:

SUBROUTINE EVENT(J)

GOTO(1,2),J

1       CALL SOB1

RETURN

2       CALL SOB2

RETURN

END

Коды событий, передаваемые в подпрограмму (J), используются оператором перехода  GOTO(1,2),J для вызова соответствующей процедуры обработки - SOB1, SOB2.

Процедура обработки событий первого класса:

SUBROUTINE SOB1

COMMON…

TSOB1=TNOW

RETURN

END

Значение переменной TNOW берется из общей области COMMON и заносится в память для TSOB1 (время заполнения больших ячеек).

Процедура обработки событий второго класса:

SUBROUTINE SOB2

COMMON…

TSOB2=TNOW

RETURN

END

Операция запоминания текущего времени TNOW в виде момента окончания приема данных аналогична предыдущей.

Процессор управления имитацией:

SUBROUTINE SLAM

COMMON…

3       CALL INTLC

4       CALL PTNOW

IF(TNOW.GE.TSOB2) GOTO 1

CALL STATE

CALL SEVNT

GOTO 4

1       CALL OTPUTN

IF(NRNS.GE.NNRNS) GOTO 2

GOTO 3

2       CALL OTPUT

RETURN

END

После INTLC вызывается программа PTNOW для изменения системного времени. Первый оператор IF делает проверку на окончание прогона. Если прогон продолжается, в очередной раз вызывается процедура STATE, вычисляются переменные модели (время, определяющее параметры  К1 и К2 в STATE, используется неявно через вызов, увеличивающий на единицу указанные переменные  после очередного приращения TNOW в PTNOW; формально время в подпрограмме STATE легко трансформировать в числа К1, К2 через отношение TNOW/DTNOW). Если прогон должен быть завершен, переход по метке 1 приводит к офомлению прогонного отчета. Дальнейшая проверка вторым оператором IF показывает направление работы (к следующему прогону по метке 3 или к окончанию имитации - метка 2). Переменная NRNS в указанном операторе  должна увеличиваться при каждом обращении к процедуре INTLC.

Процедура изменения времени:

SUBROUTINE PTNOW

COMMON…

TNOW=TNOW+DTNOW

RETURN

END

Алгоритм изменения системного времени прост и не предусматривает коррекции и реверса. Это связано с тем, что два структурных события в модели возникают при достижении параметров К и ZP заданных пороговых уровней, не требующих уточнения времен TSOB1, TSOB2 (последние автоматически становятся известными при достижении К, ZP нужных величин). Шаг DTFUL и другие переменные отсутствуют, так как нет интегрирования.

Процедура INTLC:

SUBROUTINE INTLC

COMMON…

NRNS=NRNS+1

ZP=0.

TNOW=TTBEG

K1=0

K2=0

RETURN

END

После увеличения номера прогона проводится обнуление переменных ZP, K1, K2 и задается начальное модельное время TNOW.

Главный модуль:

COMMON…

NRNS=0

TTBEG=0

TTFIN=900

DTNOW=2.

EZP1=1.

EZP2=.5

K3=150

CALL SLAM

CALL OTPUT

STOP

END

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

Резюмируя вышеизложенное, можно сказать, что в зависимости от цели имитационного исследования модель может иметь разный вид и концепцию. В этом заключается один из основополагающих принципов моделирования - принцип множественности моделей. Для сложных систем отдельные ее части допустимо заменять определенными параметрами (набором параметров), упрощающими общую схему модели. Такой подход определяет принцип параметризации моделей. Далее, отсутствие сведений о характеристиках системы или ее частей делает бессмысленным само моделирование. Последнее приводит к принципу информационной достаточности. И, наконец, создаваемая модель должна обеспечить достижение цели за конечное время в условиях ограниченности ресурсов. Данный тезис говорит о принципе осуществимости моделей.

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