Скачиваний:
0
Добавлен:
04.06.2024
Размер:
131.5 Кб
Скачать

If not slot: # Если слот первый

buffer = stationDownload(countAB, prob, buffer) # Загружаем первый поток данных на БС

buffer_list += [sum(buffer)]

continue

buffer_all = buffer

# slot%countAB определяет с каким абонентом в данном слоте ведется работа

buffer_all = stationUpload(users, (slot % countAB), buffer_all) # Отправка пакетов абоненту

buffer_all = buffer

buffer = stationDownload(countAB, prob, buffer_all)# Расчет скачивания

# В конце слота складываем объем данных во всех буферах

buffer_list += [sum(buffer)]

# Когда прошли все слоты, находим средний объем суммы всех буферов на текущей лямбде

avgBuffers += [np.mean(buffer_list)]

# Когда собрали данные по каждой лямбде для текущего числа пользователей, строим график

plt.subplot(1, 2, 1)

plt.plot(lambda_array, avgBuffers, label='N = {}'.format(countAB))

x, y = generate_points(countAB)

all_x.append(x)

all_y.append(y)

plt.ylim(0, 10 ** 7)

plt.grid()

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

plt.ylabel('Средн. суммарный объём данных в буфере (Кбайт)')

plt.legend(loc='upper left')

def main_optimised():

lambda_array = np.arange(1, 155, 2) # Массив со значениями лямбда (начало, конец, шаг)

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) # Вероятность успеха

reciever = 0 # Принимающий пользователь

for slot in range(10 ** 3): # Цикл по слотам

if not slot: # Если слот первый

buffer = stationDownload(countAB, prob, buffer) # Расчет скачивания

buffer_list += [sum(buffer)]

continue

buffer_all = buffer

# Проверяем есть ли данные для передачи а+боненту с индексом reciever

if buffer_all[reciever] == 0:

next_receiver = (reciever + 1) % countAB # Находим следующего абонента для передачи

while next_receiver != reciever: # Пока не вернемся к начальному абоненту

if buffer_all[next_receiver] != 0: # Если у абонента есть данные

break # Прерываем цикл, нашли следующего абонента для передачи

next_receiver = (next_receiver + 1) % countAB # Переходим к следующему абоненту

reciever = next_receiver # Обновляем получателя на найденного абонента

buffer_all = stationUploadOptimised(users, reciever, buffer_all)

buffer = stationDownload(countAB, prob, buffer_all) # Отправка

reciever += 1 # Переход на следующего пользователя

if reciever > countAB - 1:

reciever = 0 # Если мы вышли на N+1, то работаем с нулевым абонентом

buffer_list += [sum(buffer)] # В конце слота складываем объем данных во всех буферах

avgBuffers += [np.mean(buffer_list)] # Средний объем суммы всех буферов на текущей лямбде

plt.plot(lambda_array, avgBuffers, label='N = {}'.format(countAB)) # Строим график для каждого числа пользователей

plt.ylim(0, 10 ** 7) # Масштаб графика

plt.grid()

plt.title('Оптимизированная модель')

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

plt.ylabel('Средн. суммарный объём данных в буфере (бит)')

plt.legend(loc='right')

plt.show()

main()

main_optimised()

Соседние файлы в предмете Вычислительные системы, сети и телекоммуникации