СИМУЛА - универсальный процессо-ориентированный язык моделирования, страница 11

Рассмотрим применение наборов и процедур, определенных в классе SIMSET, для отображения и обработки иерархических древовидных структур объектов [1]. Узлы дерева удобно отображать с помощью объектов, которые можно включать в наборы, т.е. объектов, принадлежащих подклассу класса LINK. Ветви дерева, исходящие из некоторого узла, можно представить набором, членами которого являются объекты, соответствующие узлам следующего яруса, связанным с этим узлом. Дополнительная информация, характеризующая узлы дерева, может представляться значениями атрибутов соответствующих им объектов.

Таким образом, объекты, отображающие узлы дерева, могут быть описаны следующей декларацией класса:

LINK ‘CLASS’ УЗЕЛ (НОМЕР); ‘INTEGER’ НОМЕР;

‘BEGIN’ ‘REF’ (HEAD) ВЕТВИ; ‘INTEGER’ M;

ВЕТВИ:- ‘NEW’ HEAD;

‘END’ УЗЕЛ;

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

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

1

 

5

 
                                                                          

2

 
 


                                 

3

 

4

 
 


РИС. 2.1.

Нумерация вершин дерева и их генерации производится в направлении “сверху - вниз” и “слева - направо”. Будем считать, что количество ветвей для узла с номером 1 задано в 1-м элементе массива КОЛВЕТВЕЙ [1; К]. Например, для генерации дерева (РИС. 2.1. числа обозначают их порядковые номера).

Элементы массива КОЛВЕТВЕЙ должны иметь такие значения: 2, 2, 0, 0, 0. Введем глобальные переменные КОРЕНЬ и ТН для обозначения корня дерева и текущего номера генерируемого узла. Далее дан фрагмент СИМУЛА-ПРОГРАММЫ, который производит генерацию дерева, узла которого отображаются объектами класса узел:

‘INTEGER’ КОЛВЕТВЕЙ [1; K]; ‘INTEGER’ TH;

‘REF’ (УЗЕЛ)  КОРЕНЬ;

‘PROCEDURE’ СВЯЗАТЬ (У); ‘REF’  (УЗЕЛ)  У;

‘BEGIN’ ‘INTEGER’ KB; KB:= КОЛВЕТВЕЙ [У, НОМЕР];

‘FOR’ KB:= KB - 1 ‘WHILE’ KB=>0 ‘DO’

‘BEGIN’ ‘REF’ (УЗЕЛ) НОВЫЙ; ТН:= ТН + 1;

НОВЫЙ:- ‘NEW’ УЗЕЛ (ТН);

НОВЫЙ, INTO (У, ВЕТВИ); СВЯЗАТЬ (НОВЫЙ);

‘END’

‘END’ СВЯЗАТЬ;

КОРЕНЬ:- ‘NEW’ УЗЕЛ 1; ТН:- 1; СВЯЗАТЬ (КОРЕНЬ);

В качестве примера обработки иерархических структур рассмотрим процедуру, выполняющую обход всех узлов дерева и помечающую каждый узел целым числом, равным номеру яруса этого узла. Будем считать, что узлы дерева представлены объектами класса УЗЕЛ, и номер яруса нужно занести в атрибут М каждого объекта.

Опишем процедуру ЯРУС (K, L), которая выполняет указанную пометку для узлов поддерева с конем К, распложенным на ярусе L.

‘PROCEDURE’  ЯРУС (K, L); 'REF' (УЗЕЛ) K; ‘INTEGER’ L;

‘BEGIN’ ‘REF’ (УЗЕЛ) Т;

K, M:=L;

T:- K,  ВЕТВИ, FIRST;

‘WHILE’ T =/= ‘NONE’ ‘DO’

‘BEGIN’ ЯРУС (T, L+1); T:- T.SUC;

‘END’ ПОМЕТКИ ЯРУСА (L+1);

‘END’ ЯРУС;

Имея процедуру ЯРУС, пометку узлов (РИС. 2.1.) можно выполнить с помощью оператора ЯРУС (КОРЕНЬ.1).

Планирование процессов. Системный класс SIMULATION

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