ГУАП
КАФЕДРА №41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
ассистент |
|
|
|
М.Н. Шелест |
|
|
|
|
|
|
|
|
|
|
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №4
МОДЕЛИРОВАНИЕ ЭЛЕМЕНТАРНОЙ СМО С БЕСКОНЕЧНЫМ БУФЕРОМ
по курсу: Имитационное моделирование
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. №
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2022
Цель работы
Нахождение экспериментальной зависимости ( , 0) для элементарной системы массового обслуживания с бесконечным буфером.
Индивидуальный вариант
Индивидуальный вариант номер 10 в соответствии с таблицей 1.
Таблица 1 – Индивидуальный вариант задания
№ |
Закон распределения входного |
Закон распределения времени |
0 |
|
варианта |
потока заявок заявок( ) |
обслуживания заявок обслуж( ) |
||
|
||||
10 |
Эрланговский 6 порядка |
равномерный |
5 |
Ход работы
1. Формулы и графики законов распределения вероятностей для интервалов между заявками и времени обслуживания заявок.
Формула эрланговского распределения вероятностей закона распределения входного потока заявок заявок( ) для интервалов между заявками:
|
|
|
|
|
|
|
−1 |
|
− |
|
|
|
|
( ; , ) = |
|
|
|
|
|||
|
|
|
|
|
|
|||||
|
|
|
|
( − 1)! |
||||||
эрл( , ) = − |
1 |
∑ |
ln , где Ri – случайное число в диапазоне [0,1] |
|||||||
|
||||||||||
|
|
=1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
График эрланговского распределения вероятностей 6 порядка закона распределения входного потока заявок заявок( ) для интервалов между заявками в соответствии с рисунком 1.
Рисунок 1 – График закона распределения вероятностей для интервалов между заявками
2
Формула равномерного распределения вероятностей закона распределения времени обслуживания заявок обслуж( ) для времени обслуживания заявок:
|
1 |
, |
[ , ] |
|
|
|
|||
|
( ) = { |
− |
||
|
0, |
|
[ , ] |
|
равн |
= ( − ) + , где Ri – случайное число в диапазоне [0,1] |
|||
|
|
|
|
График равномерного распределения вероятностей закона распределения времени
обслуживания заявок обслуж( ) для времени обслуживания заявок в соответствии с рисунком 2.
Рисунок 2 – График закона распределения вероятностей для времени обслуживания заявок
3
2.Описание разработанной программы: список использованных переменных,
список использованных функций, блок-схема, листинг.
Полный код программы в соответствии с Приложением А.
Список использованных переменных функции modeling_experimental_dependence()
для моделирования СМО и построения графиков в соответствии с таблицей 2.
Таблица 2 – Список используемых переменных функции modeling_experimental_dependence()
Название |
|
Описание |
переменной |
|
|
|
|
|
shape |
|
Порядок эрлановского распределения заданный вариантом |
mu_0 |
|
Интенсивностью обслуживания заданная вариантом |
is_test |
|
Статус тестовый или экспериментальный запуск программы |
lambd |
|
Список значений интенсивности входного потока |
a |
|
Левая граница равномерного распределения |
b |
|
Правая граница равномерного распределения |
t_empirical |
|
Список рассчитанного эмпирически среднего времени обслуживания |
|
заявки |
|
|
|
|
l |
|
Итератор по значениям списка интенсивности входного потока lambd |
Nu |
|
Теоретически рассчитанный коэффициент вариации обработки |
Rho |
|
Теоретически рассчитанный коэффициент загрузки системы |
L |
|
Теоретически рассчитанное среднее число заявок в системе |
t_theor |
|
Теоретически рассчитанное среднее время обслуживания заявки |
Для |
моделирования смо и построения графиков написали функцию |
modeling_experimental_dependence() в соответствии с листингом 1.
Листинг 1 – Функция построения графиков для модели СМО
def modeling_experimental_dependence(shape, mu_0, is_test = False):
'''Функция построения графиков для модели СМО'''
# Генерация списка значений интенсивности входного потока lambd = np.linspace(0.1,1,10) * mu_0
#Расчет границ для равномерного распределения a = round(1 / mu_0 - 0.05 * mu_0, 2)
b = a + 0.1 * mu_0
#Список среднего времени пребывания запроса t_empirical = np.array([])
#Заполнение списка значений среднего времени пребывания запроса for l in lambd:
t_empirical = np.append(t_empirical, model(shape, l, a, b, is_test)) print('t_empirical', t_empirical)
#Построение графика
if is_test:
#Построение графика эрланговского распределения
#для закона распределения входного потока заявок
ploting_erlang_distribution(k=shape, lmbda=mu_0, N=10000)
#Построение графика равномерного распределения
#для закона распределения времени обслуживания заявок ploting_uniform_distribution(a=a, b=b)
4
#Расчет теоритических значений
#Расчет теор. значения коэффициента вариации обработки (равномерного распределения)
Nu = np.sqrt(((b-a)**2) / 12) / ((a+b) / 2)
#Расчет теор. значения коэффициента загрузки системы
Rho = lambd[lambd != mu_0]/mu_0
#Расчет теор. значения среднего числа запросов в системе
L = (Rho**2 * (1 + Nu**2)) / (2 * (1-Rho)) + Rho
#Расчет теор. значения среднего времени пребывания запроса в системе t_theor = L / lambd[lambd != mu_0]
#Построение графика георитически расчитанного значения plt.plot(lambd[:len(t_theor)], t_theor, label='Теоретическое
значение', color='red')
# Построение графика экспериментально полученного значения plt.plot(lambd[:9], t_empirical[:9], label='Рассчитанное значение',
color='black')
plt.title("График зависимость среднего времени пребывания запроса\nот интенсивности входного потока")
plt.ylabel('Ср. t в системе') plt.xlabel('Инт. входного потока') plt.grid()
plt.legend()
plt.show()
return t_empirical
Список использованных переменных функции model() моделирования работы СМО в соответствии с таблицей 2.
Таблица 3 – Список используемых переменных функции model()
Название |
Описание |
|
переменной |
||
|
||
shape |
Порядок эрлановского распределения заданный вариантом |
|
lambd |
Значений интенсивности входного потока |
|
a |
Левая граница равномерного распределения |
|
b |
Правая граница равномерного распределения |
|
is_test |
Статус тестовый или экспериментальный запуск программы |
|
get_t_request |
Лямбда ф-ция получения случайного значения распределения для |
|
закона распределения входного потока заявок |
||
|
||
get_t_work |
Лямбда ф-ция получения случайного значения распределения для |
|
закона распределения времени обслуживания заявок |
||
|
||
n |
Количество заявок, поступивших к данному моменту в СМО |
|
k |
Количество заявок, обслуженных к данному моменту в ОУ |
|
m |
Количество заявок в буфере |
|
is_busy |
Статус занятости ОУ (True, если ОУ занят, и False, если ОУ свободен) |
|
t_system |
Системное время |
|
t_request |
Следующий момент поступления заявки |
|
t_work |
Следующий момент освобождения ОУ |
|
t_request_Data |
Список времени моментов поступления заявок |
|
t_work_Data |
Список времени моментов освобождения ОУ |
|
t_me_Old |
Старая оценка среднего времени пребывания запроса |
|
loop_cnt |
Счетчик итераций цикла |
|
t_me_New |
Текущая на момент расчета оценка среднего времени пребывания |
|
запроса |
||
|
5
Код функции model() моделирующей работу СМО в соответствии с листингом 2.
Листинг 2 – Функция моделироваиня СМО
def model(shape, lambd, a, b, is_test):
'''Функция моделироваиня СМО'''
#Лямбда ф-ция получения случайного значения распределения
#Эрланговского для закона распределения входного потока заявок
get_t_request = lambda : np.random.exponential(1/lambd, 1) if is_test \ else st.erlang.rvs(a=shape,
scale=1/(lambd*shape))
#Равномерного для закона распределения времени обслуживания заявок get_t_work = lambda : np.random.uniform(a, b)
#Количество заявок, поступивших / обслуженных / в буфере к данному моменту в СМО
n, k, m = 0, 0, 0
#Статус занятости ОУ
is_busy = False
#Системное время t_system = 0
#Следующий момент поступления заявки t_request = get_t_request()
#Следующий момент освобождения ОУ
t_work = t_request
#Список времени моментов поступления заявок t_request_Data = np.array([])
#Список времени моментов освобождения ОУ
t_work_Data = np.array([])
#Старая отценка среднего времени пребывания запроса t_me_Old = 2 ** 32
#Счетчик итераций цикла
loop_cnt = 0
# Моделируем СМО while True:
loop_cnt += 1 # Увеличиваем счетчик цикла
# Проверяем наступило ли время освобождения ОУ if t_request <= t_work:
#Записываем в системное время момент поступления заявки t_system = t_request
n += 1 # Увеличиваем счетчик поступивших заявок
#Сохраняем в список момент поступления заявки
t_request_Data = np.append(t_request_Data, t_system)
# Проверяем занято ли ОУ if not is_busy:
is_busy = True # Устанавливаем статус ОУ в положение занято
# Вычисляем следующий момент освобождения ОУ t_work = t_system + get_t_work()
else:
m += 1 # Добавлием заявку в буфер
# Вычисляем следующий момент поступления заявки t_request = t_system + get_t_request()
else:
#Записываем в системное время момент освобождения ОУ t_system = t_work
k += 1 # Увеличиваем счетчик обслуженных заявок
#Сохраняем в список момент освобождения ОУ
6
t_work_Data = np.append(t_work_Data, t_system)
# Проверяем есть ли заявки в буфере if m > 0:
m -= 1 # Берем заявку из буфера
# Вычисляем следующий момент освобождения ОУ t_work = t_system + get_t_work()
else:
#Устанавливаем статус ОУ в положение свободно is_busy = False
#Устанавливаем следующий момент освобождения ОУ t_work = t_request
#Проводим отценку каждые 1000 итераций цикла
if loop_cnt % 1000 == 0:
# Высчитываем среднее время обслуживания заявки
t_me_New = np.mean(t_work_Data - t_request_Data[:len(t_work_Data)])
# Проверка достаточности условия выхода
if (np.abs((t_me_New - t_me_Old)/t_me_Old)) < 0.01: return
t_me_New
t_me_Old = t_me_New # Перезаписываем среднее время обслуживания
заявки
7
3. Теоретический и экспериментальный графики зависимости среднего времени пребывания заявки в системе от интенсивности входного потока для тестового примера в соответствии с рисунком 3.
Рисунок 3 – График зависимости λ от T для тестового Пуассоновского входного потока
8
4. Провели моделирование для получения требуемой экспериментальной зависимости при λ = 0.1µ0, 0.2µ0, …, 1µ0. Полученные данные внесли в таблицу 4.
Таблица 4 – Зависимость среднего времени пребывания запроса от интенсивности входного потока
λ |
0.1µ0 |
0.2µ0 |
0.3µ0 |
0.4µ0 |
0.5µ0 |
0.6µ0 |
0.7µ0 |
0.8µ0 |
0.9µ0 |
1µ0 |
|
|
|
|
|
|
|
|
|
|
|
T |
0.3344 |
0.3284 |
0.3303 |
0.3346 |
0.3458 |
0.3474 |
0.3782 |
0.4441 |
0.6202 |
1.7210 |
|
|
|
|
|
|
|
|
|
|
|
График зависимости λ от T для тестового Эрланговского 6 порядка входного потока и равномерного распределения закона обслуживания заявок в соответствии с рисунком 4.
Рисунок 4 – График зависимости λ от T для тестового Пуассоновского входного потока
9
Вывод
Входе данной лабораторной работы мы познакомились с элементарными системами массового обслуживания (ЭСМО) с бесконечным буфером, и смоделировали работу одной из таких систем.
Всмоделированной нами ЭСМО был реализован эрланговский закон распределения
6 порядка для входного потока заявок и равномерный закон распределения времени обслуживания заявок.
Разработанная программа моделировала случайное время появления заявок и время их обслуживания. В зависимости от параметров времени и заполненности буфера она принимала решения об обработках заявок, а мы фиксировали время поступления и обслуживания заявок, по которым потом определяли среднее время нахождения заявки в системе. Расчет средних значений позволил нам построить график зависимости среднего времени пребывания запроса от интенсивности входного потока. Расчеты были проведены при разных значениях интенсивности в диапазоне значений λ = 0.1µ0, 0.2µ0, …, 1µ0, поэтому на графике явно видно, что чем больше интенсивность тем больше среднее время обслуживания. Полученный результат согласуется с нашими представлениями об ЭСМО с постоянным входным потоком и временем обслуживания заявок.
10