
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()