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

ЛР5_ИМ

.docx
Скачиваний:
54
Добавлен:
18.12.2019
Размер:
294.97 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

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

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

Выводы.

В ходе данной лабораторной работы изучили базовые принципы моделирования СМО с конечным буфером . Разработали программу для моделирования СМО с конечным буфером с заданными по варианту параметрами, и расчётом оценки параметров. В результате полученные результаты совпали с теоретическими значениями

Соседние файлы в предмете Имитационное моделирование систем