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

ЛАБОРАТОРНАЯ РАБОТА № 1

КАЛЕНДАРЬ СОБЫТИЙ

Цель работы: ознакомление со структурой и обслуживанием календаря событий систем имитационного моделирования.

ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

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

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

program Calendar;

uses CRT;

type

TAttr = array[0..10] of Integer;

TEvent = record

EventCode,EventTime, EventPri: Integer; EventAttrs: TAttr; end;

TEvents = array[1..5] of TEvent;

TEventsRec = record

EventCount: Integer; EventArray: TEvents; end;

var Now: Integer; f: File of TEventsRec;

procedure WriteEvents (Events: TEventsRec);

var i: Byte; j: Byte; begin

for i:=1 to 5 do  begin

Write (Events.Event Array[i]. EventCode:3, Events.Event Array[i].

EventTime:3, Events. EventArray[i]. EventPri:3,' [');

for j:=1 to Events. EventArray[i]. EventAttrs[0] do

Write (Events. EventArray[i]. EventAttrs[j]:2); Write (' ]');  writeln;  end;

Writeln; end;

procedure GroupEvents (var Events: TEventsRec);

var i, j: Integer;  TmpEvent: TEvent;

begin  Writeln ('Группировка событий');

for i:=1 to 4 do

for j:=5 downto i+1 do  begin

if ((Events.EventArray[i]. EventTime>Events. EventArray[j]. EventTime) and

(Events. EventArray[j]. EventCode<>0)) or ((Events. EventArray[i].

EventCode=0) and (Events. EventArray[j]. EventCode<>0)) or

((Events. EventArray[i].EventTime=Events. EventArray[j].EventTime) and

(Events. EventArray[i]. EventPri>Events. EventArray[j]. EventPri)) then begin

TmpEvent:=Events. EventArray[i];

Events. EventArray[i]:=Events. EventArray[j];

Events. EventArray[j]:=TmpEvent;

end;   end; end;

procedure Shedule (EventCode, EventTime, EventPri: Integer; EventAttrs: TAttr);

var  i: Byte;   NewEvent: TEvent; Events: TEventsRec;

begin  Writeln ('Планирование события');

Write ('Атрибуты (номер и приоритет события): ');

for i:=1 to EventAttrs[0] do

Write (EventAttrs[i]:3);  Writeln;

Writeln ('Код события: ', EventCode);

Writeln ('Время события: ', EventTime);                                   ­

Writeln ('Записи о событиях в календаре (код,время,приоритет, [номер, приоритета]:');

NewEvent. EventCode:=EventCode; NewEvent. EventTime:=EventTime;

NewEvent. EventPri:=EventPri; NewEvent. EventAttrs:=EventAttrs;

Seek (f, 0);  Read (f, Events); inc (Events. EventCount);

Events. EventArray [Events. EventCount]:=NewEvent;

WriteEvents (Events); GroupEvents (Events);

Seek (f,0);  Write (f, Events);  WriteEvents (Events); end;

procedure Extract;

var  Events: TEventsRec; i,j: Integer;  begin

Writeln ('Извлечение первого события из календаря'); Seek (f, 0);

Read (f, Events);

if Events. EventCount<>0 then begin

Write ('Атрибуты извлекаемого события: ');

for i:=1 to Events. EventArray [1]. EventAttrs [0] do

Write (Events. EventArray [1]. EventAttrs [i]:3);

Writeln;

Writeln ('Код извлекаемого события: ', Events.EventArray [1]. EventCode);

Writeln ('Время извлекаемого события: ', Events.EventArray[1].EventTime);

Writeln ('Приоритет извлекаемого события:',Events.EventArray [1].EventPri);

Events. EventArray [1]. EventCode:=0;  Events. EventArray [1].EventTime:=0;

Events. EventArray [1]. EventPri:=0;

for i:=1 to Events. EventArray [1]. EventAttrs [0] do

Events. EventArray [1]. EventAttrs [i]:=0;

WriteEvents (Events); GroupEvents (Events); dec (Events. EventCount);

WriteEvents(Events);Seek(f, 0); Write(f, Events);

end; end;

var

i,j,nsob: Byte; Events: TEventsRec; NewAttr: TAttr;

begin

ClrScr; Now:=1; NewAttr [0]:=2; Assign (f, 'sheduler.dat');  Rewrite (f);

for i:=1 to 5 do  begin

Events. EventArray [i]. EventCode:=0;

Events. EventArray [i]. EventTime:=0;

