890541_Mod_v5
.docxМинистерство образования Республики Беларусь
Учреждение образования
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Факультет компьютерных систем и сетей
Кафедра ЭВМ
Отчет по контрольной работе №1
Тема: «Аналитическое моделирование дискретно-схоластической СМО»
Вариант 5
Выполнила: Игнатович А.О. группа 890541
Проверил: Русин В.Г.
Минск, 2022
Задание 1. Построить граф состояний СМО. Смысл кодировки раскрыть.
P-схема:
Э лементы:
– источник с фиксированным временем ожидания выдачи заявки и дисциплиной блокировки;
– очередь на 1 заявку;
– канал обработки заявок с вероятностью просеивания π1;
– канал обработки заявок с вероятностью просеивания π2.
Кодирование состояний:
с = {0,1,2} – состояние источника (0 – заблокирован, 1/2 количество тактов до выдачи заявки);
n = {0,1} – количество заявок в очереди;
k1 = {0,1} – состояние первого канала (0 – свободен, 1 – занят);
k2 = {0,1} – состояние второго канала (0 – свободен, 1 – занят).
Общая кодировка состояний системы:
Задание 2. Для СМО построить имитационную можель и исследовать ее (разработать алгоритм и написать имитирующую прогрумму, предусматривающую сбор и статичтическую обработку данных для получения оценок заданных харакреристик СМО).
Вероятности просеивания:
Цель исследования: Рбл – вероятность блокировки
Граф состояний:
Построение аналитической модели:
Нормировочное уравнение:
Решение системы в MathCad:
Исходя из полученных данных, рассчитаем теоретические значения вероятности блокировки ( ), среднее время пребывания заявки в системе (Wс) и среднее число заявок в очереди (Lоч):
Листинг программы:
#include <iostream>
#include <cstdlib>
#define N 1000000
using namespace std;
long long A0 = 117, M = 2094991, R0 = 17;
long long Rn_1, Rn;
double LehmerAlgorithm()
{
Rn_1 = Rn;
Rn = (A0 * Rn_1) % M;
return (double)Rn / (double)M;
}
int main()
{
Rn = R0;
char state[5] = "2000";
double pi1 = 0.75, pi2 = 0.6;
do
{
cout << endl << "pi1 = ";
cin >> pi1;
} while (pi1 < 0 || pi1 > 1);
do
{
cout << endl << "pi2 = ";
cin >> pi2;
} while (pi2 < 0 || pi2 > 1);
double pi1_cur, pi2_cur;
int P2000 = 0, P1000 = 0, P2010 = 0, P1010 = 0, P1001 = 0, P2011 = 0, P1011 = 0, P2111 = 0, P0111 = 0, P1111 = 0;
int Lo = 0, Lc = 0, L1 = 0, L2 = 0, Ac = 0, T = 0;
for (int i = 0; i < N; i++)
{
pi1_cur = LehmerAlgorithm();
pi2_cur = LehmerAlgorithm();
// 2000
if (!(strcmp(state, "2000")))
{
P2000++;
strcpy(state, "1000");
}
else
{
// 1000
if (!(strcmp(state, "1000")))
{
P1000++;
strcpy(state, "2010");
}
else
{
// 2010
if (!(strcmp(state, "2010")))
{
P2010++;
Lc++;
T++;
L1++;
if (pi1_cur <= pi1) { strcpy(state, "1010"); }
if (pi1_cur > pi1) { strcpy(state, "1000"); Ac++; }
}
else
{
// 1010
if (!(strcmp(state, "1010")))
{
P1010++;
Lc++;
L1++;
if (pi1_cur <= pi1) { strcpy(state, "2011"); }
if (pi1_cur > pi1) { strcpy(state, "2010"); Ac++; }
}
else
{
// 1001
if (!(strcmp(state, "1001")))
{
P1001++;
Lc++;
L2++;
if (pi2_cur <= pi2) { strcpy(state, "2011"); }
if (pi2_cur > pi2) { strcpy(state, "2010"); Ac++; }
}
else
{
// 2011
if (!(strcmp(state, "2011")))
{
P2011++;
Lc+=2;
T++;
L1++;
L2++;
if ((pi1_cur <= pi1) && (pi2_cur <= pi2)) { strcpy(state, "1011"); }
if ((pi1_cur <= pi1) && (pi2_cur > pi2)) { strcpy(state, "1010"); Ac++; }
if ((pi1_cur > pi1) && (pi2_cur <= pi2)) { strcpy(state, "1001"); Ac++; }
if ((pi1_cur > pi1) && (pi2_cur > pi2)) { strcpy(state, "1000"); Ac += 2; }
}
else
{
// 1011
if (!(strcmp(state, "1011")))
{
P1011++;
Lc += 2;
L1++;
L2++;
if ((pi1_cur <= pi1) && (pi2_cur <= pi2)) { strcpy(state, "2111"); }
if ((pi1_cur <= pi1) && (pi2_cur > pi2)) { strcpy(state, "2011"); Ac++; }
if ((pi1_cur > pi1) && (pi2_cur <= pi2)) { strcpy(state, "2011"); Ac++; }
if ((pi1_cur > pi1) && (pi2_cur > pi2)) { strcpy(state, "2010"); Ac += 2; }
}
else
{
// 2111
if (!(strcmp(state, "2111")))
{
P2111++;
Lo++;
Lc += 3;
T++;
L1++;
L2++;
if ((pi1_cur <= pi1) && (pi2_cur <= pi2)) { strcpy(state, "1111"); }
if ((pi1_cur <= pi1) && (pi2_cur > pi2)) { strcpy(state, "1011"); Ac++; }
if ((pi1_cur > pi1) && (pi2_cur <= pi2)) { strcpy(state, "1011"); Ac++; }
if ((pi1_cur > pi1) && (pi2_cur > pi2)) { strcpy(state, "1010"); Ac += 2; }
}
else
{
// 1111
if (!(strcmp(state, "1111")))
{
P1111++;
Lo++;
Lc += 3;
L1++;
L2++;
if ((pi1_cur <= pi1) && (pi2_cur <= pi2)) { strcpy(state, "0111"); }
if ((pi1_cur <= pi1) && (pi2_cur > pi2)) { strcpy(state, "2111"); Ac++; }
if ((pi1_cur > pi1) && (pi2_cur <= pi2)) { strcpy(state, "2111"); Ac++; }
if ((pi1_cur > pi1) && (pi2_cur > pi2)) { strcpy(state, "2011"); Ac += 2; }
}
else
{
// 0111
if (!(strcmp(state, "0111")))
{
P0111++;
Lo++;
Lc += 3;
L1++;
L2++;
if ((pi1_cur <= pi1) && (pi2_cur <= pi2)) { strcpy(state, "0111"); }
if ((pi1_cur <= pi1) && (pi2_cur > pi2)) { strcpy(state, "2111"); Ac++; }
if ((pi1_cur > pi1) && (pi2_cur <= pi2)) { strcpy(state, "2111"); Ac++; }
if ((pi1_cur > pi1) && (pi2_cur > pi2)) { strcpy(state, "2011"); Ac += 2; }
}
}
}
}
}
}
}
}
}
}
}
cout << endl << "P2000 = " << (double)P2000 / (double)N << endl;
cout << "P1000 = " << (double)P1000 / (double)N << endl;
cout << "P2010 = " << (double)P2010 / (double)N << endl;
cout << "P1010 = " << (double)P1010 / (double)N << endl;
cout << "P1001 = " << (double)P1001 / (double)N << endl;
cout << "P2011 = " << (double)P2011 / (double)N << endl;
cout << "P1011 = " << (double)P1011 / (double)N << endl;
cout << "P2111 = " << (double)P2111 / (double)N << endl;
cout << "P1111 = " << (double)P1111 / (double)N << endl;
cout << "P0111 = " << (double)P0111 / (double)N << endl << endl;
cout << "P = " << (double)P0111 / (double)N << endl;
cout << "Lo = " << (double)Lo / (double)N << endl;
cout << "Wc = " << ((double)Lo / (double)T) + ((pi1 == 1) ? 0 : ((double)L1 / (double)(Ac))) + ((pi2 == 1) ? 0 : ((double)L2 / (double)(Ac))) << endl;
return 0;
}
Результат выполнения программы: