close

Вход

Забыли?

вход по аккаунту

?

Моделир - Лаба№4

код для вставкиСкачать
Министерство высшего и профессионального образования Российской Федерации
Ульяновский Государственный Технический Университет
кафедра "Вычислительная техника"
дисциплина "Моделирование"
Лабораторная работа №4
Выполнил: студент группы ЭВМд-32
Кургузов И.С.
Проверил: Куцоконь Н.С.
Ульяновск 2002.
Моделирование системы обслуживания с одним прибором
Задание: На абонентские пункты А1:Аn поступают заявки N типов ( номер типа заявки соответствует её приоритету ). В соответствии со своим типом(приоритету 1>2>:N) заявки от абонентов передаются ПО , если он занят , то они образуют очередь . ПО как обслуживающее устройство в системе имеет следующие характеристики (для каждого типа заявок) :
* vi - среднее время обслуживания заявки i-го типа * (vi)" - второй начальный момент времени обслуживания * Di - дисперсия времени обслуживания * oi - среднеквадратичное отклонение времени обслуживания * mi = i / vi - интенсивность обслуживания * lmi - среднее число заявок , поступающих на обслуживание * poi = lmi / mi - коэффициент загрузки оборудования заявками i-го типа * ni = i - poi - коэффициент простоя * ( суммарные характеристики ) * R = сумма_по_числу_заявок (poi) - коэффициент загрузки * Lm = сумма_по_числу_заявок ( lmi ) - интенсивность поступления заявок * Поток заявок характеризуется следующими величинами : * ti - средний промежуток времени между поступлением заявок i-го типа * lmi = i / ti - интенсивность поступления заявок i-го типа * pi = lm / Lm - вероятность поступления заявки i-го типа * wi - среднее время пребывания заявки i-го типа в очереди * ui - среднее время пребывания заявки в системе * li - средняя длина очереди заявок i-го типа li=lmi*wi * W = сумма_по_числу_заявок ( pi * wi ) - среднее время пребывания заявки в очереди * U = сумма_по_числу_заявок (pi*ui) - среднее время пребывания заявки в системе * L = сумма_по_числу_заявок (lmi*ui) - среднее число заявок в системе Для потока заявок , полученного в лабораторной работе 3 , выполнить моделирование работы одноприборной системы обслуживания . Вычислить характеристики входного потока заявок (ti, lmi, Lm, pi, wi, ui), очереди заявок (li, W, U, L) работающего устройства (vi, mi, pi, ni, R) . Построить графики зависимости характеристик poi, R, wi, ui, li, W, U, L от vi.
В лабораторной работе была разработана модель канала, представленная на рисунке:
Схема работы канала Принципы работы канала:
Заявки четырех типов поступают в систему в случайно сгенерированное время и попадают в очередь. Если канал пустой, то заявка помещается сразу в канал, иначе - остается в очереди. Если при помещении заявки в очередь там уже есть другие заявки, то она добавляется НЕ в конец очереди, а в соответствии с ее приоритетом (т. е. после всех заявок с таким же приоритетом или выше). Но возможен и вариант "БЕЗ ОЧЕРЕДИ" - когда заявка попадает в систему в тот момент, когда канал обработал находившееся в нем сообщение, но еще не взял нового из очереди. В этот момент может вклиниться сообщение с низким приоритетом. В таблице ниже приведены результаты работы системы со ста сообщениями разных приоритетом.
Результат работы канала:
DirectionTimeTypeUserLengthStartTimeTimeInQueueTimeInChannelChannel011600078*Queue*2641842606*Queue*53117053069*Queue*71136571062Channel781170532569*Queue*99116699075*Queue*1371165137072Channel1481365717762*Queue*1861177186071*Queue*1981176198068Channel21111669911275*Queue*2271469227070*Queue*2761165276075Channel287116513715072*Queue*2881465288070*Queue*3211174321073*Queue*3591363359075Channel360117718617471*Queue*3614175361058*Queue*3811167381063*Queue*4011476401071*Queue*4231167423071*Queue*4231171423063Channel432117619823468*Queue*4541472454073*Queue*4931171493072Channel501146922727470*Queue*5241173524068Channel572116527629675*Queue*5731174573079*Queue*6101171610067*Queue*6444373644024Channel648146528836070*Queue*6661170666076*Queue*6791170679069*Queue*6854164685081Channel719117432139873*Queue*7231177723068*Queue*7511165751057*Queue*7911374791075Channel793136335943475*Queue*8031369803063*Queue*8121166812079*Queue*8121163812072*Queue*8331162833064*Queue*8551169855073*Queue*8674185867017Channel869116738148863*Queue*8771177877071*Queue*8964160896091*Queue*9091168909074*Queue*9201169920063*Queue*9211169921071Channel933147640153271*Queue*9651374965067Channel1005116742358271*Queue*101414711014075*Queue*105411611054066Channel1077117142365463*Queue*107911741079071*Queue*108411761084063*Queue*112313621123067*Queue*113913741139063Channel1141147245468773*Queue*118011651180070*Queue*120311681203062Channel1215117149372272*Queue*124542481245028*Queue*126614681266067Channel1288117352476468*Queue*129611661296071*Queue*132511711325076Channel1357117457378479*Queue*137411721374068*Queue*138014671380067*Queue*142111641421063Channel1437117161082767*Queue*144341741443054*Queue*146514741465061*Queue*146513671465070*Queue*148111731481066Channel1505117066683976*Queue*151811801518068*Queue*156713721567070Channel1582117067990369*Queue*159311681593071*Queue*162941731629024Channel1652117772392968*Queue*165311671653074*Queue*169741921697088*Queue*170211641702068*Queue*170611641706066Channel1721116575197057*Queue*175111681751061*Queue*177911701779061Channel1779137479198875*Queue*178011691780074*Queue*180211701802071*Queue*18464153184606Channel18551369803105263*Queue*188411771884072Channel19191166812110779*Queue*192413731924071*Queue*195711681957077Channel19991163812118772*Queue*200441622004052*Queue*202213742022071*Queue*202513712025065*Queue*205314722053075Channel20721162833123964*Queue*209413762094065*Queue*213145772131069Channel21371169855128273*Queue*215913722159073*Queue*218844912188015Channel22111177877133471*Queue*222611722226072*Queue*226111742261069Channel22831168909137474*Queue*228541852285048*Queue*230813672308066*Queue*234811742348068Channel23581169920143863*Queue*238514692385071*Queue*240441532404091Channel24221169921150171*Queue*244711702447066*Queue*248111682481065*Queue*248211742482074Channel24941374965152967*Queue*249511742495068*Queue*250111762501070*Queue*251011692510076*Queue*254011712540067Channel256214711014154875*Queue*258711712587070Channel263811611054158466Channel270511741079162671Channel277711761084169363Channel284113621123171867Channel290913741139177063Channel297311651180179370Channel304411681203184162Channel310714681266184167Channel317511661296187971Channel324711711325192276Channel332411721374195068Channel339314671380201367Channel346111641421204063Channel352514741465206061Channel358713671465212270Channel365811731481217766Channel372511801518220768Channel379413721567222770Channel386511681593227271Channel393711671653228474Channel401211641702231068Channel408111641706237566Channel414811681751239761Channel421011701779243161Channel427211691780249274Channel434711701802254571Channel441911771884253572Channel449213731924256871Channel456411681957260777Channel464213742022262071Channel471413712025268965Channel478014722053272775Channel485613762094276265Channel492213722159276373Channel499611722226277072Channel506911742261280869Channel513913672308283166Channel520611742348285868Channel527514692385289071Channel534711702447290066Channel541411682481293365Channel548011742482299874Channel555511742495306068Channel562411762501312370Channel569511692510318576Channel577211712540323267Channel584011712587325370Channel591141842658856Channel59184175361555758Channel59774373644533324Channel60024164685531781Channel60844185867521717Channel61024160896520691Channel619442481245494928Channel622341741443478054Channel627841731629464924Channel630341921697460688Channel63924153184645466Channel639941622004439552Channel645245772131432169Channel652244912188433415Channel653841852285425348Channel658741532404418391
При этом в результате расчета я получил следующие характеристики работы канала и очереди сообщений:
TypeMidTime(vi)MsgCnt(lmi)IdleTime(ti)Int(lmi)QueueTime(wi)SysTime(ui)11753.6184690.01412319344892.69164110.002749796
Type(Di)(oi)Intensity(mi)BusyCf(poi)IdleCf(ni)1913993.25956.030.0005700.26620.73384233141.69482.850.0002040.74280.2572
BusyCoef-t(R)1,009Intensity(Lm)100QueueLen(li)32Исходные тексты программы-модели:
/***********************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <math.h>
const N = 100;
const double p = 0.71;
FILE *file;
double fact(int a);
double C(int m, int n);
double P(int x);
double F(int x);
double binom_rnd();
class MSG
{
public:
int type;
int user;
int length;
int time;
int start_time;
int queue_time;
MSG();
void print();
void fprint(FILE *file);
private:
int rnd_type();
int rnd_user(int);
int rnd_length(int);
int rnd_time(int);
};
class CQueue
{
MSG *queue[100];
MSG *channel;
int msg_time;
public:
int nParsed;
int nCount;
CQueue();
int push(MSG *msg, int cur_time);
int CheckChannel(int time);
int pop(MSG *msg, int cur_time);
};
void main()
{
randomize();
file = fopen("#data.txt","wt");
printf("Laboratory work by modelling N 4...\n");
printf("\tDesigned by @lien.\n");
int i,x,l,u;
int last_time[4] = {0,0,0,0};
int IdleTime[4] = {0,0,0,0};
float TotalTime[4] = {0,0,0,0};
int TypeCnt[4] = {0,0,0,0};
int QueueTime[4] = {0,0,0,0};
float M[4] = {0,0,0,0};
int SystemTime[4] = {0,0,0,0};
float D[4] = {0,0,0,0};
float BusyCf[4] = {0,0,0,0};
float Intens[4] = {0,0,0,0};
//int MaxLength[4] = {0,0,0,0};
//int User[4][5];
//memset(User,0,sizeof(int[4][5]));
long QueueLen = 0;
int QueueCnt = 0;
int total_time = 0;
// main table:
printf("Initializing...");
MSG msg[100];
printf("done.\n");
CQueue Queue;
int start_time_tmp = 0;
total_time = 0;
for (i = 0; i < 100; i++)
{
msg[i].start_time = start_time_tmp;
start_time_tmp += random(50);
total_time += msg[i].time;
//msg[i].fprint(file);
}
/////////////////////////////////////////////////////////////////
fprintf(file,"Direction\tTime\tType\tUser\tLength\t
StartTime\tTimeInQueue\tTimeInChannel\n");
int lastI = 0;
for (int t = 0; Queue.nParsed < 100; t++)
{
for (i = lastI; i < 100; i++)
if (t == msg[i].start_time)
{
lastI = i;
Queue.push(&(msg[lastI]),t);
//printf("<%4d>:",t);
//msg[lastI].print();
//fprintf(file,"<%4d>:",t);
//msg[lastI].fprint(file);
lastI++;
QueueLen += Queue.nCount;
QueueCnt++;
}
Queue.CheckChannel(t);
printf("parsed = %d\n",Queue.nParsed);
total_time = t;
}
/////////////////////////////////////////////////////////////////
//time of i-type in queue+channel:
for (i = 0; i < 100; i++)
{
TypeCnt[msg[i].type-1]++;
TotalTime[msg[i].type-1] += (float)(msg[i].queue_time+msg[i].time);
IdleTime[msg[i].type-1] += msg[i].start_time+msg[i].queue_time - last_time[msg[i].type-1];
last_time[msg[i].type-1] = msg[i].start_time+msg[i].queue_time;
QueueTime[msg[i].type-1] += msg[i].queue_time;
SystemTime[msg[i].type-1] += msg[i].queue_time + msg[i].time;
}
fprintf(file,"Type\tMidTime(vi)\tMsgCnt(lmi)\t
IdleTime(ti)\tInt(lmi)\tQueueTime(wi)\tSysTime(ui)\n");
for (i = 0; i < 4; i++)
{
if (TypeCnt[i] > 0)
fprintf(file,"%d\t%2.2f\t%d\t%d\t%2.3f\t%d\t%d\n",i+1, M[i] = TotalTime[i]/TypeCnt[i], TypeCnt[i],IdleTime[i]/TypeCnt[i], (float)TypeCnt[i]/(float)IdleTime[i], QueueTime[i]/TypeCnt[i],SystemTime[i]/TypeCnt[i]);
}
for (i = 0; i < 100; i++)
{
D[msg[i].type-1] += (msg[i].time+msg[i].queue_time-M[msg[i].type-1])*(msg[i].time+msg[i].queue_time-M[msg[i].type-1])/((msg[i].type == 1)?83:17);
}
fprintf(file,"Type\t(Di)\t(oi)\tIntensity(mi)\tBusyCf(poi)\tIdleCf(ni)\n");
float R = 0.0;
int Lm = 0;
for (i = 0; i < 4; i++)
{
if (TypeCnt[i] > 0)
{
fprintf(file,"%d\t%2.2f\t%2.2f\t%2.6f\t%2.4f\t%2.4f\n",i+1, D[i], sqrt(D[i]), 1.0/M[i],BusyCf[i] = (float)M[i]/(float)total_time, 1.0-(float)M[i]/(float)total_time);
R += BusyCf[i];
Lm += TypeCnt[i];
}
}
fprintf(file,"BusyCoef-t(R)\t%2.4f\nIntensity(Lm)\t%d\n",R,Lm);
fprintf(file,"QueueLen(li)\t%d\n",QueueLen/QueueCnt);
/**
fprintf(file,"Type\tD\td\tIntensity\tBusyCf\tIdleCf\n");
for (i = 0; i < 4; i++)
{
if (TypeCnt[i] > 0)
fprintf(file,"%d\t%2.2f\t%2.2f\t%2.6f\t%2.4f\t%2.4f\n",i+1, D[i], sqrt(D[i]), 1.0/M[i],(float)M[i]/(float)total_time, 1.0-(float)M[i]/(float)total_time);
}
/**/
fclose(file);
getch();
}
//////////////////////////////////////////////////////
double fact(int a)
{
double f = 1;
for (int i = 1; i <= a; i++) f *= i;
return f;
}
double C(int m, int n)
{
return fact(n)/(fact(m)*fact(n-m));
}
double P(int x)
{
return C(x,N)*exp(x*log(p))*exp((N-x)*log(1-p));
}
double F(int x)
{
double sum = 0.0;
for (int i = 1; i < x; i++) sum += P(i);
return sum;
}
double binom_rnd()
{
double rj = (double)random(10001)/10000.0;
int x,xprev = 1;
for (x = 2; x < N; xprev = x, x++)
if ((F(xprev) < rj) && (rj <= F(x))) break;
return xprev + (rj-F(x))/(F(x)-F(xprev))*(x-xprev);
}
/////////////////MSG/////////////////////////////////////
MSG::MSG()
{
type = rnd_type();
user = rnd_user(type);
length = rnd_length(type);
time = rnd_time(type);
start_time = 0;
queue_time = 0;
}
void MSG::print()
{
printf("type=%1d;user=%1d;len=%2d;s_time=%4d;
q_time=%3d;time=%2d\n",type,user,length,start_time,queue_time,time);
}
void MSG::fprint(FILE *file)
{
fprintf(file,"%1d\t%1d\t%2d\t
%4d\t%3d\t%2d\n",type,user,length,start_time,queue_time,time);
}
int MSG::rnd_type()
{
int x = random(101);
if ((x >= 0)&&(x <= 83)) return 1;
else if ((x > 83)&&(x <= 100)) return 4;
return -1;
}
int MSG::rnd_user(int ntype)
{
int x = random(101);
switch (ntype)
{
case 1:
if ((x >= 0)&&(x <= 62)) return 1;
else if ((x > 62)&&(x <= 89)) return 3;
else if ((x > 89)&&(x <= 98)) return 4;
else if ((x > 98)&&(x <= 100)) return 5;
case 2:
case 3:
case 4:
if ((x >= 0)&&(x <= 59)) return 1;
else if ((x > 59)&&(x <= 75)) return 2;
else if ((x > 75)&&(x <= 81)) return 3;
else if ((x > 81)&&(x <= 89)) return 4;
else if ((x > 89)&&(x <= 100)) return 5;
default:
return -1;
}
}
int MSG::rnd_length(int ntype)
{
int Length = 0;
int x = random(50)-25;
switch (ntype)
{
case 1:
Length = (int)binom_rnd();
return Length;
case 2:
case 3:
case 4:
Length = 68;
return Length + x;
}
return 0;
}
int MSG::rnd_time(int ntype)
{
switch (ntype)
{
case 1:
return (int)binom_rnd();
case 2:
case 3:
case 4:
return random(100);
}
return 0;
}
///////////////////////////////////////////////////////////
CQueue::CQueue()
{
channel = NULL;
for (int i = 0; i < 100; i++) queue[i] = NULL;
nCount = 0;
msg_time = 0;
nParsed = 0;
}
int CQueue::push(MSG *msg, int cur_time)
{
msg->start_time = cur_time;
if (channel == NULL)
{
channel = msg;
msg_time = msg->time;
fprintf(file,"Channel\t%4d\t",cur_time);
msg->fprint(file);
nParsed++;
return 1;
}
else
{
int no = nCount;
//pushing to queue:
for(int i = 0; i < nCount; i++)
if (queue[i]->type > msg->type)
{
no = i;
for (int j = nCount-1; j >= no; j--)
queue[j+1] = queue[j];
break;
}
nCount++;
queue[no] = msg;
fprintf(file,"*Queue*\t%4d\t",cur_time);
queue[no]->fprint(file);
return 0;
}
}
int CQueue::CheckChannel(int time)
{
if (msg_time <= 0)
{
channel = NULL;
}
else
{
msg_time--;
return 0;
}
//
if (channel == NULL)
{
if (nCount > 0)
{
pop(queue[0], time);
}
}
return 1;
}
int CQueue::pop(MSG *msg, int cur_time)
{
if (channel != NULL) return 0;
channel = msg;
msg_time = msg->time;
msg->queue_time = cur_time - msg->start_time;
for (int i = 0; i < nCount; i++)
queue[i] = queue[i+1];
nCount--;
fprintf(file,"Channel\t%4d\t",cur_time);
msg->fprint(file);
nParsed++;
return 1;
}
Вывод:
В лабораторной работе я сделал модель системы перенаправления группы заявок с разными приоритетами в один канал, реализовал принцип работы очереди, оценил параметры канала. Полученная программа - не абстрактная модель! Она может быть использована для анализа почти любых каналов и очередей к ним. Разница будет заключаться лишь в параметрах структуры сообщения (class MSG {...}) или еще проще - в их названии. Например, [мне этот пример нравится больше всего :)] представим маршрутку с одной дверью: подъезжает к остановке, останавливается... Каналом является дверь маршрутки, она обладает пропускной способностью ~0,75 чел/с. Люди вокруг нее выстраиваются в кучу, которую можно представить как 4 очереди: наибольший приоритет - у очереди напротив самой двери; наименьший - у крайних очередей. См. рисунок: у "очереди 1" - наибольший приоритет, у "очереди 3" - наименьший (дверь мешает :)).
Каждая очередь состоит из отдельных людей (заявок), каждый из которых обладает отдельным приоритетом (по принадлежности к очереди).
1
Документ
Категория
Компьютеры, Программирование
Просмотров
40
Размер файла
684 Кб
Теги
моделирование, моделир, лабы, лаба
1/--страниц
Пожаловаться на содержимое документа