Доброго времени суток.
есть код программы на GPSS, PLUS-процедуры. с помощью experiment go(Part1,Part2) можно выяснить суммарные затраты при ебъеме накопителя и времени авральной обработки соответственно. процедура GetResul() - выполняются 3 прогона модели, а в переменную Sum записывается среднее арифметическое суммарных затрат прогонов. процедура DoTheRun - происходит сброс генераторов случайных чисел, очистка сохраняемых величин и сброс статистики. Возвращаемое значение – суммарные затраты.
Ncapacity EQU 5 ;ёмкость накопителя
Tavr EQU 34 ;время обработки в авральном режиме
SUMM VARIABLE -(10#X$ALLENTERS#(Ncapacity-5)+(35-Tavr)#5#X$AVRCOUNT+100#X$LOOSE+2#X$AVRTIME#3)
GENERATE 11,5 ;буферизация
QUEUE BUFF
SEIZE MULTICHANNEL
DEPART BUFF
ADVANCE 9,3
RELEASE MULTICHANNEL
SELECT MIN EVM,1,3,,Q ;выбор минимальной очереди
TEST L Q*EVM,Ncapacity,GOOUT ;сравнение с ёмкостью накопителя
SAVEVALUE ALLENTERS+,1 ;учёт всех обработанных сообщений
QUEUE P$EVM ;стандартная обработка
QUEUE MAINSTREAM
TEST L Q$MAINSTREAM,9,AVRALMODE ;сравнение содержимого очереди и 3N
SEIZE P$EVM
DEPART MAINSTREAM
DEPART P$EVM
ADVANCE 35 ;стандартная задержка
RELEASE P$EVM
TERMINATE
AVRALMODE SAVEVALUE AVRCOUNT+,1 ;обработка в авральном режиме
SEIZE P$EVM
DEPART MAINSTREAM
DEPART P$EVM
MARK AVRINT
ADVANCE Tavr ;уменьшенная задержка
RELEASE P$EVM
SAVEVALUE AVRTIME+,MP$AVRINT ;учёт времени работы в авральном режиме
TERMINATE
GOOUT SAVEVALUE LOOSE+,1 ;учёт потерянных сообщений
TERMINATE
start 1000
experiment go(Par1,Par2)
begin
temporary CurYield, ShowString, CommandString;
Ncapacity=Par1;
Tavr=Par2;
CurYield=GetResult();
ShowString= PolyCatenate("Summ ", String(CurYield), ". " );
ShowString=PolyCatenate(ShowString," Capacity ",String(Ncapacity),"." );
ShowString=PolyCatenate(ShowString," k time ",String(Tavr),"." );
DoCommand(PolyCatenate("SHOW """,ShowString,"""","" ) );
END;
procedure GetResult()
begin
temporary Sum, CurYield,Ind_i;
Ind_i=1;
Sum=0;
while (Ind_i<2)do
begin
CurYield=DoTheRun(Ind_i);
Sum=Sum+ CurYield;
Ind_i=Ind_i+1;
end;
Return (Sum/(Ind_i-1));
end;
procedure DoTheRun(Run_Number)
begin
DoCommand("Clear off" );
temporary CommandString;
CommandString=Catenate("RMULT ",Run_Number#3);
DoCommand(CommandString);
DoCommand("Start 1" );
Return (-(10#X$ALLENTERS#(Ncapacity-5)+(35-Tavr)#5#X$AVRCOUNT+100#X$LOOSE+2#X$AVRTIME#3));
end;
experiment SeekOpt()
begin
temporary ShowString, CommandString;
temporary Prev1, Cur1, Flag1, Tprev;
Ncapacity=4;
Prev1=100000;
Flag1=1;
while (Flag1 'NE' 0) do
begin
Ncapacity=Ncapacity+1;
Tavr=36;
while (Tavr 'GE' 2) do
begin
Tprev=Tavr;
Tavr=Tavr-1;
Cur1=GetResult();
if(Cur1<Prev1) then
begin
if (Prev1<0) then
begin
ShowString=PolyCatenate(" Optimum.Summ ", String(Prev1),"." );
ShowString=PolyCatenate(ShowString," Capacity ",String(Ncapacity),"." );
ShowString=PolyCatenate(ShowString," k time ",String(Tprev),"." );
CommandString =PolyCatenate("SHOW """,ShowString,"""","" );
DoCommand(CommandString);
Flag1=0;
Tavr=0;
end;
else Prev1=Cur1;
end;
else Prev1=Cur1;
end;
end;
end;
experiment SeekOptInv()
begin
temporary ShowString, CommandString;
temporary Prev1, Cur1, Flag1, Tprev, Nprev;
Ncapacity=4;
Prev1=100000;
Flag1=1;
while (Flag1 'NE' 0) do
begin
Ncapacity=Ncapacity+1;
Tavr=0;
while (Tavr 'LE' 34) do
begin
Nprev=Ncapacity;
if (Tavr=0) then
begin
Tprev=35;
Nprev=Ncapacity-1;
end;
else Tprev=Tavr;
Tavr=Tavr+1;
Cur1=GetResult();
if(Cur1<Prev1) then
begin
if (Prev1<0) then
begin
ShowString=PolyCatenate(" Optimum.Summ ", String(Prev1),"." );
ShowString=PolyCatenate(ShowString," Capacity ",String(Nprev),"." );
ShowString=PolyCatenate(ShowString," k time ",String(Tprev),"." );
CommandString =PolyCatenate("SHOW """,ShowString,"""","" );
DoCommand(CommandString);
Flag1=0;
Tavr=35;
end;
else Prev1=Cur1;
end;
else Prev1=Cur1;
end;
end;
end;
подскажите, пожалуйста, как сделать N (например 15) количество прогонов с интервалом времени каждые 500, чтобы сделать график Динамика суммарных затрат |