Программа имитационного моделирования
Помогите разобраться с кодом.Программа имитационного моделирования.
Помогите разобраться с кодом.Программа имитационного моделирования.
Код:
Program masterskayaSMO;
uses crt,graph;
Const m=4; { конечная длина очереди}
n=3; {количество каналов}
T=8; {время работы СМО}
Lam=5; {интенсивность потока заявок}
tobsl_a=1; {время обслуживания}
eps=0.15; {погрешность}
alfa=0.01; {уровень значимости}
Var kol: integer; {количество заявок поступивших в систему}
kobr: integer; {количество обработанных заявок}
kotk: integer; {количество заявок, получивших отказ}
tpost: real; {момент поступления заявки}
tau: real; {промежуток между поступлдениями заявок}
pmin: integer; {номер прибора (канала) освободившегося раньше всех}
Tob: real; {время поступления заявки, которую мы взяли на обслуживание}
tauob: real; {длительности обслуживания приборами}
tosv: array [1..n] of real; {моменты освобождения приборов}
indoch: integer; {индикатор очереди (количесвто заявок в очереди)}
ocht: array [1..m] of real; {моменты поступления заявок в очереди}
potk: array [1..100] of real; {вероятность отказа в обслуживании}
otnpropsp: array [1..100] of real;
abspropsp: array [1..100] of real;
stog: array [1..100] of real; {среднее время ожидания заявки в очереди}
Srtog: real;
tog: real;{общее время ожидания в офереди заявок}
stpreb: array [1..100] of real; {ср. время пребывания заявки в очереди}
tpreb: real; {общее время пребывания заявки в системе}
ploA: real; {площадь А, где А - величина для определения средней длины очереди }
sdloch: array [1..100] of real; {средняя длина очереди}
Ni: integer; {число проведенных испытаний}
Nz: integer; {число испытаний всего (заданное)}
{вспомогательные элементы}
i: integer;
R: real;
temp: real;
{задание начальных данных для одной реализации}
Procedure BeginData;
Begin
kol:=0; {количество заявок поступивших в систему}
kobr:=0; {количество обработанных заявок}
kotk:=0; {количество заявок получивших отказ}
tpost:=0; {момент поступления заявки}
pmin:=0; {номер прибора (канала)освободившегося раньше всех}
Tob:=0; {время поступления заявки, которую мы взяли на обслуживание}
tauob:=0; {длительности обслуживания приборами}
for i:=1 to n do
begin
tosv[i]:=0; {моменты освобождения приборов}
end;
indoch:=0; {индикатор очереди (количество заявок в очереди)}
for i:=1 to m do
begin
ocht[i]:=0; {моменты поступления заявок}
end;
tog:=0; {общее время ожидания в очереди заявок}
tpreb:=0; {общее время пребывания заявок в системе}
ploA:=0; {площадь А, где А - величина для определения средней длины очереди}
End;
Procedure GenerateNewZayavka;
var R:real; {случайное число от 0 до 1}
tau: real; {промежуток между поступлениея заявки}
Begin
R:=0; while R=0 do R:=random;
tau:=(-1/Lam)*ln(R); {}
Tpost:=Tpost+tau; {}
PloA:=PloA+tau*IndOch;
End;
Procedure WriteZayavkaToOchered;
Begin
OchT[IndOch+1]:=Tpost;
IndOch:=IndOch+1;
End;
Procedure ReadFromandModifyOchered;
var I: integer; { вспомогательная переменная}
Begin
Tob:=OchT[1];
I:=1;
while (I+1<IndOch) do
begin
OchT[I]:=OchT[I+1];
I:=I+1;
end;
OchT[IndOch]:=0;
IndOch:=IndOch-1;
Kobr:=Kobr+1;
End;
Procedure Obslugivanie;
Var R:real; {случайное число от 0 до 1}
Begin
tog:=tog+TOsv[Pmin]-Tob;
R:=0; While R=0 do R:=random;
if R>0.4 then tauob:=tobsl_a
else tauob:=tobsl_b;
Tosv[Pmin]:=Tosv[Pmin]+tauob;
tpreb:=tpreb+TOsv[Pmin]-Tob+tauob;
End;
Procedure FormTosv;
Var R: real; {случайное число от 0 до 1}
Begin
R:=0; While R=0 do R:=random;
if R>0.4 then tauob:=0.4
else tauob:=0.8;
Tosv[Pmin]:=Tpost+tauob;
Kobr:=Kobr+1;
End;
Procedure BMSp1;
Begin
ReadFromandModifyOchered;
Obslugivanie;
End;
Procedure BMSp2;
Begin
FormTosv;
GenerateNewZayavka;
Kol:=Kol+1;
End;
Procedure BMSz1;
Begin
WriteZayavkaToOchered;
GenerateNewZayavka;
Kol:=Kol+1;
End;
Procedure BMSz2;
Begin
Kotk:=Kotk+1;
GenerateNewZayavka;
Kol:=Kol+1;
End;
Procedure BASp;
Begin
if indoch=0 then BMSp2
else BMSp1;
End;
Procedure BASz;
Begin
if IndOch=m then BMSz2
else BMSz1;
End;
Procedure BOOS;
var i:integer; {вспомогательная переменная}
Begin
Pmin:=1;
for i:=2 to n do
begin
if Tosv[i]<Tosv[Pmin] then Pmin:=i;
end;
if Tosv[Pmin]<Tpost then BASp else BASz;
End;
BEGIN
randomize;
Nz:=1000;
Ni:=1;
for i:=1 to Nz do
begin
potk[i]:=0;
stog[i]:=0;
stpreb[i]:=0;
sdloch[i]:=0;
otnpropsp[i]:=0;
abspropsp[i]:=0;
end;
While Ni<=Nz do
Begin
{WriteLn('Новая реализация!');}
BeginData;
R:=0; while R=0 do R:=random;
tau:=(-1/Lam)*ln(R);
Tpost:=Tpost+tau;
While Tpost<T do
begin
{ writeln('---пришла заявка---');
writeln('Bpeмя поступления =', Tpost:5:3);
writeln('Cocтoяниe приборов до обработки заявки'); }
BOOS;
{ writeln('---Результаты ее обработки---');
writeln ('Количество=',коl, 'бработанных=',kobr,' Отказано=', kotk);
writeln('HoMep "наиболее свободного" прибора=',pmin);
writeln('Bpeмя поступления заявки, которую взяли обслужить=',Tob:5:3);
writeln ('Длительность обслуживания=', tauob:5:3);
writeln ('Время освобождения приборов');
for i:=1 to n do
begin write(' ',i,'=',tosv[i]:5:3); end;
writeln;
writeln ('Количество занятых мест в буфере=', indoch);
for i:=1 to m do
begin
writeln ('Время поступления заявки, которая находится на',i,'месте в буфере=', ocht[i]:5:3);
end;
writeln();
if readkey=#27 then halt;
}
end;
kotk:=kotk+indoch;
if (kol<>0) and (kobr<>0) then
begin
writeln();
write('Realizaciya #_',Ni) ;
Writeln('_Kolichestvo=_', kol,'_Obrabotannih=_',kobr,'_Otkazano=_',kotk);
Potk[Ni]:=kotk/kol; write('_Potk=_',Potk[Ni]:5:3);
Otnpropsp[Ni]:=kobr/kol; write('_q=_', Otnpropsp[Ni]:5:3);
Abspropsp[Ni]:=kobr/T; write('_Q=_', Abspropsp[Ni]:5:3);
Stog[Ni]:=tog/kobr; write('_Stog=_', Stog[Ni]:5:3);
Stpreb[Ni]:=tpreb/kobr; write('_Stpreb=_',Stpreb[Ni]:5:3);
SdlOch[Ni]:=PloA/T; writeln('_L=_', round(SdlOch[Ni]));
writeln();
if readkey=#27 then halt;
Ni:=Ni+1;
end;
temp:=0;
for i:=1 to Nz do
begin
temp:=temp+Potk[i];
end;
end;
writeln('Potk=_',temp/Nz:5:3);
temp:=0; for i:=1 to Nz do temp:=temp+Sdloch[i];
writeln('L =_', round(temp/Nz));
temp:=0; for i:=1 to Nz do temp:=temp+Stog[i];
writeln('Stog=_',(temp/Nz):5:3);
temp:=0; for i:=1 to Nz do temp:=temp+Stpreb[i];
writeln('STpreb=_', (temp/Nz):5:3);
temp:=0; for i:=1 to Nz do temp:=temp+Otnpropsp[i];
writeln('q=_', (temp/Nz):5:3);
writeln('Q=_',Lam*(temp/Nz):5:3);
readln;
END.