Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МОДЕЛИРОВАНИЕ ПРОЦЕССОВ И СИСТЕМ / Мет.ук.лаб.раб.МПиС.00г..doc
Скачиваний:
48
Добавлен:
21.03.2016
Размер:
130.56 Кб
Скачать

17

Лабораторная работа №1 календарь событий

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

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

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

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

program kalendar;

uses crt;

type

ta1=array [1..10] of integer;

ta2=array [1..12,1..10] of integer;

var

i,j,kevnt,matr,dtime,nnq1,tnow:integer;

f:file of ta2;

a,b,a1,a2,attr:ta1;

a3:ta2;

procedure grup;

var

l,k,h,i,j,n:integer;

begin

writeln(' Подпрограмма перегруппировки');

seek(f,0);

read(f,a3);

n:=1;

while a3[matr+2,n]=0 do

begin

for k:=1 to nnq1-1 do

for l:=1 to matr+2 do

begin

a3[l,k]:=a3[l,k+1];

a3[l,k+1]:=0;

end;

n:=n+1;

end;

h:=nnq1 div 2;

i:=0;

while h<>0 do

begin

for j:=h+1 to nnq1 do

begin

i:=j-h;

for k:=1 to matr+2 do

a[k]:=a3[k,j];

repeat

for k:=1 to matr+2 do

b[k]:=a3[k,i];

if (a[matr+2]<b[matr+2])and(a[matr+2]>0) then

begin

for k:=1 to matr+2 do

a3[k,i+h]:=b[k];

i:=i-h;

end;

until (i<=0)or(a[matr+2]>=b[matr+2])or(a[matr+2]=0);

for k:=1 to matr+2 do

a3[k,i+h]:=a[k];

end;

h:=h div 2;

end;

seek(f,0);

write(f,a3);

writeln(' Вывод нового календаря');

for i:=1 to nnq1 do

begin

for j:=1 to matr+2 do

write(a3[j,i],' ');write(' ');

end;

writeln;

end;

procedure schdl(kevnt,dtime:integer;a4:ta1);

var

i,j:integer;

begin

for i:=1 to matr do a2[i]:=a4[i];writeln('Атрибуты события ',a1[1]);

a2[matr+1]:=kevnt;writeln('код события ',kevnt);

a2[matr+2]:=tnow+dtime;writeln('время события ', tnow+dtime);

seek(f,0);

read(f,a3);

j:=1;

while a3[matr+1,j]<>0 do j:=j+1;

for i:=1 to matr+2 do a3[i,j]:=a2[i];

seek(f,0);

write(f,a3);

writeln(' Вывод календаря');

for i:=1 to nnq1 do

begin

for j:=1 to matr+2 do

write(a3[j,i],' ');write(' ');

end;

writeln;

grup;

end;

procedure rmove;

var

i,j:integer;

begin

seek(f,0);

read(f,a3);

i:=a3[matr+1,1];

writeln(' Код извлеченного события ',i);

writeln(' Время извлеченного события ',a3[matr+2,1]);

for j:=1 to matr+3 do a3[j,1]:=0;

for j:=1 to matr do attr[j]:=a3[j,1];

seek(f,0);

write(f,a3);

writeln(' Вывод календаря');

for i:=1 to nnq1 do

begin

for j:=1 to matr+2 do

write(a3[j,i],' ');write(' ');

end;

writeln;

grup;

end;

begin

clrscr;

matr:=1;

nnq1:=3;

tnow:=4;

assign(f,'kalend.dat');

rewrite(f);

for i:=1 to nnq1 do

for j:=1 to matr+2 do

a3[j,i]:=0;

seek(f,0);

write(f,a3);

a1[1]:=_;

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

schdl(_,_,a1);

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

schdl(_,_,a1);

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

schdl(_,_,a1);

writeln(' Извлечение ближайшего события');

rmove;

writeln('Имитация завершена');

end.

Подчеркивания заменяются числовыми значениями, указанными в таблице вариантов (табл. 1).

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

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

matr –количество атрибутов,

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

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

tnow –системное время.

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

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