Траб
|
λ
|
n
|
m
|
ЗРε
|
|
|
7
|
7
|
3
|
4
|
0,5
|
exp
|
0,1
|
Траб - время работы СМО, час;
λ - интенсивность поступления заявок,
ед./час;
n - число обслуживающих каналов, ед.;
m - максимальная длина очереди, ед.;
-
среднее время обслуживания, час;
ЗР - закон распределения времени обслуживания, exp -
экспоненциальный;
ε - погрешность вычислений.
Существует
некоторый поток заявок (клиентов), объектов, нуждающихся в обслуживании. Также
в наличии обслуживающие приборы (парикмахеры), каналы, осуществляющие
обслуживание, и задержка в обслуживании (наличие очереди).
3.
Построение
алгоритма имитационной модели. Машинная программа модели
Построение алгоритма решения и нахождения решения с его помощью относится
к компетенции специалистов-математиков и программистов.
Имеется большое количество разработанных алгоритмов для различных
моделей. Во многих случаях удается свести решение к готовому алгоритму. В
противном случае приходится строить новый.
3.1 Построение алгоритма имитационной модели
При управлении техническими системами известны условия протекания
процессов в системе и предусмотрены способы нормализации поведения системы в
зависимости от возмущений. Поэтому процесс управления может быть
алгоритмизирован и, следовательно, автоматизирован до конца.
Для создания машинной программы СМО необходимо построить алгоритм ее выполнения
Рис. 3.1.1.
Рис.3.1.1
[1]
Оператор
1 - осуществляет ввод исходной информации: число каналов, параметры законов
распределения потока заявок, время работы системы, заданное число испытаний;
оператор
2 - устанавливает начальное состояние системы Т1=0, t1= t2= t3=0 и k=0;
оператор
3 - определяет принадлежит ли k-я заявка заданному интервалу времени Т;
оператор
4 - сравнивает между собой моменты освобождения каналов системы и выбирает
канал, освободившийся раньше всех;
оператор
5 - сравнивает момент освобождения выбранного канала с моментов поступления k-й заявки;
оператор
6 - счетчик числа отказов, после каждого отказа показание счетчика увеличивается
на единицу;
оператор
7 - формируется поток заявок, определяет интервал времени между двумя
последовательными заявками;
оператор
8 - формирует момент времени поступления следующей заявки;
оператор
9 - формирует номер очередной заявки;
оператор
10 - определяет время обслуживания k-й заявки;
оператор
11 - вычисляет время освобождения канала с
номером m;
оператор
12 - счетчик числа обслуженных заявок, после каждой обслуженной заявки
показание счетчика увеличивается на единицу;
оператор
13 - счетчик числа испытаний;
оператор
14 - проверяет, получено ли уже заданное число испытаний, если выполняется, управление передается оператору 15;
оператор
15 - подготовка следующего испытания;
оператор
16 - осуществляет статистическую обработку полученных результатов и вычисляет
требуемые показатели эффективности функционирования системы за время Т.
3.2
Машинная программа модели
Программа имитационной модели построена на языке Perl.
open(OUT,">output.txt");OUT "СИСТЕМНОЕ МОДЕЛИРОВАНИЕ\n\n";(not !$ARGV[0])
{OUT "Имя файла данных:
$ARGV[0]\n\n";(-e $ARGV[0])
{(DATA,"<$ARGV[0]");(<DATA>)
{
$_=~s/\n//gi;
$_=~s/\t//gi;
($_,$comments)=split("#",$_);
($q1,$q2)=split("=", $_);($q1 eq 'T') {print OUT
"время работы
СМО, час [T]: $q2\n"; $T=$q2;}
if ($q1 eq 'L') {print OUT "интенсивность поступления заявок,
ед./час [L]: $q2\n"; $L=$q2;}($q1 eq 'N') {print OUT "число
обслуживающих каналов, ед. [N]: $q2\n"; $N=$q2;}($q1 eq 'M') {print OUT
"максимальная длина очереди, ед. [M]: $q2\n"; $M=$q2;}($q1 eq 'ZR')
{print OUT "закон распределения времени обслуживания(exp/evenly) [ZR]:
$q2\n"; $ZR=$q2;}($q1 eq 'E') {print OUT "погрешность вычислений [E]:
$q2\n"; $E=$q2;}($q1 eq 'TO'){OUT "среднее время обслуживания [TO]:
";
if ($ZR eq 'evenly')
{
$q4 = 0;(length($q2) > 0)
{
($TO[$q4], $q2)=split(";", $q2);
$q4 = $q4 + 1;
}
$q6=1/$q4*100;($q5=0;$q5<$q4;$q5++) # $q4 кол-во вариантов времени
обслуживания
{($q5>0) {print OUT " ; ";}OUT "$TO[$q5]
($q6%)";
}
} ($ZR eq 'exp')
{
$TO = $q2;OUT " $TO";
}OUT "\n";
}
}(DATA);
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";
OUT "z - номер заявки\n";
print OUT "vp - время прихода заявки\n";OUT "vno - время
начала обслуживания заявки\n";OUT "vko - время конца обслуживания
заявки\n";OUT "kanal - номер обслуживающего канала\n";OUT
"vob - время обслуживания заявки\n";OUT "nvo - номер в очереди,
0 - очереди нет\n";OUT "voo - время ожидания обслуживания (сколько
стоит в очереди)\n\n\n\n";
$srkanal = 0;
$skz = 0; # среднее кол-во заявок
$sotkaz = 0; # среднее кол-во отказов в обслуживании
$svpr = 0; # среднее время простоя
$ssvo = 0; # среднее время ожидания
$smaxvoo = 0; # среднее максимальное время ожидания
$sr_och = 0; # общее время ожидания, если умножить на 1, то получится
площадь очереди.
$svrobsl = 0; # общее время обслуживания за все прогоны
($q7=1; $q7<=$F; $q7++) # выполняем необходимое кол-во прогонов модели
{
OUT "\n\n эксперимент $q7 \n\n";
$o0=0; # обнуление счетчика отказов
$t0=0; # обнуление времени
$n0=0; # обнуление счетсика заявок($q8 = 1; $q8 <= $N; $q8++) {$N[$q8]
= 0;} # обнуления состояния каналов($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;
($t0 <= $T)
{
$n0 = $n0 + 1;
# начало проверки состояния очереди
$m0=0; # обнуление счетчика очереди
for ($o=1; $o<=$M; $o++)
{($och[$o] < $t0)
{
$och[$o] = 0;
}
{
$m0 = $m0 + 1;
}
}
# конец проверки состояния очереди
$vp[$n0] = $t0; # время прихода заявки
# определение времени обслуживания($ZR eq 'evenly') # для РАВНОМЕРНОГО
РАСПРЕДЕЛЕНИЯ ВРЕМЕНИ ОБСЛУЖИВАНИЯ
{
$r=int(rand(100001))/100000;($q5=0;$q5<$q4;$q5++)
{
$dn = $q5*1/$q4;
$dk = ($q5+1)*1/$q4;(($r > $dn) and ($r <= $dk))
{
$vob[$n0] = $TO[$q5];
}
}
}($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;($q8 = 1; $q8 <= $N; $q8++)
{(($N[$q8] <= $vp[$n0]) and ($kanal[$n0] == 0))
{
$vno[$n0] = $vp[$n0];
$N[$q8]=$vno[$n0]+$vob[$n0];
$kanal[$n0] = $q8;
}
}($kanal[$n0] == 0) # формирование очереди
{
$m1 = $m0 + 1;($m1 <= $M) # проверка длины очереди
{
$nvo[$n0] = "$m0->$m1"; # очередь для этой заявки
# > выбор канала для заявки поставленной в очередь
$kanal[$n0] = 1; # выбор первого канала для сравнения с остальными
for ($q8 = 1; $q8 <= $N; $q8++)
{($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]; # сдвиг времени по данному каналу
}
{
$vno[$n0] = -1; # отказ в обслуживании
$vob[$n0] = 0;
$nvo[$n0] = "$m0->$m0";
$kanal[$n0] = '-';
}
}
{
$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;
OUT "z | vp | vno | vko | kanal | nvo | vob |
voo\n";($z = 1; $z<=$n0; $z++)
{($vp[$z] <= $T)
{
$ppp = $ppp + 1;
$svoo = $svoo + $voo[$z]; # считает время ожидания
$svob = $svob + $vob[$z]; # считает время обслуживания, чтобы вычитать
время простоя
if ($maxvoo < $voo[$z]) {$maxvoo = $voo[$z];}($minvoo >
$voo[$z]) {$minvoo = $voo[$z];}($vno[$z] == -1) {$otkaz = $otkaz + 1;}(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;
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++)
{OUT "канал
$q8 : $N[$q8]\n";($N[$q8] < $T) {$rabot = $rabot + $T;} else {$rabot =
$rabot + $N[$q8];}($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;OUT "Минимальное время
ожидания: $minvoo\n";OUT "Максимальное время ожидания:
$maxvoo\n";OUT "Среднее время ожидания: $svo\n";
$potkaz = int($otkaz/$ppp*10000)/100;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;OUT "\n\nОТЧЕТ:\n\n";
print OUT "Среднее кол-во заявок за рабочий период: $skz\n";
$spotkaz = int($sotkaz/$skz*10000)/100;OUT "Среднее кол-во отказов:
$sotkaz, $spotkaz%\n";
$vodsl = 100 - $spotkaz;OUT "Вероятность обслуживания:
$vodsl%\n";
$ops = 1 - $spotkaz / 100;OUT "Относительная пропускная способность:
$ops\n";
$aps = int($ops * $L*100) / 100; OUT "Абсолютная пропускная
способность [ед./час]: $aps\n";OUT "Среднее время простоя на $N
каналах обслуживания за период $T часов, час: $svpr\n";
$vprost = int($svpr / $T / $N * 10000) / 100;
print OUT "Вероятность простоя СМО: $vprost%\n";
$kz = 100 - $vprost;OUT "Коэффициент загузки СМО: $kz%\n";
$srkanal = int($srkanal / $F * 100) / 100;OUT "Среднее число занятых
каналов: $srkanal из $N\n";OUT "Среднее время ожидания:
$ssvo\n";
$svprzay = int(($ssvo + $svrobsl / $F / $skz) * 100) / 100;
print OUT "Среднее время пребывания заявки в СМО (ожидание +
обслуживание): $svprzay\n";OUT "Среднее максимальное время ожидания:
$smaxvoo\n";OUT "Средняя длина очереди: $sr_och\n\n";
}
{"файл данных не найден\n";
}
}
{"файл данных не задан\n";
}(OUT);
4.
Описание
функционирования математической модели
Приведем формулы, необходимые для вычислений:
1.
расчет времени поступления заявок в СМО, где λ - интенсивность потока заявок,
R -
случайная величина, равномерно распределенная в интервале (0,1),
Тk-1 - время поступления предыдущей заявки;
2. - вычисляет время обслуживания канала m;
3. - определяет интервал времени между двумя
последовательными заявками (между k-й и k+1);
. - формирует момент поступления следующей заявки;
. - расчет среднего времени ожидания;
Под характеристиками СМО с ограничением на количество заявок в очереди
будем понимать величины, по которым можно оценивать эффективность работы СМО и
выбирать лучший из нескольких вариантов СМО.
Величины эффективности:
Ротк - вероятность отказа, показывает, какая доля всех поступающих
заявок не обслуживается системой из-за занятости ее каналов или большого
количества заявок в очереди (для СМО без ограничений на очередь Ротк
= 0);
Ротк=kотк/k, 4.1
где kотк - количество заявок, получивших отказ, k - общее количество заявок, поступивших в СМО
Робсл - вероятность обслуживания (относительная пропускная
прособность), показывает, какая доля всех поступающих заявок обслуживается
системой,
Робсл=1-Ротк 4.2
(для СМО без отказов Робсл = 1);
U - коэффициент
загрузки СМО, показывает, какую часть от общего времени своей работы СМО
выполняет обслуживание заявок; желательно, чтобы коэффициент загрузки СМО имел
значение на уровне 0,75-0,85. Значения U < 0,75 указывают, что СМО
простаивает значительную часть времени, т.е. используется нерационально.
Значения U > 0,85 указывают на перегрузку СМО.
= ρ(1 - Pотк), 4.3
где ρ - нагрузка на СМО:
где 4.4
Величина ρ представляет собой отношение интенсивности потока
заявок к интенсивности, с которой СМО может их обслуживать. Для СМО с
ограничениями на очередь и без очереди возможны любые значения ρ,
так как в таких СМО
часть заявок получает отказ, т.е. не допускается в СМО.
q -
среднее число заявок в очереди (средняя длина очереди);
S -
среднее число заявок на обслуживании (в каналах), или среднее число занятых
каналов;
S = mU 4.5
k -
среднее число заявок в СМО, т.е. на обслуживании и в очереди;
= q + S 4.6
w -
среднее время пребывания заявки в очереди (среднее время ожидания
обслуживания); формула Литтла:
4.7
t -
среднее время пребывания заявки в СМО, т.е. в очереди и на обслуживании;
или 4.8 - 4.9
γ - пропускная способность (среднее
количество заявок, обслуживаемых в единицу времени); эта величина представляет
интерес с точки зрения стороны, осуществляющей эксплуатацию СМО. Обычно
желательна максимизация этой величины, особенно в случаях, когда обслуживание
каждой заявки обеспечивает получение определенной прибыли.
γ = μS или γ
= λ(1 - Pотк). 4.10
-
абсолютная пропускная способность.
Величины U и S характеризуют степень загрузки СМО. Эти
величины представляют интерес с точки зрения стороны, осуществляющей
эксплуатацию СМО.
Например, если в качестве СМО рассматривается предприятие, выполняющее
некоторые заказы, то эти величины представляют интерес для владельцев
предприятия.
Величины Pотк, Pобсл, w и t
характеризуют качество обслуживания заявок.
Они представляют интерес с точки зрения пользователей СМО. Желательна
минимизация значений Pотк, w , t и максимизация Pобсл.
Величины q и k обычно используются в качестве
вспомогательных для расчета других характеристик СМО.
Формулы
(4.1)-(4.10) могут применяться для расчета характеристик любых разомкнутых
СМО, независимо от количества каналов, потока заявок, закона распределения
времени обслуживания и т.д. [4]
Обозначения:
время работы СМО, час [T]: 7
интенсивность поступления заявок, ед./час [L]: 7
число обслуживающих каналов, ед. [N]: 3
максимальная длина очереди, ед. [M]: 4
закон распределения времени обслуживания (exp/evenly) [ZR]: exp
среднее время обслуживания [TO]: 0,5
погрешность вычислений [E]: 0,1
количество прогонов модели
[5].
В
связи с большим объемом данных по реализации 100 прогонов, приведу результаты
одного в Таблице 4.1
Таблица 4.1