Скорость работы канала

10

20

30

40

50

60

70

80

90

100

Среднее время пребывания заявки в очереди

205.3186

52.5616

6.4049

1.0284

0.3452

0.1629

0.0803

0.0421

0.0226

0.0100

Среднее время пребывания заявки в системе

211.6196

55.7121

8.5052

2.6037

1.6054

1.2131

0.9804

0.8298

0.7227

0.6401

Среднее число заявок в системе

33.5851

17.6836

3.9514

1.3363

0.8357

0.6321

0.5113

0.4329

0.3772

0.3342

Как и в предыдущих случаях, построим графики исследуемых зависимостей:

Из анализа графиков видно, что среднее время пребывания заявки как в очереди, так и в системе с увеличением скорости работы канала резко убывает практически до нуля (по сути дела в системе отсутствуют очереди – заявка начинает обрабатываться сразу же после поступления в систему). Начиная со скорости 60 символов/с это время практически не меняется.

Среднее количество заявок в системе также резко уменьшается при большой скорости работы канала. Практически при данных скоростях в системе присутствует только одна заявка – та, которая обрабатывается в данный момент времени.

Отметим также, что при скорости 50 заявок/с оборудование загружено почти полностью; дальнейшее увеличение скорости приводит к значительному уменьшению значения коэффициента загрузки.

Из всего выше сказанного можно сделать вывод, что для данной системы наиболее выгодной скоростью работы канала является скорость примерно 60 символов/с. Это значение близко к среднему значению длины поступающих заявок, которое составляет примерно 62-63 символа. По-видимому, при данном законе поступления заявок в систему это значение скорости работы канала и будет оптимальным.

НЕ нашли? Не то? Что вы ищете?

Исходный текст программы, моделирующей работу канала.

#include <stdio. h>

#include <conio. h>

#include <math. h>

struct Msg {

int type;

int len;

double time;

} msg;

struct Message {

int type;

int len;

double inSystem;

double outQueue;

double outSystem;

};

Message stream[100];

void loadStream() {

FILE * fin = fopen("model3.dat", "rb");

for (int i = 0; i < 100; i++) {

fread(&msg, sizeof(Msg), 1, fin);

stream[i].type = msg. type;

stream[i].len = msg. len;

stream[i].inSystem = msg. time;

stream[i].outQueue = 0;

stream[i].outSystem = 0;

}

fclose(fin);

}

