Приложение а
import numpy as np
import matplotlib.pyplot as plt
R = 60 # Радиус работы БС (км)
Ptx = 0.01 # Мощность излучаемого сигнала (Вт)
F0 = 4000 # Частота БС (МГц)
DF = 180 * 10**3 # Полоса пропускания канала связи (Гц)
KN = 3 # Коэф. теплового шума приёмника
K = 1.38 * 10 ** (-23) # Постоянная Больцмана
T = 300 # Абсолютная температура
V = 8 * 1024 # Объем данных содержащихся в одном пакете равный 1 кбайт
t = 5*10**-4 # Время 1 слота 0.5 мс
def random_user(N):
# Генерация случайных велечин равномерно распределнных на радиусе
distance = np.sqrt(np.random.uniform(0, R ** 2, N)) # Дальность до абонента
return distance
def generate_points(N):
distances = random_user(N)
angles = np.random.uniform(0, 2 * np.pi, N)
x = distances * np.cos(angles)
y = distances * np.sin(angles)
return x, y
# Рассчет пропускной способности канала связи и объема информации, которая может быть передана АБ в слоте
def kanal(distance):
Pn = DF * T * K * KN #вычисление мощности шума
N = 22 # Коэффициент потерь мощности от расстояния
Pfn = 0 #коэффициент потерь проникновения через пол или стены
Li = 20 * np.log10(F0) + N * np.log10(distance) + Pfn - 28 # Затухание сигнала по модели ITU
xik = np.random.normal(0, 1) # Случайная нормальная величина с математическим ожиданием 0 и среднеквадратическим отклонением 1
Lik = Li + xik # Значение потерь в слоте
Lik = 10**(Lik/10) # Перевод в разы
Prx = Ptx / Lik # расчёт мощности приянтого сигнала
SNR = Prx / Pn # отношение сигнал/шум
C = DF * np.log2(1+SNR) # пропускная способность канала связи
return (C*t) #Vik объем данных, который может быть передан абоненту i в слоте с индексом k
# Обновление объема буфера для определенного абонента
# check=True загрузка в буферы на БС
# check=False отправка абоненту
def bufferReload(add, buffer, check=False, number=None):
if check:
return [buffer[i] + add[i] for i in range(len(buffer))]
else:
buffer[number] = buffer[number] - add
if buffer[number] <= 0:
buffer[number] = 0
return buffer
# Загрузка пакетов в буферы на БС
def stationDownload(countAB, prop, buffer):
dataSize = [(np.random.geometric(prop) - 1) * V for user in range(countAB)]
buffer = bufferReload(dataSize, buffer, True)
return buffer
# Отправка пакетов абоненту
def stationUpload(users, number, buffer):
dataSize = kanal(users)
if dataSize[number] == 0: # Если нет данных для этого абонента
return buffer # Пропускаем передачу данных, возвращаем буфер без изменений
buffer = bufferReload(dataSize[number], buffer, False, number)
return buffer
def stationUploadOptimised(users, abonent_number, buffer):
dataSize = kanal(users)
if dataSize[abonent_number] == 0:
return buffer # Передаем буфер без изменений, если нет данных для абонента
buffer = bufferReload(dataSize[abonent_number], buffer, False, abonent_number)
return buffer
# Стартовая функция
def main():
lambda_array=np.arange(1, 155, 2) # Массив со значениями лямбда (начало, конец, шаг)
all_x = []
all_y = []
plt.figure(figsize=(15, 8))
for index, countAB in enumerate( [8, 16, 64]): # Цикл по количеству пользователей
buffer_all = [0 for user in range(countAB)]# Создание буфера для каждого абонента
buffer = [0 for user in range(countAB)] # Создание буфера для каждого абонента
users = random_user(countAB) # Генерация расстояний пользователей
avgBuffers = [] # Расчет среднего размера буфера
for lambd in lambda_array: # Цикл по интенсивности входного потока
buffer_list = [] # Сумарное значение буфера
lambda_slot = lambd * t
prob = 1 / (lambda_slot + 1) # Вероятность успеха
for slot in range(10 ** 3): # Цикл по слотам
