Мегаобучалка Главная | О нас | Обратная связь


Машинная программа модели



2019-12-29 149 Обсуждений (0)
Машинная программа модели 0.00 из 5.00 0 оценок




 

Программа имитационной модели построена на языке 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);




2019-12-29 149 Обсуждений (0)
Машинная программа модели 0.00 из 5.00 0 оценок









Обсуждение в статье: Машинная программа модели

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (149)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)