ЛР 4 / ЛАБА_4
.docx
Цель работы:
Исследование основных характеристик входных потоков заявок, а также базовых принципов моделирования СМО по событиям.
Вариант №9.
Порядок эрланговского потока – 5
Равномерный закон
Ход работы:
Согласно варианту, закон распределения входного потока заявок эрланговский 5 порядка. Для эрланговского закона распределения плотность вероятности записывается следующим образом:
Пользуясь методом обратного преобразования, можно вывести следующее соотношение, позволяющее из чисел, сформированных базовым датчиком, получить числа с эрланговским законом распределения:
.
График закона распределения интервалов эрланговского распределения представлен на рисунке 1. Листинг кода представлен в приложении.
Рисунок 1 - График плотности Эрланговского распределения
Согласно варианту, закон распределения времени обслуживания заявок равномерный. Для равномерного закона распределения плотность вероятности записывается следующим образом:
Пользуясь методом обратного преобразования, можно вывести следующее соотношение, позволяющее из чисел, сформированных базовым датчиком, получить числа с эрланговским законом распределения:
Были выведены формулы для расчета a и b:
График закона распределения интервалов равномерного распределения представлен на рисунке 2. Листинг кода представлен в приложении.
Рисунок 2 - График плотности равномерного распределения
На рисунке 3 представлены теоретический и экспериментальный графики зависимости среднего времени пребывания заявки в системе от интенсивности пуассоновского входного потока для тестового испытания. Листинг кода представлен в приложении.
Рисунок 3 - График зависимости λ от T для тестового Пуассоновского входного потока
На рисунках 4-5 представлены результаты моделирования для получения требуемой экспериментальной зависимости среднего времени пребывания заявки в системе от интенсивности эрланговского входного потока и построенный по ним график. Листинг кода представлен в Приложении А.
Рисунок 4 - Зависимость среднего времени пребывания запроса от интенсивности входного потока
Рисунок 5 - График зависимости λ от T для экспериментального Эрланговского входного потока
Вывод:
В ходе данной лабораторной работы я познакомилась с элементарными системами массового обслуживания (ЭСМО) с бесконечным буфером и смоделировала работу одной из таких систем. В смоделированной ЭСМО был реализован эрланговский закон распределения 5 порядка для входного потока заявок и равномерный закон распределения времени обслуживания заявок.
Был построен график зависимости среднего времени пребывания запроса от интенсивности входного потока. Расчеты были проведены при разных значениях интенсивности в диапазоне значений λ = 0.1µ0, 0.2µ0, …, 1µ0, поэтому на графике видно, что чем больше интенсивность, тем больше среднее временя пребывания запроса в системе.
Приложение
import math
import numpy as np
import random
import matplotlib.pyplot as plt
from tabulate import tabulate
# Эрланговское распределение
def erlang_distribution(order, lam):
sum_uniform = 0
for j in range(0, order):
R = random.uniform(0.0, 1.0)
sum_uniform += math.log(R)
return (-1 * sum_uniform) / (lam * order)
# Равномерное распределение
def uniform_distribution(a, b):
R = random.uniform(0.0, 1.0)
return R * (b - a) + a
# Пуассоновский закон
def poisson_distribution(lam):
R = random.uniform(0.0, 1.0)
return (-1 * math.log(R)) / lam
# Функция для моделирования ЭСМО
def modeling(order, lam, a, b, condition: bool):
# Количество заявок поступивших / обслуженных / в буфере к данному моменту в СМО, системное время, статус занятости ОУ
n, k, m, t_system, zan = 0, 0, 0, 0, 0
# Моменты поступления заявок
t_request_list = np.array([])
# Моменты обслуживания заявок
t_release_list = np.array([])
# Старая оценка среднего времени пребывания запроса
T_old = 1000000
counter_N = 0
# Формирование случайного момента поступления заявки
t_request = poisson_distribution(lam) if condition else erlang_distribution(order, lam)
t_release = t_request
while True:
# Счетчик объема выборки
counter_N += 1
# Проверяем наступило ли время освобождения ОУ
if t_request <= t_release:
t_system = t_request
n += 1
# Добавляем момент поступления заявки
t_request_list = np.append(t_request_list, t_system)
if zan == 0:
zan = 1
t_release = t_system + uniform_distribution(a, b)
else:
m += 1
# Следующий момент поступления заявки
t_request = t_system + (poisson_distribution(lam) if condition else erlang_distribution(order, lam))
else:
# Записываем в системное время момент освобождения ОУ
t_system = t_release
# Увеличиваем счетчик обслуженных заявок
k += 1
# Добавляем в список момент освобождения ОУ
t_release_list = np.append(t_release_list, t_system)
if m > 0:
m -= 1
t_release = t_system + uniform_distribution(a, b)
else:
zan = 0
t_release = t_request
if counter_N % 100 == 0:
T_new = np.mean(t_release_list - t_request_list[:len(t_release_list)])
if (np.abs((T_new - T_old) / T_old)) < 0.01:
return T_new
T_old = T_new
# Функция для построения графиков
def modeling_experimental(order, nu_0, condition: bool):
# Генерация списка значений интенсивности входного потока
lam = np.linspace(0.1, 1, 10) * nu_0
# Расчет границ для равномерного распределения
b = 1 / nu_0 + 0.05 * nu_0
a = b - 0.1 * nu_0
# Среднее время пребывания запроса
T_experiment = np.array([])
for i in lam:
T_experiment = np.append(T_experiment, modeling(order, i, a, b, condition))
print('Значения среднего времени Т пребывания запроса:', T_experiment)
# Расчет теор. значения
if condition:
# График эрланговского распределения
x = np.linspace(0, 10, 200)
lmbda = np.mean(lam)
plt.plot(x, (((lmbda ** order) * (x ** (order - 1)) * np.exp(-lmbda * x)) / math.factorial(order - 1)),
lw=2, alpha=0.7, color='blue', label='k={}, lambda={}'.format(order, lmbda))
plt.title('График плотности Эрланговского распределения')
plt.grid()
plt.legend()
plt.show()
# График равномерного распределения
x = np.linspace(a, b, 100)
plt.plot(x, [1 / (b - a)] * 100, lw=2, alpha=0.7, color='blue', label='a={}, b={}'.format(a, b))
plt.title('График плотности равномерного распределения')
plt.grid()
plt.legend()
plt.show()
# Расчет коэффициента вариации равномерного распределения
v = ((b - a) * math.sqrt(3) / 6) / ((a + b) / 2)
# Расчет коэффициента загрузки системы
p = lam[:9] / nu_0
# Расчет среднего числа запросов в системе
L = (p ** 2 * (1 + v ** 2)) / (2 * (1 - p)) + p
# Расчет среднего времени пребывания запроса в системе
T_theory = L / lam[:9]
# Построение графика теоритически расчитанного значения
plt.plot(lam[:9], T_theory, label='Теоретическое значение', color='orange')
else:
# Матрица результатов моделирования
results_evaluation = np.empty((11, 2), dtype='object')
results_evaluation[0] = ['Интенсивность входного потока', 'Среднее время пребывания запроса']
results_evaluation[1:, 0] = np.transpose(lam)
results_evaluation[1:, 1] = np.transpose(T_experiment)
print(tabulate(results_evaluation))
# Построение графика экспериментально полученного значения
plt.plot(lam[:9], T_experiment[:9], label='Рассчитанное значение', color='black')
plt.title('Зависимость среднего времени пребывания запроса от интенсивности входного потока')
plt.ylabel('Среднее временя Т пребывания запроса')
plt.xlabel('Инт. входного потока')
plt.grid()
plt.legend()
plt.show()
return T_experiment
modeling_experimental(5, 4, True)
modeling_experimental(5, 4, False)