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

ИМ5

.docx
Скачиваний:
0
Добавлен:
12.04.2025
Размер:
152.31 Кб
Скачать

ГУАП

КАФЕДРА № 41

ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

д-р физ.-мат. наук

Рождественский Ю.В

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №6

МОДЕЛИРОВАНИЕ СИСТЕМЫ МАССОВОГО ОБСЛУЖИВАНИЯ С ЛИМИТИРОВАННЫМ БУФЕРОМ

по курсу: ИМИТАЦИОННОЕ МОДЕЛИРОВАНИЕ

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ гр. №

4116

подпись, дата

инициалы, фамилия

Санкт-Петербург 2024

Цель работы: смоделировать СМО с 1 каналом и лимитированным буфером.

Ход работы:

Смоделирована система массового обслуживания с ограниченным буфером, фиксированным временем обслуживания и экспоненциальным распределением прихода заявок. Заданы параметры системы: интенсивность входного потока 0,9; интенсивность обслуживания 1,5; а лимит буфера 3. Исследовано поведение системы, построена гистограмма выходного потока (Рисунок 1-4).

Листинг 1- Реализация СМО, вывод метрик и построение графиков

import numpy as np

import matplotlib.pyplot as plt

def simulate_smo_with_buffer(mu, lambda_, simulation_time, buffer_limit):

current_time = 0

is_channel_busy = False

queue = []

processed_requests = 0

dropped_requests = 0 # Отклонено заявок

waiting_times = []

departure_times = [] # Время завершения обслуживания

arrival_times = []

arrival_generator = lambda: np.random.exponential(1 / lambda_)

fixed_service_time = 1 / mu

next_arrival = arrival_generator()

next_service_completion = float('inf')

while current_time < simulation_time:

if next_arrival < next_service_completion:

current_time = next_arrival

arrival_times.append(current_time)

if is_channel_busy:

if len(queue) < buffer_limit:

queue.append(current_time)

else:

dropped_requests += 1 # Заявка отклонена

else:

is_channel_busy = True

next_service_completion = current_time + fixed_service_time

next_arrival = current_time + arrival_generator()

else:

current_time = next_service_completion

processed_requests += 1

departure_times.append(current_time)

if queue:

waiting_times.append(current_time - queue.pop(0))

next_service_completion = current_time + fixed_service_time

else:

is_channel_busy = False

next_service_completion = float('inf')

throughput = processed_requests / simulation_time

average_waiting_time = np.mean(waiting_times) if waiting_times else 0

average_time_in_system = average_waiting_time + fixed_service_time

return (throughput, processed_requests, average_time_in_system,

waiting_times, departure_times, arrival_times, dropped_requests)

def plot_histograms_with_analysis(departure_times, arrival_times):

# Интервалы между выходящими заявками

inter_departure_times = np.diff(departure_times)

mean_dep = np.mean(inter_departure_times)

std_dev_dep = np.std(inter_departure_times)

plt.figure(figsize=(12, 6))

plt.hist(inter_departure_times, bins=30, color='blue', edgecolor='black', alpha=0.7)

plt.title("Гистограмма интервалов выходного потока")

plt.xlabel("Интервал времени (ед. времени)")

plt.ylabel("Частота")

plt.grid()

plt.show()

print(f"Математическое ожидание (выходной поток): {mean_dep:.4f}")

print(f"Стандартное отклонение (выходной поток): {std_dev_dep:.4f}")

def plot_dependencies(mu, simulation_time, lambdas, buffer_limit):

avg_times = []

throughputs = []

dropped_requests = []

for lambda_ in lambdas:

throughput, _, avg_time_in_system, _, _, _, drops = simulate_smo_with_buffer(

mu, lambda_, simulation_time, buffer_limit

)

avg_times.append(avg_time_in_system)

throughputs.append(throughput)

dropped_requests.append(drops)

plt.figure(figsize=(14, 6))

# Время пребывания в системе от λ

plt.subplot(1, 2, 1)

plt.plot(lambdas, avg_times, marker='o', label="Среднее время в системе")

plt.title("Время пребывания в системе от интенсивности входного потока")

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

plt.ylabel("Среднее время (ед. времени)")

plt.grid()

plt.legend()

plt.legend()

plt.tight_layout()

plt.show()

print(f"Количество отклонённых заявок при разных λ: {dropped_requests}")

# Параметры

service_rate = 1.5

arrival_rate = 0.9

simulation_time = 1000

buffer_limit = 3 # Лимит буфера

(throughput, processed_requests, avg_time_in_system, waiting_times,

departure_times, arrival_times, dropped_requests) = simulate_smo_with_buffer(

service_rate, arrival_rate, simulation_time, buffer_limit

)

# Вывод метрик

print(f"Пропускная способность: {throughput:.4f} заявок/ед. времени")

print(f"Количество обработанных заявок: {processed_requests}")

print(f"Среднее время в системе: {avg_time_in_system:.4f} ед. времени")

print(f"Количество отклонённых заявок: {dropped_requests}")

plot_histograms_with_analysis(departure_times, arrival_times)

lambda_values = np.linspace(0.1, 2, 20) * service_rate

plot_dependencies(service_rate, simulation_time, lambda_values, buffer_limit)

Рисунок 1- Рассчитанные метрики

Рисунок 2 – Гистограмма выходного потока

Гистограмма показывает, что интервалы выходного потока в основном распределены около 1 ед. времени.

Рисунок 3- График зависимость времени пребывания в системе от интенсивности входного потока

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

Рисунок 4- Количество отклоненных заявок при разной интенсивности входного потока

Данные по количеству отклонённых заявок показывают, что при увеличении интенсивности входного потока, число отклонённых заявок растёт, что указывает на то, что система начинает испытывать перегрузку.

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

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