
вычсист1
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
Старший преподаватель |
|
|
|
Н.В. Апанасенко |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ № 1 |
АНАЛИЗ ЭЛЕМЕНТАРНОЙ СИСТЕМЫ МНОЖЕСТВЕННОГО ДОСТУПА |
по курсу: ВЫЧИСЛИТЕЛЬНЫЕ СИСТЕМЫ, СЕТИ И ТЕЛЕКОММУНИКАЦИИ |
|
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
|
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2023
Цель работы: получение навыков моделирования алгоритмов случайного множественного доступа в системах передачи данных.
Теоретические сведения:
В данной лабораторной работе моделируется работа сети, в которой случайным образом определяется количество пришедших в какой-то промежуток времени пользователей и количество пользователей, передающих сообщения в данный интервал времени. В соответствии с алгоритмом возможны три события:
Событие «успех» – в слоте сообщение передает сообщение один абонент, сообщение доставлено успешно, абонент покидает систему;
Событие «конфликт» – в слоте сообщение передают два и более абонента, сообщение не доставлено, абоненты остаются в системе и осуществляют попытки передачи сообщения в следующих слотах.
Событие «пусто» – в слоте никто не передает сообщение.
Количество абонентов в слоте k+1 определяется как:
где:
Nk – количество активных абонентов в слоте с индексом k,
I – индикаторная функция.
Pk – количество абонентов, у которых появляются сообщения в слоте с индексом k,
Pk имеет пуассоновское распределение:
где
– интенсивность (среднее количество
абонентов, которое появляется в одном
слоте), принимает значения
(0.05,0.5) с шагом 0.05.
Rk распределено по биномиальному закону распределения:
где q=1-p, px – вероятность передачи сообщения каждым абонентом в слоте k.
Ход работы:
Марковская модель переходных состояний.
Для заданного алгоритма переходы в право осуществляются в любое состояние, однако обратные только на состояние назад. Цепь Маркова представлена на рисунке 1.
Рисунок 1 – Цепь Маркова по заданному алгоритму
Матрица переходных вероятностей:
Программа построения матрицы переходных вероятностей на языке Python представлена в приложении А. Пример матрицы доступа для значения =0.05 представлен на рисунке 2.
Рисунок 2 – Матрица переходных вероятностей для значения =0.05
Описание программы:
Сначала происходит обход всех значений лямбды с шагом 0,05. Для каждой лямбды случайным образом определяется количество пользователей, распределённое по закону Пуассона. Затем для каждого слота находится количество пользователей: количество пользователей в первом слоте равно первому значению из распределения Пуассона. С помощью биномиального распределения находится количество пользователей, собирающихся передать сообщение. Данный алгоритм является стабильным.
Вероятность передачи сообщения одним пользователем – 1/Nk, если Nk равно нулю, то количество пользователей, передающих сообщение тоже равно нулю.
Исходя из количества пользователей, передающих сообщение в слоте k, рассчитывается количество пользователей в слоте k+1. Если сообщение передаёт 1 пользователь, то количество пользователей определяется как Nk+1 = Nk + Pk -1, в остальных случаях – Nk+1 = Nk + Pk.
Среднее количество абонентов в системе N вычисляется для каждой лямбды путем деления суммы пользователей на каждом слоте на количество слотов.
Среднее количество слотов необходимое для передачи сообщения одним абонентом T вычисляется путем деления среднего количества абонентов на лямбда. (Приложение B).
По полученным значениям N и T строится графики N от λ, T от λ. Синяя линия – T, красная – N (Рисунок 2).
Рисунок 3 – График зависимости N от интенсивности входного потока
Рисунок 4 – График зависимости T от интенсивности входного потока
Из графика, представленного на рисунке 3, видно, что среднее количество абонентов начинает резко увеличиваться c λ = 0,35, что означает, что приходящих пользователей становится слишком много, чтобы обработать все запросы. Из-за этого увеличивается и время нахождения пользователей в системе (см. рисунок 4). В данной системе время нахождения пользователя в системе увеличивается более заметно, что свидетельствует о невозможности эффективной работы при увеличении числа пользователей.
Вывод: в ходе выполнения лабораторной работы была смоделирована сеть, которая может обрабатывать сообщения абонентов, только в том случае, если в определённый момент времени передаёт сообщения только один абонент.
Также из полученного графика стало понятно, что система работает нормально только с небольшим количеством пользователей в слоте, а после перехода определенного значения (λ = 0,35) система перестаёт справляться с обработкой сообщений, причём при λ > 0,35 время нахождения пользователей в системе начинает увеличивается стремительно, в то время как количество пользователей увеличивается постепенно.
Приложение А
from math import factorial, exp
from prettytable import PrettyTable
from numpy import zeros, arange
N_max = 6
# Функция для построения матрицы доступа для заданного lambda и N_max
def build_access_matrix(lambda_val, N_max):
access_matrix = zeros((N_max, N_max))
for Nk in range(N_max):
for Nk_plus_1 in range(N_max):
if Nk == 0:
Pk = 0
else:
Pk = 1 / Nk
if Nk_plus_1 == Nk + 1:
Rk = Pk - 1
else:
Rk = Pk
access_matrix[Nk][Nk_plus_1] = Rk
return access_matrix
lambda_array = arange(0.05, 0.51, 0.05)
for lambda_val in lambda_array:
access_matrix = build_access_matrix(lambda_val, N_max)
matrix_table = PrettyTable()
names = [' ']
for i in range(N_max):
names.append(f'N = {i}')
matrix_table.field_names = names
for i in range(N_max):
row = [f'N = {i}'] + [f'{value:.5f}' for value in access_matrix[i]]
matrix_table.add_row(row)
print("Матрица доступа для lambda =",lambda_val)
print(matrix_table)
print("\n")
Приложение B
from numpy import random, arange
import matplotlib.pyplot as plt
S = 100000 # Количество слотов
lambda_array = arange(0.05, 0.51, 0.05) # Массив значений уровня интенсивности
sum_users = 0 # Сумма количества пользователей в каждом слоте
Nk = 0 # Количество пользователей в слоте k
N_avg = [] # Массив для среднего количества абонентов
T_avg = [] # Массив для среднего времени передачи сообщения
def func(lambda_array, S, sum_users):
for x in lambda_array:
Pk = random.poisson(x, S) # Пуассоновское распределение
for i in range(S): # Обход каждого слота
if i == 0: # Присвоение первому слоту количества пользователей
Nk = Pk[i]
sum_users += Nk
else: # Обход остальных слотов
try: # Вычисление количества пользователей, собирающихся передать сообщение
Rk = random.binomial(Nk, 1 / Nk)
except: # Если Nk = 0, то никто не передаёт сообщение, Rk=0
Rk = 0
if Rk == 1:
Nk += Pk[i] - 1 # Успех Пользователь передал сообщение, покидает систему
sum_users += Nk
else:
Nk += Pk[i] # Конфликт и Пусто Никто не передал сообщение
sum_users += Nk
N_avg.append((1 / S) * sum_users)
T_avg.append(N_avg[-1] / x)
# Построение графика
plt.plot(lambda_array, N_avg, label="N", color="r")
plt.xlabel("λ")
plt.ylabel("Ср. Кол-во абонентов (N)")
plt.ylim(0, 50)
plt.xticks(lambda_array)
plt.grid()
plt.show()
print()
plt.plot(lambda_array, T_avg, label="T", color="b")
plt.xlabel("λ")
plt.ylabel("Ср. время нахождения в системе (T)")
plt.ylim(0, 50)
plt.xticks(lambda_array)
plt.grid()
plt.show()
func(lambda_array, S, sum_users)