Скорость работы канала | 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 |