Events. EventArray [i]. EventPri:=0;

for j:=0 to 10 do

Events. EventArray [i]. EventAttrs[j]:=0;    end;

Write (f,Events);

NewAttr [1]:=_; NewAttr [2]:=_;

Writeln ('Планирование первого события');

Shedule (_,_,_,NewAttr);  Readkey;

NewAttr [1]:=_; NewAttr [2]:=_;

Writeln ('Планирование второго события');

Shedule (_,_,_,NewAttr);  Readkey;

NewAtt [1]:=_; NewAttr [2]:=_;

Writeln ('Планирование третьего события');

Shedule (_,_,_,NewAttr);  Readkey;

NewAttr [1]:=_; NewAttr [2]:=_;

Writeln ('Планирование четвертого события');

Shedule (_,_,_,NewAttr);  Readkey;

NewAttr [1]:=_; NewAttr [2]:=_;

Writeln ('Планирование пятого события');

Shedule (_,_,_,NewAttr);  Readkey; Extract; Readkey; Close (f);

end.

В программе используются следующие переменные:

NewAttr –  атрибуты события;

Shedule –  процедура, параметрами которой являются:

EventCode - код планируемого события,

EventTime - время свершения планируемого события,

EventPri - приоритет события;

EventCount - число записей календаря;

now -текущее время.

Подчеркивания, имеющиеся в программе, заменяются числовыми значениями, указанными в таблице вариантов (табл. 1). Для каждого события атрибуты NewAttr [1] и NewAttr [2] задают номер события и его приоритет, а составляющие, вносимые в оператор вызова процедуры Shedule, определяются параметрами переменных EventCode, EventTime и EventPri соответственно.

При проведении операций с календарем данные из файла календаря f копируются в массив. Для формирования очередного события используется вспомогательный массив TEvents, в который поступают атрибуты события, его код и приоритет. Извлечение атрибутов производится в специализированный массив Тattr. В качестве атрибутов рассматриваются приоритет и время свершения события.

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

 

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Ознакомиться с теоретической частью лабораторной работы.

2. Проанализировать последовательность выполнения процедур и их алгоритмы.

3. Набрать программу имитации с данными соответствующего варианта, приведенными в табл. 1.

4. Отладить программу.

5. Вывести результаты прогона в пошаговом режиме.

6. Оформить отчет.

Таблица 1

Вариант

NewAttr

EventCode

EventTime

EventPri

1

2,2; 1,1; 2,1; 4,4; 4,3

1;2;3;4;5

3;2;3;5;5

2;1;1;4;3

2

1,1; 3,3; 2,1; 3,2; 4,1

1;2;1;3;2

2;4;3;4;5

1;3;1;2;1

3

5,2; 2,3; 2,1; 5,1; 2,2

3;2;1;3;1

6;3;3;6;3

2;3;1;1;2

4

1,2; 4,4; 2,3; 1,2; 4,3

2;3;1;2;4

2;5;3;2;5

2;4;3;2;3

5

3,2; 3,3; 4,5; 5,4; 3,1

1;1;2;3;1

4;4;5;6;4

2;3;5;4;1

6

1,2; 6,7; 2,4; 1,1; 3,5

7;6;4;7;5

2;7;3;2;4

2;7;4;1;5

7

6,4; 2,5; 1,4; 6,2; 4,6

1;4;3;2;5

7;3;2;7;5

4;5;4;2;6

8

6,3; 6,4; 6,2; 6,1; 6,5

1;2;3;4;5

7;7;7;7;7

3;4;2;1;5

9

1,1; 3,3; 3,4; 3,2; 3,1

1;4;2;4;4

2;4;4;4;4

1;3;4;2;1

10

6,3; 3,4; 3,2; 6,2; 3,3

4;3;3;4;2

7;4;4;7;4

3;4;2;2;3

СОДЕРЖАНИЕ ОТЧЕТА

1. Краткое описание алгоритма имитации.

2. Результаты процесса моделирования.

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Какую функцию выполняет календарь событий?

2. Что включается в запись календаря?

3. Как производится подготовка календаря перед его заполнением?

4. Откуда извлекается информация о событиях, помещаемая в календарь?

5. Каким образом производится перегруппировка событий в календаре?

6. Как в модели используется информация о событии, извлеченная из календаря?

 

 

ЛАБОРАТОРНАЯ РАБОТА № 2

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

Цель работы: ознакомление со структурой и функционированием дискретной имитационной модели.