void treatment(FILE * fout, int V) {

double v[4];

double D[4];

double sigma[4];

double mu[4];

double lambda1[4];

double ro[4];

double eta[4];

double R, Lambda;

double r[4];

double lambda2[4];

double p[4];

double w[4];

double u[4];

double l[4];

double W, U, L;

double array[100];

int numMsg[4];

int i;

for (i = 0; i < 4; i++) {

v[i] = D[i] = sigma[i] = mu[i] = lambda1[i] = ro[i] = eta[i] = r[i] = 0;

lambda2[i] = p[i] = w[i] = u[i] = l[i] = 0;

numMsg[i] = 0;

}

R = Lambda = W = U = L = 0;

for (i = 0; i < 100; i++)

numMsg[stream[i].type - 1]++;

for (i = 0; i < 100; i++)

array[i] = stream[i].outSystem - stream[i].outQueue;

for (i = 0; i < 100; i++)

v[stream[i].type - 1] += array[i];

for (i = 0; i < 4; i++)

v[i] /= numMsg[i];

for (i = 0; i < 100; i++)

D[stream[i].type - 1] += array[i] * array[i];

for (i = 0; i < 4; i++) {

D[i] /= numMsg[i];

D[i] -= v[i] * v[i];

}

for (i = 0; i < 4; i++)

sigma[i] = sqrt(D[i]);

for (i = 0; i < 4; i++)

mu[i] = 1.0 / v[i];

double totalTime = stream[99].outSystem;

for (i = 0; i < 4; i++)

lambda1[i] = 1.0 * numMsg[i] / totalTime;

for (i = 0; i < 4; i++)

ro[i] = lambda1[i] / mu[i];

for (i = 0; i < 4; i++)

eta[i] = 1.0 - ro[i];

for (i = 0; i < 4; i++)

R += ro[i];

for (i = 0; i < 4; i++)

Lambda += lambda1[i];

for (i = 0; i < 4; i++) {

int j = 0;

while ((stream[j].type - 1) != i) j++;

double start = stream[j].inSystem;

j = 99;

while ((stream[j].type - 1) != i) j--;

double end = stream[j].inSystem;

r[i] = (end - start) / (numMsg[i] - 1);

}

for (i = 0; i < 4; i++)

lambda2[i] = 1.0 / r[i];

for (i = 0; i < 4; i++)

p[i] = lambda1[i] / Lambda;

for (i = 0; i < 100; i++)

array[i] = stream[i].outQueue - stream[i].inSystem;

for (i = 0; i < 100; i++)

w[stream[i].type - 1] += array[i];

for (i = 0; i < 4; i++)

w[i] /= numMsg[i];

for (i = 0; i < 100; i++)

array[i] = stream[i].outSystem - stream[i].inSystem;

for (i = 0; i < 100; i++)

u[stream[i].type - 1] += array[i];

for (i = 0; i < 4; i++)

u[i] /= numMsg[i];

for (i = 0; i < 4; i++)

l[i] = w[i] * lambda1[i];

for (i = 0; i < 4; i++)

W += p[i] * w[i];

for (i = 0; i < 4; i++)

U += p[i] * u[i];

for (i = 0; i < 4; i++)

L += lambda1[i] * u[i];

fprintf(fout, "======================================================\n");

fprintf(fout, "Скорость работы канала равна %d\n", V);

fprintf(fout, "Среднее время обслуживания заявки i-го типа:\n");

for (i = 0; i < 4; i++)

fprintf(fout, "%6.4f\t%6.4f\t%6.4f\n", v[i], D[i], sigma[i]);

fprintf(fout, "\n\n");

fprintf(fout, "Интенсивность обслуживания:\n");

for (i = 0; i < 4; i++)

fprintf(fout, "%6.4f\n", mu[i]);

fprintf(fout, "\n\n");

fprintf(fout, "Среднее число заявок i-го типа, поступающих во время работы системы:\n");

for (i = 0; i < 4; i++)

fprintf(fout, "%6.4f\n", lambda1[i]);

fprintf(fout, "\n\n");

fprintf(fout, "Коэффициенты загрузки и простоя:\n");

for (i = 0; i < 4; i++)

fprintf(fout, "%6.4f\t%6.4f\n", ro[i], eta[i]);

fprintf(fout, "\n\n");

fprintf(fout, "Коэффициент загрузки и интенсивность:\n");

fprintf(fout, "%6.4f\t%6.4f\n", R, Lambda);

fprintf(fout, "\n\n");

fprintf(fout, "Ср. промежутки времени, интенсивность поступления и вероятность поступления:\n");

for (i = 0; i < 4; i++)

fprintf(fout, "%6.4f\t%6.4f\t%6.4f\n", r[i], lambda2[i], p[i]);

fprintf(fout, "\n\n");

fprintf(fout, "Время пребывания заявки в очереди, системе, длина очереди (i-го типа заявок):\n");

for (i = 0; i < 4; i++)

fprintf(fout, "%6.4f\t%6.4f\t%6.4f\n", w[i], u[i], l[i]);

fprintf(fout, "\n\n");

fprintf(fout, "Время пребывания заявки в очереди, системе, длина очереди:\n");

fprintf(fout, "%6.4f\t%6.4f\t%6.4f\n", W, U, L);

fprintf(fout, "\n\n");

}

void test() {

FILE * fout = fopen("modelir4.txt", "wt");

for (int V = 10; V <= 100; V += 10) {

int i;

loadStream();

double curTime = 0;

for (i = 0; i < 100; i++) {

if (stream[i].inSystem > curTime) curTime = stream[i].inSystem;

stream[i].outQueue = curTime;

curTime += 1.0 * stream[i].len / V;

stream[i].outSystem = curTime;

}

treatment(fout, V);

}

fclose(fout);

printf("Test done!");

if (getch() == 0) getch();

}

void main() {

clrscr();

test();

}

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5