ЛР3 / МСРР ЛР3
.pdfГУАП
КАФЕДРА №82
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
ассистент |
|
|
|
Н.В. Апанасенко |
|
|
|
|
|
|
|
|
|
|
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №3
СТРАТЕГИИ РАСПРЕДЕЛЕНИЯ РЕСУРСНЫХ БЛОКОВ В ЦЕНТРАЛИЗОВАННОЙ СЕТИ СО СЛУЧАЙНЫМ ТРАФИКОМ
по курсу: МОДЕЛИРОВАНИЕ СИСТЕМ РАСПРЕДЕЛЕНИЯ РЕСУРСОВ
РАБОТУ ВЫПОЛНИЛ СТУДЕНТ ГР. №
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2023
Цель работы
Получение навыков моделирования стандартных сценариев работы телекоммуникационных систем с топологией типа «звезда». Изучение свойств алгоритмов планирования ресурсов нисходящего кадра в подобных системах. Изучение стратегий распределения ресурсных блоков в централизованной сети со случайным трафиком
Индивидуальный вариант задания
Индивидуальный вариант номер 9 в соответствии с таблицей 1.
Таблица 1 – Индивидуальный вариант задания
№ |
Модель |
R, м |
Мощность, |
Частота, |
kn |
NRB |
|
распространения |
PTX, Вт |
f0, МГц |
|||||
|
|
|
|
||||
9 |
Окумура-Хата, |
2000 |
40 |
900 |
4 |
25 |
|
small city |
|||||||
|
|
|
|
|
|
Ход работы
1.Пример расчета параметров моделируемой системы
1.1.Расчет мощности теплового шума
= 3 106Гц 300 1.38 10−23Дж/К 4 = 4.97 10−14Вт
1.2.Расчет уровня потерь в канале связи (для конкретных абонентов)
Для нашей модели Окамура-Хаты:
Для нашего варианта “small city” (маленький город) S = 0.
Возьмем средние высоты для высот базовой станции и точки приема: hБС = 100 м, hRX = 5 м.
( ) = (1.1 lg(900МГц) − 0.7) 5м − (1.56 lg(900МГц) − 0.8) = 8.94
2
= 46.3 + 33.9 lg(900МГц) − 13.82 lg(100км) − 8.94
+[44.9 − 6.55 lg(5км)] lg(1км) + 0 = 109.9дБ
= 10230.8/10 = 9.7 1010
1.3.Расчет мощности сигнала, принятого абонентом
40Вт= 9.7 1010 ≈ 4,12 10−10Вт
1.4.Расчет отношение сигнал/шум
4,12 10−10Вт= 4.97 10−14Вт = 8.3 103
1.5.Расчет пропускной способности канала связи
С= 3 106Гц log2(1 + 8.3 103) = 39Мбит/с
2.Анализируемые алгоритмы распределения ресурсов
2.1.Equal blind
Данный алгоритм обеспечивает равные скорости между всеми абонентами. Доля ресурса времени, выделяемая каждому абоненту (выравнивает скорость)
|
|
|
|
|
−1 |
|
|
|
1 |
|
|
|
|
= |
(∑ −1) |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
=1 |
|
|
|
|
|
|
Скорость для абонента i может быть выражена как:
|
|
−1 |
|
|
|
|
|
|
|
|
|
|
1 |
|
|
= (∑ −1) |
= |
|
|
|
|
||
|
|
|
|
|
|||
|
|
|
|
|
|||
|
|
|
1 |
+ |
1 |
+. . . + |
1 |
|
=1 |
|
|||||
|
|
|
|
|
|||
|
|
|
1 |
|
2 |
|
|
2.2.Maximum Throughput
Данный алгоритм максимизирует суммарную скорость передачи. Доля ресурса времени, выделяемая каждому абоненту, находится как:
3
x = arg max C |
|
|
|||
|
|
|
i |
x |
=1 |
|
|
|
i |
||
|
|
i |
|
|
|
|
=1 |
|
|
||
|
|
|
|
2.3.Proportion Fair
Данный алгоритм выделяет равные доли ресурсов всем абонентам. Доля ресурса времени, выделяемая каждому абоненту, находится как:
|
|
1 |
|
|
|
|
|
|
|
= |
|
= |
|
|
|
||
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
Суммарная скорость: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
= ∑ = ∑ = |
∑ |
|||||||
|
||||||||
|
|
|
|
|
|
|
|
|
|
=1 |
=1 |
|
|
=1 |
|||
|
|
|
|
3.Пример сгенерированных расположений абонентов
Построили график случайного расположения абонентских приемных устройств относительно базовой станции для 64 абонентов в соответствии с рисунком
Рисунок 1 - Случайное расположение абонентских станций На рисунке 1 видно, абонентские станции распределены равномерно по площади
относительно базовой станции – это означает что генерации из расположения в программе работает корректно.
4
4.Описание разработанной программы
Список использованных переменных в соответствии с таблицей 2.
|
Таблица 1 – Таблица использованных переменных |
|
|
Название |
Описание |
R |
Радиус действия базовой станции в км |
Ptx |
Мощность излучения базовой станции |
f0 |
Частота излучения базовой станции |
f |
Полоза пропускания канала связи |
kn |
Коэффициент теплового шума приемника |
T |
Абсолютная температура |
h_bs |
Высота базовой станции |
h_rx |
Высота точки приема |
Pn |
Рассчитанная на основе параметров варианта мощность теплового |
|
шума |
buffer_grade |
Pandas.DataFrame с агрегированными результатами измерений объема |
|
буфера для различных значений интенсивности входного потока и |
|
различном кол-ве АБ в системе |
subs_list |
Список значений кол-ва моделируемых АБ |
lambd_step |
Шиг изменения значения интенсивности |
lambd_start |
Начальное значение интенсивности |
lambd_end |
Конечное значение интенсивности |
slot_cnt |
Кол-во моделируемых слотов для каждой итерации цикла с |
|
различными параметрами интенсивности входного потока и кол-ва АБ |
T_rb |
Длительность одного слота в секундах |
Полный листинг программы с комментариями в соответствии с Приложением А и
Приложением Б.
5
5.Результат моделирования
Построили график на основе агрегированных измерений для количества пользователей 2, 4, 8 и 16 в моделируемой системе, полученных на основе данных,
сгенерированных написанной нами программой.
Построили график зависимости среднего объема буфера системы от интенсивности входного потока для 3 алгоритмов работы с буфером соответствии с рисунком 2.
Рисунок 2 – График зависимости сред. суммарного объёма данных в буфере от интенсивности входного потока для разных алгоритмов работы с буфером
Изучив полученный график легко, можно заметить следующую закономерность,
которая вырежется в отличии пороговых значений интенсивности входного потока, при которых размер буфера системы начинает бесконечно расти. Соотнеся эти значения с количеством абонентов сразу видна зависимость – чем больше пользователей в системе,
тем меньшую интенсивность входного потока система может выдержать. Например, для 16
пользователей буфер начинает расти уже при интенсивности в 50, а для 4 это значение уже на порядок выше и приближается к 200.
Исследовав графики, построенные для разных алгоритмов и сравнив их друг с другом заметно что алгоритм Maximum Throughput справляется чуть лучше, данное поведение связанно с тем, что приоритет отдается АБ с наибольшей пропускной способностью что позволяет передавать больший объем сообщений за тоже время.
Алгоритмы Equal blind и Proportion Fair показывают очень близкие результаты оценок Данный график, полученный на основе созданной модели, позволяет
прогнозировать оптимальное количество пользователей для систем с разными интенсивностями входных потоков.
6
Вывод
В ходе данной лабораторной работы мы освоили моделировании стандартных сценариев работы телекоммуникационных систем с топологией типа «звезда». Изучили свойства алгоритмов планирования ресурсов нисходящего кадра в подобных системах.
Изучили стратегии распределения ресурсных блоков в централизованной сети со случайным трафиком.
Смоделированная нами модель позволили нам собрать данные о объеме буфера для разных значений интенсивности входного потока при моделировании работы системы распределения ресурсов. Полученные данные мы агрегировали и нашли средние значения для каждого из исследуемых количеств пользователей для разных значений интенсивности
иразными алгоритмами работы с буфером. По агрегированным данным построили график
ипроанализировали его. При анализе выявили достаточно логичную закономерность,
которая эмпирически была нами доказанна. Наблюдения показали, что для разных количеств пользователей пороговое значение, после которого буфер начинает бесконечно расти различно, и чем больше пользователей в системе, тем меньшую нагрузку входного потока она сможет обработать без переполнения буфера. Так же визуальный анализ построенных графиков показал небольшое превосходство алгоритма Maximum Throughput
в сравнении с алгоритмами Equal blind и Proportion Fair, данное поведение связано с тем что первый алгоритм отдает предпочтение АБ с наибольшей пропускной способностью, что позволяет передавать ему больший объем сообщений, два других алгоритма распределяют ресурсы между АБ равномерно в следствии чего средняя пропускная способность у них оказывается ниже.
7
Приложение А. Листинг программы основной файл
import numpy as np import pandas as pd
from matplotlib import pyplot as plt
from config import const_var
def get_corrected_distance(distance, base_station_height, sub_station_height):
'''Возвращает дистанцию от БС до АБ с учетом высот и расстояния между ними'''
return (distance**2 + abs(base_station_height - sub_station_height)**2)**.5
def subs_generator(subs_cnt):
'''Генерация пропускных способностей для всех абанентов в каждом
моделируемом |
слоте''' |
|
slot_cnt |
= const_var.get("slot_cnt") |
# Кол-во моделируемых слотов |
R |
= const_var.get("R") |
# Радиус действия базовой станции |
f0 |
= const_var.get("f0") |
# Частота БС |
Ptx |
= const_var.get("Ptx") |
# Мощность излучения БС |
DF |
= const_var.get("DF") |
# Полоса пропускания канала связи |
Pn |
= const_var.get("Pn") |
# Мощность теплового шума |
T_rb |
= const_var.get("T_rb") |
# Длительность слота |
h_bs |
= const_var.get("h_bs") |
# Высота базовой станции |
h_rx |
= const_var.get("h_rx") |
# Высота точки приема |
S |
= const_var.get("S") |
# small city (S = 0) / large city |
(S = 3) |
|
|
#Таблицы с пропускными способностями абонентов для каждого слота subs = pd.DataFrame(columns=range(slot_cnt))
#Список растояний до АБ в км
sub_distans = [get_corrected_distance(dist, h_bs, h_rx) / 1000 for dist in np.sqrt(np.random.uniform(0, R ** 2, subs_cnt))]
#print(sub_distans)
#Список случайных затуханий сигнала по модели Indoor Propagation Model
(ITU)
#L_list = 10 ** ((20 * np.log10(f0) + 29 * np.log10(sub_distans) + 0 - 28)
/10)
#Список случайных затуханий сигнала по модели Окамура-Хаты
a = |
(1.1 * np.log10(f0) - 0.7) |
* h_rx - (1.56 * np.log10(f0) - 0.8) |
|
L_list = 10**((46.3 + 33.9 * np.log10(f0) - 13.82 * np.log10(h_bs) - a + |
|||
(44.9 - |
6.55 * np.log10(h_rx)) * np.log10(sub_distans) + S) / 10) |
||
# Цикл по пользователям |
|
||
for |
sub_idx, L in enumerate(L_list): |
||
|
# Расчеты |
для slot_cnt слотов |
|
|
Prx = Ptx |
/ (L + np.random.normal(0, 1, slot_cnt)) # Расчёт мощности |
|
|
SNR = Prx |
/ Pn |
# Сигнал/шум |
|
CC = DF * |
np.log2(1 + SNR) |
# Макс пропускная способность канала связи |
#Запись расчитанных объемов сообщения которое
#может быть переданно из буфера на АБ для каждого слота subs.loc['sub_' + str(sub_idx)] = CC * T_rb
return subs
8
def get_R_mean(slot_resource_blocks, |
subs, sub_idx, slot_idx): |
|
'''Возвращает среднюю скорость с |
которой АБ скачивал данные''' |
|
cd_slot_cnt = const_var.get("cooldown_slot_count") |
# Кол-во слотов |
|
перерасчета, средней скорости |
|
|
Nrb = const_var.get("Nrb") # Кол-во ресурсных блоков |
|
#Объём данных, который передан абоненту sub_idx packs_sum = 0
#Цикл по слотам
for slot_idx in range(max(0, slot_idx - 1 - cd_slot_cnt), slot_idx):
#Кол-во ресурсных блоков в слоте slot_idx, которые пренадлежат АБ с индексом sub_idx
sub_slot_res_block_cnt = 0
#Цикл по ресурсным блокам
for res_sub_idx in slot_resource_blocks[slot_idx]:
# Проверка принадлежности ресурсного блока в слоте АБ sub_idx if res_sub_idx == sub_idx:
sub_slot_res_block_cnt += 1
# Находим объём данных, который передан абоненту sub_idx в ресурсных блоках в слоте slot_idx
packs_sum += subs[slot_idx][sub_idx] * sub_slot_res_block_cnt return packs_sum / cd_slot_cnt
def get_R_mean_smoothing_filter(slot_resource_blocks, subs, sub_idx, slot_idx, sub_R_mean_list):
'''Возвращает среднюю скорость с которой АБ скачивал данные методом
сглаживающего фильтра''' |
|
|
|
|
|
|
|||
cd_slot_cnt = const_var.get("cooldown_slot_count") |
# |
Кол-во слотов |
|||||||
перерасчета, средней скорости |
|
|
|
|
|
|
|||
T_rb = const_var.get("T_rb") |
|
# Длительность слота |
|
||||||
betta |
|
= 1 / cd_slot_cnt |
# Параметр сглаживающего фильтра |
|
|
||||
return |
(1 |
- |
betta) |
* |
sub_R_mean_list[sub_idx] |
+ |
betta |
* |
sum([subs[slot_idx][sub_idx] for res_sub_idx in slot_resource_blocks[-1] if res_sub_idx == sub_idx]) / T_rb
def get_sub_index_by_equa_blind(sub_R_mean_list, sub_with_full_buffer):
'''
Возвращает индекс АБ для алгоритма Proportional fair, который обеспечивает равные скорости между всеми абонентами
'''
# Расчет приоритетов и возвращение максимального
subs_priority = [1 / sub_R_mean if sub_R_mean > 0 else 1 for sub_R_mean in sub_R_mean_list]
#Получаем список отсортированных индексов АБ по приоритету subs_priority_idx = np.argsort(subs_priority)
#Возвращаем список тех у кого не пустой буфер
return [sub_idx for sub_idx in subs_priority_idx if sub_idx in sub_with_full_buffer]
def get_sub_index_by_maximum_throughput(subs_slot_CC, sub_with_full_buffer):
'''
Возвращает индекс АБ для алгоритма Maximum Throughput,
9
который максимизирует суммарную скорость передачи базовой станцией
'''
#Получаем список отсортированных индексов АБ по приоритету subs_priority_idx = np.argsort(subs_slot_CC)
#Возвращаем список тех у кого не пустой буфер
return [sub_idx for sub_idx in subs_priority_idx if sub_idx in sub_with_full_buffer]
def get_sub_index_by_proportional_fair(subs_slot_CC, sub_R_mean_list, sub_with_full_buffer):
'''
Возвращает индекс АБ для алгоритма Proportional fair, который выделяет равные доли ресурсов всем абонентам
'''
# Расчет приоритетов и возвращение максимального
subs_priority = [sub_slot_CC / (sub_R_mean if sub_R_mean > 0 else 1) for sub_slot_CC, sub_R_mean in zip(subs_slot_CC, sub_R_mean_list)]
#Получаем список отсортированных индексов АБ по приоритету subs_priority_idx = np.argsort(subs_priority)
#Возвращаем список тех у кого не пустой буфер
|
return |
[sub_idx for |
sub_idx in |
subs_priority_idx |
if sub_idx in |
|
sub_with_full_buffer] |
|
|
|
|
||
def |
get_sub_index(subs_slot_CC, |
algorithm, |
sub_with_full_buffer, |
|||
sub_R_mean_list): |
|
|
|
|
||
|
match algorithm: |
|
|
|
|
|
|
case 'Equal Blind': |
|
|
|
|
|
|
|
return |
get_sub_index_by_equa_blind(sub_R_mean_list, |
|||
sub_with_full_buffer) |
|
|
|
|
||
|
case 'Maximum Throughput': |
|
|
|
||
|
|
return |
get_sub_index_by_maximum_throughput(subs_slot_CC, |
|||
sub_with_full_buffer) |
|
|
|
|
||
|
case 'Proportional fair': |
|
|
|
||
|
|
return |
get_sub_index_by_proportional_fair(subs_slot_CC, |
|||
sub_R_mean_list, sub_with_full_buffer) |
|
|
|
|||
|
return 0 |
|
|
|
|
|
def get_mean_buffer_score(subs, p, algorithm = 'Maximum Throughput'): |
||||||
|
'''Возвращает оценку среднего объема буффера''' |
|
|
|||
|
V |
= const_var.get("V") |
|
# Объем передоваемого |
||
сообщения |
|
|
|
|
|
|
|
Nrb |
= const_var.get("Nrb") |
|
# |
Кол-во ресурсных |
|
блоков |
|
|
|
|
|
|
|
slot_cnt |
= const_var.get("slot_cnt") |
# Кол-во слотов |
|||
|
subs_cnt |
= len(subs.index) |
|
# Кол-во пользователей |
||
|
# Список генерация пакетов входящего потока |
|
|
|||
|
packs = |
pd.DataFrame(columns=subs.columns, data=[(np.random.geometric(p, |
||||
size = slot_cnt) - 1) * V for _ in range(subs_cnt)]) |
|
|
||||
|
# |
packs |
= |
pd.DataFrame(columns=subs.columns, |
||
data=[np.random.exponential(1/lambd) * V for _ in range(subs_cnt)]) |
||||||
|
# print('packs', packs) |
# ОТЛАДОЧНАЯ ПЕЧАТЬ |
|
|
# Записываем пакеты пришедшие в первом слоте в буффер
10