$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";
print OUT "Среднее время ожидания: $svo\n";
$potkaz = int($otkaz/$ppp*10000)/100;
print OUT "Количество отказов: $otkaz, $potkaz%\n";
$sr_dl_och = int($sr_voo / $max_T * 100) / 100;
print OUT "Средняя длина очереди: $sr_dl_och\n\n";
$ssvo = $ssvo + $svo;
$ppp = 0;
$otkaz = 0;
$rabot = 0;
$svob = 0;
$svo = 0;
$manvoo = 0;
$maxvoo = 0;
}
$skz = int($skz / $F*1)/1;
$sotkaz = int($sotkaz / $F*100)/100;
$svpr = int($svpr / $F*100)/100;
$ssvo = int($ssvo / $F*100)/100;
$smaxvoo = int($smaxvoo / $F*100)/100;
$sr_och = int($sr_och / $F * 100) / 100;
print OUT "\n\nОТЧЕТ:\n\n";
print OUT "Среднее кол-во заявок за рабочий период: $skz\n";
$spotkaz = int($sotkaz/$skz*10000)/100;
print OUT "Среднее кол-во отказов: $sotkaz, $spotkaz%\n";
$vodsl = 100 - $spotkaz;
print OUT "Вероятность обслуживания: $vodsl%\n";
$ops = 1 - $spotkaz / 100;
print OUT "Относительная пропускная способность: $ops\n";
$aps = int($ops * $L*100) / 100;
print OUT "Абсолютная пропускная способность [ед./час]: $aps\n";
print OUT "Среднее время простоя на $N каналах обслуживания за период $T часов, час: $svpr\n";
$vprost = int($svpr / $T / $N * 10000) / 100;
print OUT "Вероятность простоя СМО: $vprost%\n";
$kz = 100 - $vprost;
print OUT "Коэффициент загузки СМО: $kz%\n";
$srkanal = int($srkanal / $F * 100) / 100;
print OUT "Среднее число занятых каналов: $srkanal из $N\n";
print OUT "Среднее время ожидания: $ssvo\n";
$svprzay = int(($ssvo + $svrobsl / $F / $skz) * 100) / 100;
print OUT "Среднее время пребывания заявки в СМО (ожидание + обслуживание): $svprzay\n";
print OUT "Среднее максимальное время ожидания: $smaxvoo\n";
print OUT "Средняя длина очереди: $sr_och\n\n";
}
else
{
print "файл данных не найден\n";
}
}
else
{
print "файл данных не задан\n";
}
close(OUT);
Приведем формулы, необходимые для вычислений:
1.
расчет времени поступления заявок в СМО, где λ – интенсивность потока заявок,
R- случайная величина, равномерно распределенная в интервале (0,1),
Тk-1 – время поступления предыдущей заявки;
2.
- вычисляет время обслуживанияканала m;3.
- определяет интервал времени между двумя последовательными заявками (между k-й и k+1);4.
- формирует момент поступления следующей заявки;5.
- расчет среднего времени ожидания;Под характеристиками СМО с ограничением на количество заявок в очереди будем понимать величины, по которым можно оценивать эффективность работы СМО и выбирать лучший из нескольких вариантов СМО.
Величины эффективности:
Ротк – вероятность отказа, показывает, какая доля всех поступающих заявок не обслуживается системой из-за занятости ее каналов или большого количества заявок в очереди (для СМО без ограничений на очередь Ротк = 0);
Ротк=kотк/k,4.1
где kотк – количество заявок, получивших отказ, k – общее количество заявок, поступивших в СМО
Робсл – вероятность обслуживания (относительная пропускная прособность), показывает, какая доля всех поступающих заявок обслуживается системой,
Робсл=1-Ротк 4.2
(для СМО без отказов Робсл = 1);
U – коэффициент загрузки СМО, показывает, какую часть от общего времени своей работы СМО выполняет обслуживание заявок; желательно, чтобы коэффициент загрузки СМО имел значение на уровне 0,75–0,85. Значения U < 0,75 указывают, что СМО простаивает значительную часть времени, т.е. используется нерационально. Значения U > 0,85 указывают на перегрузку СМО.
U = ρ(1 – Pотк), 4.3
где ρ - нагрузка на СМО:
где 4.4Величина ρ представляет собой отношение интенсивности потока заявок к интенсивности, с которой СМО может их обслуживать. Для СМО с ограничениями на очередь и без очереди возможны любые значения ρ, так как в таких СМО часть заявок получает отказ, т.е. не допускается в СМО.
q – среднее число заявок в очереди (средняя длина очереди);
S – среднее число заявок на обслуживании (в каналах), или среднее число занятых каналов;
S = mU 4.5
k – среднее число заявок в СМО, т.е. на обслуживании и в очереди;
k = q + S 4.6
w – среднее время пребывания заявки в очереди (среднее время ожидания обслуживания); формула Литтла:
4.7t – среднее время пребывания заявки в СМО, т.е. в очереди и на обслуживании;
или 4.8 - 4.9γ – пропускная способность (среднее количество заявок, обслуживаемых в единицу времени); эта величина представляет интерес с точки зрения стороны, осуществляющей эксплуатацию СМО. Обычно желательна максимизация этой величины, особенно в случаях, когда обслуживание каждой заявки обеспечивает получение определенной прибыли.
γ = μS или γ = λ(1 – Pотк). 4.10
- абсолютная пропускная способность.Величины U и S характеризуют степень загрузки СМО. Эти величины представляют интерес с точки зрения стороны, осуществляющей эксплуатацию СМО.