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

lab4

.docx
Скачиваний:
1
Добавлен:
27.08.2024
Размер:
647.54 Кб
Скачать

  1. Цель работы

Нахождение экспериментальной зависимости T(λ, µ0) для элементарной системы массового обслуживания с бесконечным буфером.

Вариант 16

Во втором столбце записан закон распределения входного потока заявок, в третьем – закон распределения времени обслуживания заявок, в четвёртом - µ0.

  1. Ход работы

Записывается формула и строится график экспоненциальный, используемый для распределения заявок на входе. Это представлено на рисунке 1.

Формула: f(x;λ)= λ*ex

Рисунок 1 – Плотность экспоненциального распределения

Записывается формула и строится график равномерного распределения, используемый для распределения времени обслуживания заявок на выходе. Это представлено на рисунке 2.

Формула: f(x) =

Рисунок 2 – Плотность равномерного распределения

Проводится моделирование работы СМО с буфером. Главным критерием для вычисления является поиск среднего времени пребывания запроса в системе, которое вычисляется по формуле:

T =

Моделируется работы системы такой системы. Записывается зависимость среднего времени пребывания запроса от интенсивности входного потока. Это представлено на рисунке 3.

Рисунок 3 – Моделирование для экспериментальной зависимости

Таблица с подробными экспериментальными данными о среднем времени пребывания в системе представлена на рисунке 4.

Рисунок 4 - Данные о зависимости среднего времени пребывания запроса от интенсивности входного потока

В программе выполняются моделирования теоретическое и экспериментальное (при заданных по варианту данных). График сравнения зависимостей моделирований представлено на рисунке 3, при этом погрешность расхождений не превышает 1%. Код выполнения программы представлен в Приложении.

Рисунок 3 – Оценка результатов моделирования

  1. Вывод

В ходе данной лабораторной работы я познакомился с элементарной системой массового обслуживания с бесконечным буфером. В ходе моделирования теоретической и экспериментальной было выяснено, что при увеличении интенсивности входного потока среднее время пребывания в системе сильно увеличивается. Это связано с тем, что чем больше заявок в системе, тем больше они ожидают своей обработки, находясь в буфере.

В ходе работы проблем не возникло.

Приложение

import sys

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from scipy.stats import uniform, expon

def __plot__(figure, arr_x, arr_y=None,

title='', xlabel='', ylabel='',

legend: str = None, color=''):

fig = plt.figure(figure)

ax = fig.add_axes((0.1, 0.1, 0.8, 0.8))

ax.spines['right'].set_color('none')

ax.spines['top'].set_color('none')

if arr_y is None:

ax.plot(arr_x, label=legend, color=color)

else:

ax.plot(arr_x, arr_y, label=legend, color=color)

ax.grid()

ax.set_title(title)

ax.set_ylabel(ylabel)

ax.set_xlabel(xlabel)

if legend is not None:

ax.legend()

def plot_expon_distribution(lambda_, figure):

# Определение границ графика:

temp = expon.rvs(scale= 1/lambda_, size=10000)

x_min, x_max = min(temp), max(temp)

# Построение графика:

x = np.linspace(x_min, x_max, 1000)

y = expon.pdf(x, scale=1/lambda_)

title = 'Плотность экспоненциального распределения распределения'

__plot__(figure, x, y, title, color='black')

def plot_uniform_distribution(a, b, figure):

# Определение границ интервала

x_min, x_max = a - 0.05, b + 0.05

# Построение графика

x = np.linspace(x_min, x_max, 10000)

y = uniform.pdf(x, loc=a, scale=b-a)

title = 'Плотность равномерного распределения'

__plot__(figure, x, y, title=title, color='black')

def model_of_queuing_system(mu, l, is_test):

a = 1 / mu - 0.05 * mu

b = a + 0.1 * mu

new_t_income = lambda: expon.rvs(scale=1 / l)

new_t_outcome = lambda: expon.rvs(scale= 1 / mu) if is_test else uniform.rvs(loc=a, scale=b-a)

# системное время

ts = 0

# занятость ОУ

busy = False

# момент поступления заявки

t_in = new_t_income()

t_ins = []

# момент освобождения ОУ

t_out = t_in

t_outs = []

n, k, m = 0, 0, 0

t_mean_old = sys.float_info.max

counter = 0

while True:

counter += 1

# Проверяем наступило ли время освобождения ОУ

if t_in <= t_out:

# Записываем в системное время момент поступления заявки

ts = t_in

n += 1 # Увеличиваем счетчик поступивших заявок

# Сохраняем в список момент поступления заявки

t_ins.append(t_in)

# Система обрабатывает сейчас заявку?

if busy:

m += 1

else:

busy = True

t_out = ts + new_t_outcome()

# Вычисляем следующий момент поступления заявки

t_in = ts + new_t_income()

else:

# Записываем в системное время момент освобождения ОУ

ts = t_out

k += 1 # Увеличиваем счетчик обслуженных заявок

# Сохраняем в список момент освобождения ОУ

t_outs.append(t_out)

# В буфере больше 0 заявок?

if m > 0:

m -= 1

t_out = ts + new_t_outcome()

else:

busy = False

t_out = t_in

# Ошибка удовлетворительная?

if counter % 1000 == 0:

t_mean_new = np.mean([t_outs[i] - t_ins[i] for i in range(len(t_outs))])

if abs((t_mean_new - t_mean_old) / t_mean_old) < 0.01:

return t_mean_new

t_mean_old = t_mean_new

def experiment(mu, is_test, figure):

# Параметры для тестирования

lambdas = np.linspace(0.1, 1, 10) * mu

T_theoretical = []

T_experimental = []

# Сбор практических данных

for l in lambdas:

T_experimental.append(model_of_queuing_system(mu, l, is_test))

if is_test:

# Сбор теоретических данных

for l in lambdas:

ro = l / mu

N_mean = ro / (1 - ro)

T_theoretical.append(N_mean / l)

# Построение теоретического графика

plt.figure(figure)

plt.plot(lambdas[:9], T_theoretical[:9], label="Теоретическое")

plt.plot(lambdas[:9], T_experimental[:9], label="Экспериментальное")

plt.legend()

plt.title("Оценка результатов моделирования")

plt.ylabel("Ср. время в системе")

plt.xlabel("Интенсивность входного потока $(\lambda)$")

plt.grid()

return T_experimental

if __name__ == "__main__":

mu = 1

a = np.random.random()

b = a + 0.1 * mu

# Построение графиков

plot_expon_distribution(mu, 1)

plot_uniform_distribution(a, b, 2)

print('Проходиит моделирование тестовое')

experiment(mu, is_test=True, figure=3)

print('Проходит моделирование экспериментальное')

index = [rf"{i:.1f}mu" for i in np.linspace(0.1, 1, 10)]

arr = experiment(mu, is_test=False, figure=4)

df = pd.DataFrame(arr, index=index, columns=["T"])

print(df.T)

# Построение экспериментального графика

__plot__(4, df[:9], title='Моделирование для экспериментальной зависимости',

ylabel='Ср. время в системе', xlabel='Интенсивность входного потока $(\lambda)$',

color='black')

plt.show()

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