Смекни!
smekni.com

Моделирование системы массового обслуживания (стр. 2 из 3)

$sr_och = 0; # общее время ожидания, если умножить на 1, то получится площадь очереди.

$svrobsl = 0; # общее время обслуживания за все прогоны

for ($q7=1; $q7<=$F; $q7++) # выполняем необходимое кол-во прогонов модели

{

print OUT "&bsol;n&bsol;n эксперимент $q7 &bsol;n&bsol;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&bsol;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&bsol;n";

$vp[$z] = '-';

$vno[$z] = '-';

$vko[$z] = '-';

$kanal[$z] = '-';

$nvo[$z] = '-';

$vob[$z] = '-';

$voo[$z] = '-';

}

}

$srkanal = $srkanal + $skanal[$q7] / $ppp;

print OUT "&bsol;n&bsol;nОкончание обслуживания каждым каналом:&bsol;n";

$max_T = $N[1]; # время работы СМО

for ($q8 = 1; $q8 <= $N; $q8++)

{

print OUT "канал $q8 : $N[$q8]&bsol;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 "&bsol;n&bsol;n&bsol;nСуммарное время простоя на $N каналах обслуживания за общее время $rabot часов, час: $vrp&bsol;n";

$svo = int(($svoo / $ppp)*1000000)/1000000;

print OUT "Минимальное время ожидания: $minvoo&bsol;n";

print OUT "Максимальное время ожидания: $maxvoo&bsol;n";

print OUT "Среднее время ожидания: $svo&bsol;n";

$potkaz = int($otkaz/$ppp*10000)/100;

print OUT "Количество отказов: $otkaz, $potkaz%&bsol;n";

$sr_dl_och = int($sr_voo / $max_T * 100) / 100;

print OUT "Средняя длина очереди: $sr_dl_och&bsol;n&bsol;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 "&bsol;n&bsol;nОТЧЕТ:&bsol;n&bsol;n";

print OUT "Среднее кол-во заявок за рабочий период: $skz&bsol;n";

$spotkaz = int($sotkaz/$skz*10000)/100;

print OUT "Среднее кол-во отказов: $sotkaz, $spotkaz%&bsol;n";

$vodsl = 100 - $spotkaz;

print OUT "Вероятность обслуживания: $vodsl%&bsol;n";

$ops = 1 - $spotkaz / 100;

print OUT "Относительная пропускная способность: $ops&bsol;n";

$aps = int($ops * $L*100) / 100;

print OUT "Абсолютная пропускная способность [ед./час]: $aps&bsol;n";

print OUT "Среднее время простоя на $N каналах обслуживания за период $T часов, час: $svpr&bsol;n";

$vprost = int($svpr / $T / $N * 10000) / 100;

print OUT "Вероятность простоя СМО: $vprost%&bsol;n";

$kz = 100 - $vprost;

print OUT "Коэффициент загузки СМО: $kz%&bsol;n";

$srkanal = int($srkanal / $F * 100) / 100;

print OUT "Среднее число занятых каналов: $srkanal из $N&bsol;n";

print OUT "Среднее время ожидания: $ssvo&bsol;n";

$svprzay = int(($ssvo + $svrobsl / $F / $skz) * 100) / 100;

print OUT "Среднее время пребывания заявки в СМО (ожидание + обслуживание): $svprzay&bsol;n";

print OUT "Среднее максимальное время ожидания: $smaxvoo&bsol;n";

print OUT "Средняя длина очереди: $sr_och&bsol;n&bsol;n";

}

else

{

print "файл данных не найден&bsol;n";

}

}

else

{

print "файл данных не задан&bsol;n";

}

close(OUT);

4. Описание функционирования математической модели

Приведем формулы, необходимые для вычислений:

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.7

t – среднее время пребывания заявки в СМО, т.е. в очереди и на обслуживании;

или
4.8 - 4.9

γ – пропускная способность (среднее количество заявок, обслуживаемых в единицу времени); эта величина представляет интерес с точки зрения стороны, осуществляющей эксплуатацию СМО. Обычно желательна максимизация этой величины, особенно в случаях, когда обслуживание каждой заявки обеспечивает получение определенной прибыли.

γ = μS или γ = λ(1 – Pотк). 4.10

- абсолютная пропускная способность.

Величины U и S характеризуют степень загрузки СМО. Эти величины представляют интерес с точки зрения стороны, осуществляющей эксплуатацию СМО.