интересно
Предыдущая | Содержание | Следующая

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

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

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

Транзакты имеют параметры, некоторые из которых всегда доступны пользователю-разработчику модели:

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

- произвольные параметры, имеющие вид переменной с плавающей точкой;

- признак обслуживания транзакта вновь, который устанавливается операцией присваивания ему глобальной константы again, как это было показано при рассмотрении функции serv;

- приоритет транзакта;

- номер семейства, к которому принадлежит транзакт;

- параметр запоминает номер (индекс) точки пространства.

Номер точки позволяет определить ее координаты lat и Ion в массиве space.

. Изменение других параметров следует доверить только системе Pilgrim.

Во время прохождения транзакта через узел номер этого узла находится в глобальной переменной next. Перечисленные ниже параметры узла доступны пользователю для анализа (но не для их изменения):

addr[next]->nc - число каналов в узле;

addr[next]->na - число транзактов, прошедших через узел на данный момент модельного времени;

addr[next]->tn - число транзактов, находящихся в узле в данный момент;

addr[next]->ts - среднее время обслуживания, подсчитанное на данный момент;

- признак состояния узла типа key. Целочисленная переменная, принимающая значение true, если клапан открыт, или false - если он закрыт;

addr[next]->se - признак состояния узла типа delet. Целочисленная переменная, принимающая значение nil, если в узле нет уничтожающего транзакта;

addr[next]->kx - номер (индекс) точки, в которой находится узел типа creat, delet или proc. По номеру точки определяются ее координаты lat и Ion.

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

причем сам транзакт в это время находится в произвольном узле. Следует отметить, что возможны пробные обращения координатора network к ветви top(i) для анализа состояния узла, но не для ввода транзакта в этот узел. Факт входа транзакта фиксируется в глобальной переменной go и автоматически анализируется всеми функциями Pilgrim. Поэтому еще раз необходимо обратить внимание на то, что поток управлений в программе и поток транзактов в модели -это разные явления.

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

Все необычные ситуации, мешающие нормальному продолжению моделирования, фиксируются в глобальной переменной error. Моделирование может выполняться только тогда, когда error равна нулю. Значения этой переменной от 1 до 100 зарезервированы для нужд Pilgrim.

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

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

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

Введем в рассмотрение переменную пользователя типа float v. Связь с датчиками, осуществляется с помощью следующих функций:

v = normal(m,s) - нормальный закон распределения;

v = expont(m) - экспоненциальный закон;

v = unifrm(m,r) - равномерный закон на отрезке [m-r,m+r];

v = rundum() - равномерный закон на отрезке [0,1 ];

v = erlang(e,z) - обобщенный закон Эрланга;

v = triplex(a,b,c)- треугольный закон распределения.

В данном случае использованы следующие обозначения входных параметров типа float:

m - математическое ожидание (в случаях normal, expont, unifrm); s - среднеквадратичное отклонение (в случае normal);

е - матожидание величины одного элемента (в случае erlang);

г - максимальное отклонение (в случае unifrm);

2 - количество отрезков z > 0 (в случае erlang);

а - минимальное значение (в случае triplex);

b - наиболее вероятное значение (в случае triplex);

с - максимальное значение (для triplex).

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