Тема 10. Программная модель в системе Pilgrim Цели изучения темы:
познакомиться с технологией создания Pilgrim -модели;
выяснить состав результатов моделирования;
изучить правила выполнения основных этапов технологии создания и использования модели.
Задачи изучения темы:
понять назначение языковых средств системы Pilgrim;
выяснить состав, структуру и форматы выходных параметров моделирования.
Успешно изучив тему, Вы: получите представление о:
основных языковых средствах системы Pilgrim;
структуре и форматах разделов программной Pilgrim-модели;
составе узловых операторов модели;
будете знать:
как прочитать текст программной модели на исходном языке;
как внести изменения модель минуя этап описания ее графа;
как собрать исполнительный модуль модели;
как запустить модель;
как прочитать результаты моделирования;
семантику и синтаксис основных узлов.
Вопросы темы: 1. Структура программной модели в системе Pilgrim.
2. Узловые операторы.
3. Текст программной модели СМО.
4. Сборка и запуск исполнительного модуля модели.
5. Результаты моделирования.
Вопрос 1. Структура программной модели в системе Pilgrim. Все узлы имитационных моделей являются процессами в системе
Pilgrim. Стохастическая сеть, в виде которой представляется модель, не является вычислительным алгоритмом.
Попытки представить имитационную модель в виде набора алгоритмов приводят к написанию больших (и сложных) моделирующих программ. Такой подход называется
алгоритмическим моделированием; он не всегда доступен прикладному специалисту, даже имеющему подготовку в области программирования.
150
Модель реальной системы может состоять из очень большого числа узлов. Поэтому нужны специальные языковые средства, не являющиеся языком программирования, которые бы позволили в лаконичном (по сравнению с текстом компьютерной программы) виде описать модель. Эти средства должны учитывать особенности узлов, жизненных циклов транзактов, условий прохождения транзактов по дугам, их размножения и гибели, а также функциональные особенности взаимодействия процессов, связанных с финансовыми, материальными и информационными ресурсами.
Набор языковых средств, предназначенных для описания имитационных моделей процессов, обеспечивает выполнение следующих задач:
1) Инициализацию объектов и структур данных при запуске программной модели.
2) Описание узлов с помощью общих операторов управления транзактами, событиями и узлами модели.
3) Функциональное описание процессов управления материальными и денежными ресурсами.
4) Управление переходами между слоями модели при многоуровневой декомпозиции.
5) Описание сигнальных управляющих функций.
Данные средства по форме записи являются функциями, через параметры которых реализуются синтаксические связи между объектами
(узлами, транзактами, ресурсами и событиями) имитационной модели. Форма записи различных условий и условных действий соответствует языку C++.
Ниже представлен перечень основных разделов программного модуля на языке C++, на основе которого формируется исполнительный модуль для реализации модельных экспериментов (названия необязательных разделов заключены в квадратные скобки).
#include
[Глобальные переменные и функции] forward
[Локальные переменные модели] modbeg (p
1
,p
2
,p
3
,p
4
, p
5
,p
6
,p
7
,p
8
,p
9
) ag (p
1
,p
2
,p
3
,p
4
, p
5
,p
6
,p
7
,p
8
)
………………………… ag (p
1
,p
2
,p
3
,p
4
, p
5
,p
6
,p
7
,p
8
)
[Сигнальные функции] network (p
1
,p
2
)
{
Узел 1
……..
151
Узел N
modend (p
1
,p
2
,p
3
,p
4
) return 0;
Препроцессорная инструкция
#include подключает моделирующую среду имитатора к модели.
Оператор modbeg (Р
1
, Р
2
, Р
3
, Р
4
, Р
5
, Р
6
, Р
7
, Р
8
, Р
9
) осуществляет первоначальную настройку моделирующих программ и инициализацию в памяти ЭВМ графа модели. Аргументы этой функции имеют следующий смысл:
Р
1
– символическое имя узла: строка длиной до 14 символов (типа char);
Р
2
– максимальный номер узла модели (типа int), причем
2≤p2≤mmax, где mmax – некоторое граничное значение, задаваемое при установке имитатора на ЭВМ (обычно mmax =1024);
Р
3
– модельное время, в течение которого необходимо производить моделирование (типа float);
Р
4
– произвольное целое число, используемое для настройки датчиков псевдослучайных величин (long). В каждом узле есть свой независимый датчик. В качестве этого числа полезно использовать значение таймера ЭВМ, обращение к которому имеет следующий вид p
4
=(long)time(NULL). В этом случае результаты разных прогонов модели будут разными, имеющими случайные отклонения. При отладке лучше использовать постоянную комбинацию цифр, например, p
4
=(long)2013456789.
Р
5
– признак режима пространственной имитации (типа int); возможные значения:
earth –поверхность Земли (сферические географические координаты широта и долгота);
plane –декартова плоскость (прямоугольная система координат);
cosmos –произвольное пространство (ответственность за правильность его представления возлагается на разработчика модели);
none – если пространственная имитация в модели не используется.
Р
6
– номер (типа int) одной из очередей (узел типа queue, attach или send), которую необходимо контролировать во времени для анализа динамики задержек в этой очереди с графическим отображением результатов.
152
Р
7
– номер (типа int) одного из процессов (узла типа proc), который необходимо контролировать как в пространстве, так и во времени с графическим отображением результатов. Если нет необходимости в графической интерпретации, то указывается none.
Р
8
– номер (типа int) терминатора (узел типа term), на входе которого необходимо наблюдать интенсивность потока транзактов во время моделирования. Если такой необходимости нет, то указывается none.
Р
9
– точность (типа int). Если Р
9
=1..6, то имитатор будет использовать от 1 до 6 знаков после запятой при выводе результатов; если Р
9
=none, то результаты будут округляться до целых значений.
Оператор network (Р1, Р2) представляет собой координатор процессов модели. Он осуществляет диспетчеризацию транзактов в узлах модели, планирует события в едином модельном времени и активизирует дискретные или непрерывные компоненты модели, имитирующие внешнюю среду. Аргументы Р1 и Р2- это имена (адреса) соответствующих программных функций моделирования внешней среды, производящих интегрирование, решение разностных уравнений, вычисление по формулам и т.д. Функции float Р1 (d) и float Р2 (d), если они необходимы, пишутся пользователем. Если процессы Р1 (d) и Р2 (d) не моделируются, то в качестве Р1 и Р2 записывается dummy.
Оператор modend (Р
1
, Р
2
, Р
3
, Р
4
) выполняется по окончании моделирования. Он позволяет просмотреть на экране монитора графические результаты и выводит итоговые результаты в файл-отчет.
Аргументами оператора являются:
Р
1
– символическое имя файла-отчета (сhar);
Р
2
– номер первой страницы отчета (int);
Р
3
– число строк на каждой странице (int);
Р
4
– флаг символа перевода страницы в файле-отчете; возможные значения:
page символ ставится;
none символ не ставится.
153
Вопрос 2. Узловые операторы.
Узел в тексте программы состоит из шести компонентов
(необязательные компоненты заключены в квадратные скобки): top(i):
[Описание условий]
Узловой оператор
[Сигнальные функции]
[Блок операторов С++] place;
Описание узла начинается с метки-функции top (i), где i - номер этого узла (записывается с двоеточием).
Начиная с метки top(i) транзакт проходит все операторы узла i без временных задержек и попадает в оператор place, где находится до тех пор, пока не появятся условия для перехода в следующий узел.
В некоторых узлах одновременно могут находиться несколько транзактов и все они содержатся в операторе place.
Не следует путать поток транзактов в модели с потоком управлений в обычной программе. Задержка транзакта в place - это и есть время пребывания в узле.
После метки top(i) можно анализировать условия продвижения транзактов по графу модели, при этом используются операторы if или
switch. Для динамического изменения направления движения транзактов, законов распределения, значений времени обслуживания и других параметров можно использовать операцию присваивания.
Например, если в узле 3 нужно изменить значение переменной b в зависимости от значения переменной а, то следует записать: top(3): if (a < 0) b =4; else b =3*а+5; key («Переключатель», b); place; где
key - оператор, определяющий узел типа клапан.
Основным обязательным оператором, который стоит после двоеточия метки-функции, является оператор определения типа узла
(узловой оператор). Этот оператор имеет условное наименование, совпадающее с типом узла. Сводка и краткая характеристика всех узлов, имеющихся в системе Pilgrim приводится в Приложении.
154
В качестве узловых операторов могут использоваться все типы узлов кроме ag и parent.
После узлового оператора могут размещаться сигнальные функции и операторы С++, образуя конструкцию: clcode
{
<операторы>
}
Эти операторы могут задавать различные действия по управлению работой модели, например, по сбору статистики или трассировке, которые будут обсуждаться далее.
Последним оператором узла является оператор place;
Описание узла иногда состоит только из метки-функции top(i), узлового оператора и оператора place. Например: top(i): key ( «Переключатель», j ); place;
155
Вопрос 3. Текст программной модели СМО.
На рис. 33 показан текст программы, который был сгенерирован на основании описания модели в конструкторе Gem для ранее рассмотренной модели СМО.
#include forward
{ int fw; modbeg («СМО», 105, 2500, (long)time(NULL), none, 102, none,104, 2); ag («Генератор», 101, none, expo, 12.0, none, none, 102); network (dummy, dummy)
{ top (102): queue(«Очередь», none, 103); place; top (103): serv(«Сервер», 1, none, expo, 9.0, none, none, 104); place; top (104): term(«Терминатор 104»); place; fault (123);
} modend («pilgrim.rep», 1, 8, page); return 0;
}
Рис. 33. Исходный текст программной модели СМО
Для лучшего понимания сгенерированного текста приведем описание присутствующих в программе узловых операторов.
Функция ag (Р
1
, Р
2
, Р
3
, Р
4
, Р
5
, Р
6
, Р
7
, Р
8
) описывает узел, порождающий в соответствии с заданным правилом в процессе моделирования транзакты и направляющий их в указанную точку (узел) модели.
Функция имеет следующие параметры:
Р
1
- символическое имя узла (строка длиной до 14 символов типа char);.
Р
2
- номер узла-генератора (типа int);
Р
3
- число (типа int в диапазоне 1-32767), обозначающее приоритет, который присваивается сгенерированному транзакту, или none, если приоритет не присваивается;
Р
4
- тип функции распределения интервала времени между генерируемыми транзактами, имеющий значения:
norm - нормальное распределение;
unif - равномерное распределение;
156
expo - экспоненциальное распределение;
erln - обобщенное распределение Эрланга;
beta - треугольное распределение;
none -если интервал обслуживания является детерминированной величиной.
Р
5
- величина (типа float), зависящая от типа функции распределения Р
4
:
математическое ожидание интервала времени обслуживания транзакта (при Р
4
= norm, unif, expo);
математическое ожидание одного слагаемого этого интервала
(при Р
4
= erln);
минимальное значение интервала (при Р
4
= beta);
постоянная величина этого интервала (при Р
4
= попе).
Р
6
– величина (типа float), зависящая от типа функции распределения Р
4
:
среднеквадратичное отклонение времени обслуживания (Р
4
=
norm);
максимальное отклонение от среднего времени обслуживания
(Р
4
= unif);
значение zero (Р
4
= expo, none);
число слагаемых, распределенных по экспоненциальному закону и входящих в случайный интервал обслуживания (если Р
4
= erln, то Р
6
> 0);
наиболее вероятное значение интервала времени обслуживания транзакта (при Р
4
=beta).
Р
7
- величина (типа float), зависящая от типа функции распределения Р
4
:
максимально возможное значение интервала времени обслуживания транзакта (Р
4
=beta);
значение zero (Р
4
= norm, unif, expo, erln, ш).
Р
8
- номер узла (типа int), в который поступает сгенерированный транзакт (узел-приемник).
Функция queue(Р
1
,Р
2
,Р
3
) описывает узел, моделирующий очередь транзактов.
Функция имеет следующие параметры.
Р
1
– символическое имя узла (строка длиной до 14 символов типа char);
Р
2
– тип организации очереди (типа int):
Р
2
– ргtу, если очередь с приоритетами,
Р
2
– none, если очередь без приоритетов.
157
Р
3
– номер узла (типа int), в который переходит транзакт из очереди (узел-приемник).
Если в качестве параметра Р
6
оператора modbeg поставить номер узла-очереди, то можно автоматически получать график изменения среднего времени нахождения транзактов в этой очереди.
Функция serv (Р
1
, Р
2
, Р
3
, Р
4
, Р
5
, Р
6
, Р
7
, Р
8
) описывает узел, имитирующий одно- или многоканальный обслуживающий прибор.
Может использовать или не использовать дисциплину обслуживания на основе абсолютных приоритетов. Имеет стек для хранения прерванных транзактов.
Функция имеет следующие параметры:
Р
1
- символическое имя узла (строка длиной до 14 символов типа char);
Р
2
- число обслуживающих каналов, l < Р
2
<32767;
Р
3
- дисциплина обслуживания; возможные значения:
abs, используется приоритетная дисциплина, с прерыванием обслуживания менее приоритетного транзакта более приоритетным; при этом после ухода приоритетного транзакта возможно одно из двух:
дообслуживание прерванного транзакта с прерванного места;
возобновление обслуживания прерванного транзакта заново.
none, используется бесприоритетная дисциплина.
Р
4
- тип функции распределения интервала времени обслуживания транзакта в канале узла, возможные значения:
norm - нормальное распределение;
unif - равномерное распределение;
expo - экспоненциальное распределение;
erln - обобщенное распределение Эрланга;
beta - треугольное распределение;
none -если интервал обслуживания является детерминированной величиной.
Р
5
- величина (типа float), зависящая от типа функции распределения:
математическое ожидание интервала времени обслуживания транзакта (при Р
4
= norm, unif, expo);
математическое ожидание одного слагаемого этого интервала
(при Р
4
= erln);
минимальное значение интервала (при Р
4
= beta);
постоянная величина этого интервала (при Р
4
= none).
158
Р
6
– величина (типа float), зависящая от типа функции распределения:
среднеквадратичное отклонение времени обслуживания (Р
4
=
norm);
максимальное отклонение от среднего времени обслуживания
(Р
4
= unif);
значение zero (Р
4
= expo, none);
число слагаемых, распределенных по экспоненциальному закону и входящих в случайный интервал обслуживания (если Р
4
= erln, то Р
6
> 0);
наиболее вероятное значение интервала времени обслуживания транзакта (при Р
4
=beta).
Р
7
- величина (типа float), зависящая от типа функции распределения:
максимально возможное значение интервала времени обслуживания транзакта (Р
4
=beta);
значение zero (Р
4
= norm, unif, expo, erln, none).
Р
8
- номер узла (типа int), в который передается обслуженный транзакт (узел-приемник).
Функция term (Р
1
) описывает узел-терминатор, который удаляет из модели входящий в него транзакт и фиксирует время его существования начиная с момента выхода этого транзакта из генератора.
Функция имеет один параметр:
Р
1
- символическое имя узла (строка длиной до 14 символов типа char).
Если в качестве параметра Р
8
подставить в modbeg номер узла- терминатора, то можно автоматически получать график потока транзактов, поступающих на его вход.
Вопрос 4. Сборка и запуск исполнительного модуля модели.
Сгенерированный в результате описания модели файл с исходным текстом (<имя модели>.cpp) используется в качестве основы для получения работающей программы. Для этого необходимо выполнить следующую последовательность шагов.
1) Создать на жестком диске рабочую папку для будущего проекта.
2) Перенести в рабочую папку файл модели <имя модели>.cpp.
3) Открыть приложение Microsoft Visual С++.
4) Создать проект:
159
File New Projects Win32 Application.
В окне Locaton посредством кнопки (Browse) указать путь к файлу модели <модель>.cpp.
В окне Project name указать имя проекта (латинскими буквами) и нажать кнопку OK.
В открывшемся окне оставить неизменными установку по умолчанию для типа проекта (Empty application) и нажать кнопку OK.
5) Внести в проект файлы, необходимые для построения объектного кода модели (в таблице указаны папки, в которых обычно хранятся файлы):
Файл
Папка
Примечание
Comctl32.lib
Visual Studio/VC98/Lib
Стандартная папка С++
Pilgrim.lib
Visual Studio/VC98/Lib
Стандартная папка С++
Pilgrim.res
Visual Studio/VC98/ Projects
Стандартная папка С++
<имя модели>.cpp папка с файлом исходного текста программной модели
Должно соответствовать имени проекта, указанного в окне Location (файл модели);
Вставка выполняется командой Add Files To Folder / Add Files To
Project контекстного меню, вызываемого правым щелчком мыши после установки курсора на имя проекта (предварительно должна быть выбрана вкладка в окне проектов).
6) Построить исполняемый файл модели.
Выполняется одним из следующих способов: o Build Rebuild All главного меню Visual Studio. o
Нажатием функциональной клавиши F7. o
Нажатием значка панели инструментов.
Если в окне отчета о процессе построения появится сообщение 0
errors, можно запустить программную модель с помощью одного из следующих способов:
Build Execute ModelPro.exe.
Нажатием комбинации функциональных клавиш Ctrl + F5.
Нажатием значка панели инструментов.
Установка параметров запуска модели и сам запуск производятся с помощью окна запуска. В частности, если требуется наблюдать график задержки по выбранной при построении графа модели очереди в динамике, то перед запуском программной модели нужно выбрать в меню Результаты пункт Динамика задержек в очереди (рис. 34Рис.).