
ИМ5
.docxГУАП
КАФЕДРА № 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- Количество отклоненных заявок при разной интенсивности входного потока
Данные по количеству отклонённых заявок показывают, что при увеличении интенсивности входного потока, число отклонённых заявок растёт, что указывает на то, что система начинает испытывать перегрузку.
Выводы: смоделирована СМО с лимитированным буфером и одинаковым временем обслуживания заявки. Определена пропускная способность системы, построены гистограмма выходного потока и график зависимости среднего времени заявки в системе от интенсивности входного потока. Также выведено количество отклоненных заявок при разных интенсивностях входного потока.