Курсовая работа: Моделирование системы массового обслуживания
оператор 12 – счетчик числа обслуженных заявок, после каждой обслуженной заявки показание счетчика увеличивается на единицу;
оператор 13 – счетчик числа испытаний;
оператор 14 – проверяет,
получено ли уже заданное число испытаний, если выполняется, управление передается оператору 15;
оператор 15 – подготовка следующего испытания;
оператор 16 – осуществляет статистическую обработку полученных результатов и вычисляет требуемые показатели эффективности функционирования системы за время Т.
3.2 Машинная программа модели
Программа имитационной модели построена на языке Perl.
open(OUT,">output.txt");
print OUT "СИСТЕМНОЕ МОДЕЛИРОВАНИЕ\n\n";
if (not !$ARGV[0])
{
print OUT "Имя файла данных: $ARGV[0]\n\n";
if (-e $ARGV[0])
{
open(DATA,"<$ARGV[0]");
while (<DATA>)
{
$_=~s/\n//gi;
$_=~s/\t//gi;
($_,$comments)=split("#",$_);
($q1,$q2)=split("=", $_);
if ($q1 eq 'T') {print OUT "время работы СМО, час [T]: $q2\n"; $T=$q2;}
if ($q1 eq 'L') {print OUT "интенсивность поступления заявок, ед./час [L]: $q2\n"; $L=$q2;}
if ($q1 eq 'N') {print OUT "число обслуживающих каналов, ед. [N]: $q2\n"; $N=$q2;}
if ($q1 eq 'M') {print OUT "максимальная длина очереди, ед. [M]: $q2\n"; $M=$q2;}
if ($q1 eq 'ZR') {print OUT "закон распределения времени обслуживания(exp/evenly) [ZR]: $q2\n"; $ZR=$q2;}
if ($q1 eq 'E') {print OUT "погрешность вычислений [E]: $q2\n"; $E=$q2;}
if ($q1 eq 'TO'){
print OUT "среднее время обслуживания [TO]: ";
if ($ZR eq 'evenly')
{
$q4 = 0;
while (length($q2) > 0)
{
($TO[$q4], $q2)=split(";", $q2);
$q4 = $q4 + 1;
}
$q6=1/$q4*100;
for ($q5=0;$q5<$q4;$q5++) # $q4 кол-во вариантов времени обслуживания
{
if ($q5>0) {print OUT " ; ";}
print OUT "$TO[$q5] ($q6%)";
}
}
if ($ZR eq 'exp')
{
$TO = $q2;
print OUT " $TO";
}
print OUT "\n";
}
}
close(DATA);
print OUT "\nНеобходимое кол-во экспериментов F=(T*T)/(E*E*L*L) при погрешности вычислений E=$E : ";
$F=int(($T*$T)/($L*$L*$E*$E)) + 1; # округляем до целого и прибавляем единицу
print OUT "$F \n\n\n";
print OUT "z - номер заявки\n";
print OUT "vp - время прихода заявки\n";
print OUT "vno - время начала обслуживания заявки\n";
print OUT "vko - время конца обслуживания заявки\n";
print OUT "kanal - номер обслуживающего канала\n";
print OUT "vob - время обслуживания заявки\n";
print OUT "nvo - номер в очереди, 0 - очереди нет\n";
print OUT "voo - время ожидания обслуживания (сколько стоит в очереди)\n\n\n\n";
$srkanal = 0;
$skz = 0; # среднее кол-во заявок
$sotkaz = 0; # среднее кол-во отказов в обслуживании
$svpr = 0; # среднее время простоя
$ssvo = 0; # среднее время ожидания
$smaxvoo = 0; # среднее максимальное время ожидания
$sr_och = 0; # общее время ожидания, если умножить на 1, то получится площадь очереди.
$svrobsl = 0; # общее время обслуживания за все прогоны
for ($q7=1; $q7<=$F; $q7++) # выполняем необходимое кол-во прогонов модели
{
print OUT "\n\n эксперимент $q7 \n\n";
$o0=0; # обнуление счетчика отказов
$t0=0; # обнуление времени
$n0=0; # обнуление счетсика заявок
for ($q8 = 1; $q8 <= $N; $q8++) {$N[$q8] = 0;} # обнуления состояния каналов
for ($q8 = 1; $q8 <= $M; $q8++) {$och[$q8] = 0;} # обнуление очереди
while ($t0 < $T)
{
$r=int(rand(100001))/100000;
$tt = int(-(1/$L)*log($r)*1000000)/1000000;
$t0 = $t0 + $tt;
if ($t0 <= $T)
{
$n0 = $n0 + 1;
# начало проверки состояния очереди
$m0=0; # обнуление счетчика очереди
for ($o=1; $o<=$M; $o++)
{
if ($och[$o] < $t0)
{
$och[$o] = 0;
}
else
{
$m0 = $m0 + 1;
}
}
# конец проверки состояния очереди
$vp[$n0] = $t0; # время прихода заявки
# определение времени обслуживания
if ($ZR eq 'evenly') # для РАВНОМЕРНОГО РАСПРЕДЕЛЕНИЯ ВРЕМЕНИ ОБСЛУЖИВАНИЯ
{
$r=int(rand(100001))/100000;
for ($q5=0;$q5<$q4;$q5++)
{
$dn = $q5*1/$q4;
$dk = ($q5+1)*1/$q4;
if (($r > $dn) and ($r <= $dk))
{
$vob[$n0] = $TO[$q5];
}
}
}
if ($ZR eq 'exp') # для ЭКСПОНЕНЦИАЛЬНОГО РАСПРЕДЕЛЕНИЯ ВРЕМЕНИ ОБСЛУЖИВАНИЯ
{
$r=int(rand(100001))/100000;
$vob[$n0] = int(-$TO*log(1-$r)*1000)/1000;
$ww=log(1-$r);
$www=-1/$TO;
}
# конец определения времени обслуживания
# выбор канала обслуживания
$kanal[$n0] = 0;
for ($q8 = 1; $q8 <= $N; $q8++)
{
if (($N[$q8] <= $vp[$n0]) and ($kanal[$n0] == 0))
{
$vno[$n0] = $vp[$n0];
$N[$q8]=$vno[$n0]+$vob[$n0];
$kanal[$n0] = $q8;
}
}
if ($kanal[$n0] == 0) # формирование очереди
{
$m1 = $m0 + 1;
if ($m1 <= $M) # проверка длины очереди
{
$nvo[$n0] = "$m0->$m1"; # очередь для этой заявки
# > выбор канала для заявки поставленной в очередь
$kanal[$n0] = 1; # выбор первого канала для сравнения с остальными
for ($q8 = 1; $q8 <= $N; $q8++)
{
if ($N[$q8] < $N[$kanal[$n0]])
{
$kanal[$n0] = $q8;
}
}
$vno[$n0] = $N[$kanal[$n0]];
$och[$m1] = $vno[$n0]; # время очереди
$voo[$n0] = int(($N[$kanal[$n0]] - $vp[$n0])*1000000)/1000000;
$vko[$n0] = $vno[$n0] + $vob[$n0];
$N[$kanal[$n0]] = $vko[$n0]; # сдвиг времени по данному каналу
}
else
{
$vno[$n0] = -1; # отказ в обслуживании
$vob[$n0] = 0;
$nvo[$n0] = "$m0->$m0";
$kanal[$n0] = '-';
}
}
else
{
$voo[$n0] = 0; # для данной заявки время ожидания = 0
$nvo[$n0] = 0; # для данной заявки очереди нет
$vko[$n0] = $vno[$n0] + $vob[$n0];
}
# конец выбора канала обслуживания
}
}
# ВЫВОД РЕЗУЛЬТАТОВ
$ppp = 0;
$svoo = 0;
$svob = 0;
$rabot = 0;
$otkaz = 0;
$maxvoo = $voo[1];
$minvoo = $voo[1];
$sr_voo = 0;
$skanal[$q7] = 0;
print OUT "z | vp | vno | vko | kanal | nvo | vob | voo\n";
for ($z = 1; $z<=$n0; $z++)
{
if ($vp[$z] <= $T)
{
$ppp = $ppp + 1;
$svoo = $svoo + $voo[$z]; # считает время ожидания
$svob = $svob + $vob[$z]; # считает время обслуживания, чтобы вычитать время простоя
if ($maxvoo < $voo[$z]) {$maxvoo = $voo[$z];}
if ($minvoo > $voo[$z]) {$minvoo = $voo[$z];}
if ($vno[$z] == -1) {$otkaz = $otkaz + 1;}
if (not $kanal[$z] eq '-') {$skanal[$q7] = $skanal[$q7] + $kanal[$z];}
$aa="$z"; $aaa=length($aa); for ($aaaa=1; $aaaa < 4-$aaa; $aaaa++) {$aa="$aa ";} $z=$aa;
$aa="$vp[$z]"; $aaa=length($aa); for ($aaaa=1; $aaaa < 9-$aaa; $aaaa++) {$aa="$aa ";} $vp=$aa;
$aa="$vno[$z]"; $aaa=length($aa); for ($aaaa=1; $aaaa < 11-$aaa; $aaaa++) {$aa="$aa ";} $vno=$aa;
$aa="$vko[$z]"; $aaa=length($aa); for ($aaaa=1; $aaaa < 11-$aaa; $aaaa++) {$aa="$aa ";} $vko=$aa;
$aa="$kanal[$z]"; $aaa=length($aa); for ($aaaa=1; $aaaa < 7-$aaa; $aaaa++) {$aa="$aa ";} $kanal=$aa;
$aa="$nvo[$z]"; $aaa=length($aa); for ($aaaa=1; $aaaa < 6-$aaa; $aaaa++) {$aa="$aa ";} $nvo=$aa;
$aa="$vob[$z]"; $aaa=length($aa); for ($aaaa=1; $aaaa < 7-$aaa; $aaaa++) {$aa="$aa ";} $vob=$aa;
$aa="$voo[$z]"; $aaa=length($aa); for ($aaaa=1; $aaaa < 9-$aaa; $aaaa++) {$aa="$aa "; $sr_voo = $sr_voo + $voo[$z];} $voo=$aa;
print OUT "$z| $vp| $vno| $vko| $kanal| $nvo| $vob| $voo\n";
$vp[$z] = '-';
$vno[$z] = '-';
$vko[$z] = '-';
$kanal[$z] = '-';
$nvo[$z] = '-';
$vob[$z] = '-';
$voo[$z] = '-';
}
}
$srkanal = $srkanal + $skanal[$q7] / $ppp;
print OUT "\n\nОкончание обслуживания каждым каналом:\n";
$max_T = $N[1]; # время работы СМО
for ($q8 = 1; $q8 <= $N; $q8++)
{
print OUT "канал $q8 : $N[$q8]\n";
if ($N[$q8] < $T) {$rabot = $rabot + $T;} else {$rabot = $rabot + $N[$q8];}
if ($max_T < $N[$q8]) {$max_T = $N[$q8];}
}
$vrp = $rabot - $svob;
$svrobsl = $svrobsl + $svob;
$sr_och = $sr_och + $sr_dl_och;
$skz = $skz + $ppp;
$sotkaz = $sotkaz + $otkaz;
$svpr = $svpr + $vrp;
$smaxvoo = $smaxvoo + $maxvoo;
$vrp = int($vrp * 100) / 100;
$rabot = int($rabot * 100) / 100;
print OUT "\n\n\nСуммарное время простоя на $N каналах обслуживания за общее время $rabot часов, час: $vrp\n";
$svo = int(($svoo / $ppp)*1000000)/1000000;
print OUT "Минимальное время ожидания: $minvoo\n";
print OUT "Максимальное время ожидания: $maxvoo\n";