Скачиваний:
1
Добавлен:
03.06.2024
Размер:
102.01 Кб
Скачать

ГУАП

КАФЕДРА № 41

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

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

Старший преподаватель

Н.В. Апанасенко

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

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

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

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

АНАЛИЗ ЭЛЕМЕНТАРНОЙ СИСТЕМЫ МНОЖЕСТВЕННОГО ДОСТУПА

по курсу: ВЫЧИСЛИТЕЛЬНЫЕ СИСТЕМЫ, СЕТИ И ТЕЛЕКОММУНИКАЦИИ

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

СТУДЕНТ ГР. №

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

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

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

Цель работы: получение навыков моделирования алгоритмов случайного множественного доступа в системах передачи данных.

Теоретические сведения:

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

  1. Событие «успех» – в слоте сообщение передает сообщение один абонент, сообщение доставлено успешно, абонент покидает систему;

  2. Событие «конфликт» – в слоте сообщение передают два и более абонента, сообщение не доставлено, абоненты остаются в системе и осуществляют попытки передачи сообщения в следующих слотах.

  3. Событие «пусто» – в слоте никто не передает сообщение.

Количество абонентов в слоте 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)