Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР / ЛР4 / ИМ ЛР4

.pdf
Скачиваний:
24
Добавлен:
25.06.2023
Размер:
429.63 Кб
Скачать

ГУАП

КАФЕДРА №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

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

Соседние файлы в папке ЛР4