ЛР5_ИМ
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
КАФЕДРА № 41
ЛАБОРАТОРНАЯ РАБОТА
ЗАЩИЩЕНА С ОЦЕНКОЙ
РУКОВОДИТЕЛЬ
Ассистент |
|
|
|
М.Н. Шелест |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЁТ О ЛАБОРАТОРНОЙ РАБОТЕ №5
|
МОДЕЛИРОВАНИЕ ЭЛЕМЕНТАРНОЙ СМО С КОНЕЧНЫМ БУФЕРОМ |
по курсу: ИМИТАЦИОННОЕ МОДЕЛИРОВАНИЕ |
|
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4616 |
|
|
|
А.В. Павлов |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург
2019
Цель работы.
Нахождение экспериментальных зависимостей Q(λ, µ0, N0) и T(λ, µ0, N0) для элементарной системы массового обслуживания с буфером объема N.Вариант задания.
Вариант №7.
Порядок эрланговского потока – 3
Равномерный закон
0 – 2
N=3
Формула и график моделируемого закона распределения
Рисунок 1 – График плотности вероятности
Рисунок 2 – График плотности вероятности для интервалов между заявками
Рисунок 3 – График функции распределения интервалов между заявками
Листинг 1 – Код программы
from matplotlib import pyplot as plt import numpy as np import numpy.random as rd
status = False #True - Пауссоновский поток, False - Экспериментальный поток #Условия варианта shape = 3 mu0 = 2 N = 3 #Инт. входного потока lambd = np.arange(0.1,3.1,0.1) * mu0 #Подсчет границ для равномер. a = 1/mu0 - 0.1 * mu0 / 2 b = a + 0.1 *mu0
if status: #Теор.знач. коэф. вариации обработки v = 1 #Теор.знач. коэф загрузки системы p = lambd[lambd < mu0] / mu0 #Теор.знач. вероятности потери запроса pFail = ((1-p) *p**(N+1)) / (1-p**(N+1)) #Теор.знач. среднего числа запросов в системе L = (p**2 * (1+v**2)) / (2*(1-p)) + p #Теор.знач. производительности ситсемы qTeor = lambd[lambd<mu0] * (1-pFail)
#Массив для ср. времени преб. в системе и производит системы tAnalis = qAnalis = np.array([])
#Проход по всем значениям интенс. потока for i in lambd: #Счетчики итераций, кол. заявок в очереди k = n = count = m = 0 #Занятость системы busy = False #Время выхода и время прихода запроса tWork=tRequest = rd.exponential(1 / i, 1) if status else rd.gamma(shape, 1 / (i * shape), 1) #Массивы для времени прихода и выхода запроса #Времена приходов заявок,интенсивности входного потока dataRequest = dataWork = lambdData = np.array([]) #Значение старых параметров tOld = qOld = 2**32 while(True): count +=1 #Если вр. прихода <= времени выхода тогда if tRequest<=tWork: #Системное время = время прихода запроса systemT = tRequest #Кол. пришедших в сист запросов +1 n+=1 #Генерация времени tRequest = rd.exponential(1 / i, 1) if status else rd.gamma(shape, 1 / (i * shape), 1) # Сохранение для посдчета интенсивности входного потока lambdData = np.append(lambdData, tRequest) #Расчет времени прихода в систему tRequest = tRequest + systemT
#Если не занято if (busy == False): #Тогда занимаем busy = True # Генерация времени выхода запроса из системы tWork = systemT + rd.exponential(1 / mu0, 1) if status else rd.uniform(a,b) else: #Если буфер переполнен то убераем заявку if m>=N: count -=1 continue #Увелечение очереди m+=1 #Сохраняем время прихода запроса dataRequest = np.append(dataRequest, systemT) else: #Сист время = время выхода запроса systemT = tWork #Количество обработанных заявок +1 k+=1 #Сохранение времение выхода dataWork = np.append(dataWork,systemT)
#Если очередь не пуста if(m>0): #Удаляем запрос из очереди m = m -1 #генерируем время выхода запроса из системы tWork = systemT + rd.exponential(1 / mu0, 1) if status else rd.uniform(a,b) else: #Освобожаем ОУ busy = False #Время выхода = время прихода tWork = tRequest #Подсчет оценки if count % 500 == 0 : #Расчет оценки среднего времени нахождения запроса в системе tNew = np.mean(dataWork - dataRequest[:len(dataWork)]) #Расчет оценки производительности системы qNew = (k/n) / np.mean(lambdData) if(np.abs((tNew - tOld)/tOld) > 0.001 or np.abs((qNew-qOld)/qOld) > 0.001): #Меняем старые значение на новые tOld = tNew qOld = qNew else: break #Сохраняем оценки tAnalis = np.append(tAnalis,tNew) qAnalis = np.append(qAnalis,qNew)
#Рисуем графики if status: plt.grid() print(qTeor) print(qAnalis) plt.plot(lambd[:len(qTeor)], qTeor, lw=4, color='green',alpha = 0.5) plt.plot(lambd[:len(qTeor)], qAnalis[:len(qTeor)], lw=4, color='red',alpha = 0.5) plt.ylabel('Ср. t в системе') plt.xlabel('Инт. входного потока') plt.show() else: plt.grid() plt.plot(lambd, tAnalis, lw=4, color='green') plt.ylabel('Ср. t в системе') plt.xlabel('Инт. входного потока') plt.show()
plt.grid() plt.plot(lambd, qAnalis, lw=4, color='green') plt.ylabel('Производительность системы') plt.xlabel('Инт. входного потока') plt.show() |
Полученные графики
Рисунок 4 – График зависимости среднего времени пребывания запроса в системе от интенсивности входного потока для потока по варианту
Рисунок 5 – График зависимости производительности системы от интенсивности входного потока для потока по варианту
Рисунок 6 - График зависимости производительности системы от интенсивности входного потока для тестового потока
Рисунок 7 - График зависимости среднего времени пребывания запроса в системе от интенсивности входного потока для тестового потока
λ |
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.56 |
0.62 |
0.46 |
0.69 |
0.77 |
0.87 |
0.95 |
1.06 |
1.12 |
1.17 |
Q |
0.20 |
0.40 |
0.60 |
0.79 |
0.98 |
1.14 |
1.29 |
1.40 |
1.50 |
1.5 |
Выводы.
В ходе данной лабораторной работы изучили базовые принципы моделирования СМО с конечным буфером . Разработали программу для моделирования СМО с конечным буфером с заданными по варианту параметрами, и расчётом оценки параметров. В результате полученные результаты совпали с теоретическими значениями