Машинная программа модели
Программа имитационной модели построена на языке 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"; 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);
Популярное: Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (149)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |