
ЛР 4 / ЛАБА_4
.pdf

Цель работы:
Исследование основных характеристик входных потоков заявок, а также базовых принципов моделирования СМО по событиям.
Вариант №9.
Порядок эрланговского потока – 5
Равномерный закон
0 = 4
Ход работы:
Согласно варианту, закон распределения входного потока заявок эрланговский 5
порядка. Для эрланговского закона распределения плотность вероятности записывается следующим образом:
|
( )−1 |
−, |
при ≥ 0 |
|
|
( ) = { ( − 1)! |
. |
||||
|
|
||||
0, |
|
при < 0 |
|
Пользуясь методом обратного преобразования, можно вывести следующее соотношение, позволяющее из чисел, сформированных базовым датчиком, получить числа с эрланговским законом распределения:
= −1 ∑=1 ln .
График закона распределения интервалов эрланговского распределения представлен на рисунке 1. Листинг кода представлен в приложении.
2
Рисунок 1 - График плотности Эрланговского распределения Согласно варианту, закон распределения времени обслуживания заявок
равномерный. Для равномерного закона распределения плотность вероятности
записывается следующим образом: |
|
|
|
1 |
, |
при ≤ ≤ . |
|
( ) = { |
|
||
− |
|||
0, |
|
иначе |
Пользуясь методом обратного преобразования, можно вывести следующее
соотношение, позволяющее из чисел, сформированных базовым датчиком, получить числа
с эрланговским законом распределения:
= ( − ) + .
3

Были выведены формулы для расчета a и b:
− = 0.1 0 |
|
|
|
|
|
|
|
1 |
|
|||||
0 |
= |
1 |
|
|
|
− = 0.1 0 |
|
= |
+ 0.05 0 |
|||||
|
|
|
|
→ { |
|
|
2 |
|
→ { |
|
||||
|
̅ |
|
|
|
||||||||||
|
|
|
0 |
= |
|
|
0 |
|||||||
|
+ |
|
̅̅̅̅̅̅̅ |
|
= − 0.1 0 |
|||||||||
{ ̅= |
|
|
|
|
|
|
|
|
+ |
|
||||
|
2 |
|
|
|
|
|
|
|
|
|
|
|
График закона распределения интервалов равномерного распределения представлен на рисунке 2. Листинг кода представлен в приложении.
Рисунок 2 - График плотности равномерного распределения
На рисунке 3 представлены теоретический и экспериментальный графики зависимости среднего времени пребывания заявки в системе от интенсивности пуассоновского входного потока для тестового испытания. Листинг кода представлен в приложении.
4

Рисунок 3 - График зависимости λ от T для тестового Пуассоновского входного потока
На рисунках 4-5 представлены результаты моделирования для получения требуемой экспериментальной зависимости среднего времени пребывания заявки в системе от интенсивности эрланговского входного потока и построенный по ним график. Листинг кода представлен в Приложении А.
Рисунок 4 - Зависимость среднего времени пребывания запроса от интенсивности входного потока
5

Рисунок 5 - График зависимости λ от T для экспериментального Эрланговского входного потока
Вывод:
В ходе данной лабораторной работы я познакомилась с элементарными системами массового обслуживания (ЭСМО) с бесконечным буфером и смоделировала работу одной из таких систем. В смоделированной ЭСМО был реализован эрланговский закон распределения 5 порядка для входного потока заявок и равномерный закон распределения времени обслуживания заявок.
Был построен график зависимости среднего времени пребывания запроса от интенсивности входного потока. Расчеты были проведены при разных значениях интенсивности в диапазоне значений λ = 0.1µ0, 0.2µ0, …, 1µ0, поэтому на графике видно,
что чем больше интенсивность, тем больше среднее временя пребывания запроса в системе.
6

Приложение
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)
7

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
8

# Расчет границ для равномерного распределения 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]
# Построение графика теоритически расчитанного значения
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)
10