ЛР1 / МСРР ЛР1
.pdfПриложение А. Листинг программы
import numpy as np import pandas as pd
from matplotlib import pyplot as plt
def graph_location_subs_stations(subs_data):
'''Построение графика расположения станиций'''
fig, ax = plt.subplots(subplot_kw={'projection': 'polar'}) ax.scatter(subs_data['angle'], subs_data['distans']) ax.set_rmax(2.1)
plt.title(f'Распредление {len(subs_data)} абонентов', ) plt.show()
return 0
def subs_generator(R, n, Ptx, Pn, f, f0, h_bs, h_rx, S = 0):
'''Генерация списка расположения абоненских станций'''
subs = pd.DataFrame(columns=['distans', 'angle', 'x', 'y', 'CC'])
for _ in range(n): |
|
||
distans |
= np.sqrt(R**2 * np.random.random()) |
# Дистанция от |
|
абоненцкой до |
базовой станции |
|
|
angle |
= |
2 * np.pi * np.random.random() |
# Угол координат |
#Перевод в декартову систему координат x = distans * np.cos(angle)
y = distans * np.sin(angle)
#Уровень потерь
a = |
(1.1 * np.log10(f0) - 0.7) * h_rx - |
(1.56 * np.log10(f0) - 0.8) |
|
L = 46.3 + 33.9 * np.log10(f0) - 13.82 * np.log10(h_bs) - a + (44.9 - |
|||
6.55 * np.log10(h_rx)) * np.log10(distans) + S |
|
||
L = |
10**(L/10) |
|
|
Prx |
= Ptx/L |
# Мощьность |
сигнала |
SNR |
= Prx/Pn |
# Отношение |
сигнал/шум (SNR) |
CC = f * np.log2(1 + SNR) |
# Макс. пропускная способность канала связи |
||
(Сhannel Сapacity) |
|
|
subs = pd.concat([subs, pd.Series({'distans': distans, 'angle': angle, 'x': x, 'y': y, 'CC': CC}).to_frame().T], ignore_index=True)
return subs
def equal_blind(CC): |
|
|
'''Алгоритм ПРС - Равные скорости абонентам''' |
|
|
D = sum([c**-1 for c in CC])**-1 |
# Cкорость |
передачи для абонента |
return pd.Series({'algorithm': 'Equal Blind', 'count': len(CC), 'minD': D, 'meanD': D, 'sumD': D*len(CC)}).to_frame().T
def maximum_throughput(CC):
'''Алгоритм ПСС - Максимальная суммарная скорость передачи данных'''
equal_max = np.array(CC) == max(CC)
# Суммарная скорость передачи
D = [1/sum(equal_max) * c * equal_max[i] for i, c in enumerate(CC)]
return pd.Series({'algorithm': 'Maximum Throughput', 'count': len(CC), 'minD': min(D), 'meanD': np.mean(D), 'sumD': sum(D)}).to_frame().T
11
def proportion_fair(CC): |
|
|
'''Алгоритм ПРД |
- Равные доли выделенных ресурсов''' |
|
D = [cc/len(CC) |
for cc in CC] |
# Суммарная скорость передачи |
return pd.Series({'algorithm': 'Proportion Fair', 'count': len(CC), 'minD': min(D), 'meanD': np.mean(D), 'sumD': sum(D)}).to_frame().T
def plot_M_gradeD(D_grade):
'''Построение графиков измеренных величин'''
fig, axs = plt.subplots(1, 3) fig.suptitle('Графики зависимости оценок')
x_axis = 'count'
y_axis = ['minD', 'meanD', 'sumD'] x_lable = 'Кол-во абонентов'
y_lable = ['МО мин. скорости передачи', 'МО средней скорости передачи', 'МО макс. скорости передачи']
D_grade = D_grade.reset_index(level=['algorithm', 'count']) groups = D_grade.groupby('algorithm')
for idx in range(3): for n,g in groups:
axs[idx].plot(g[x_axis], g[y_axis[idx]], label=n) axs[idx].set_xlabel(x_lable) axs[idx].set_ylabel(y_lable[idx]) axs[idx].set_title(f'M[{y_axis[idx]}]') axs[idx].legend()
axs[idx].grid(True)
plt.show() return 0
def get_M_gradeD(R, Ptx, Pn, f, f0, h_bs, h_rx, N_test=100, N_subs_pow2=6, isPrintLocGraph=False):
'''Определение мат ожидания для суммарной скорости передачи'''
# Таблица результатов измерений
D_grade = pd.DataFrame(columns=['algorithm', 'count', 'minD', 'meanD',
'sumD']) |
|
|
|
for n in [2**i |
for i in range(N_subs_pow2+1)]: |
# Кол-во абонентов |
|
(1,2,4,8,16...) |
|
|
|
for _ in range(N_test): |
|
|
|
subs = subs_generator(R, n, Ptx, Pn, f, f0, h_bs, h_rx) |
|||
D_grade |
= pd.concat([D_grade, |
equal_blind(subs['CC'])], |
ignore_index=True)
D_grade = pd.concat([D_grade, maximum_throughput(subs['CC'])],
ignore_index=True) |
|
D_grade = pd.concat([D_grade, |
proportion_fair(subs['CC'])], |
ignore_index=True) |
|
if isPrintLocGraph: graph_location_subs_stations(subs)
D_grade.set_index(['algorithm', 'count'], inplace=True) D_grade = D_grade.groupby(level=['algorithm', 'count']).mean() plot_M_gradeD(D_grade)
return D_grade
def extra(R, Ptx, Pn, f, f0, h_bs, h_rx, N_test=100, N_subs_pow2=6):
'''Построение графика зависимости среднего минимального расстояния от БС до Аб и кол-ва абонентов'''
# Таблица результатов измерений
12
Data = pd.DataFrame(columns=['users_count', 'min_distans'])
for n in [2**i for i in range(N_subs_pow2+1)]: |
# Кол-во абонентов |
|
(1,2,4,8,16...) |
|
|
print(n) |
|
|
for _ in |
range(N_test): |
|
subs |
= subs_generator(R, n, Ptx, Pn, f, f0, h_bs, h_rx) |
Data = pd.concat([Data, pd.Series({'users_count': n, 'min_distans': min(subs['distans'])}).to_frame().T], ignore_index=True)
Data.set_index(['users_count'], inplace=True) Data = Data.groupby(level=['users_count']).mean() print(Data)
Data = Data.reset_index() plt.plot(Data['users_count'], Data['min_distans'])
plt.title('Графики зависимости среднего мин. расстояния АБ от БД\nв зависимости от кол-ва абонентов')
plt.xlabel('Кол-во абонентов') plt.ylabel('Сред. мин. раст. (км)') plt.show()
return 0
def main(): |
|
|
|
|
|
# Параметры варианта |
|
||||
R = 2 |
|
# Радиус |
|
|
|
Ptx = 40 |
|
# Мощность излучения БС |
|
||
f0 = |
900 |
|
# Частота БС |
|
|
f = 3 |
|
|
# Полоса |
пропускания канала связи |
|
kn = |
4 |
|
# Коэф. теплового шума приёмника |
|
|
T = 300 |
|
# Абсолютная температура |
|
||
h_bs |
= 100 |
# Высота |
БС |
|
|
h_rx |
= 5 |
|
# Высота |
точки приема |
|
Pn = |
f * 10**6 * T * |
1.38 * 10**-23 * kn |
# Мощность теплового шума |
||
# ------------------ |
|
|
|||
D_grade |
= |
get_M_gradeD(R, Ptx, Pn, f, |
f0, h_bs, h_rx, N_test=100, |
N_subs_pow2=6, isPrintLocGraph=True) print(D_grade)
#------------------
#Доп. задание
#Построить график зависимости среднего минимального расстояния от БС до Аб
икол-ва абонентов
extra(R, Ptx, Pn, f, f0, h_bs, h_rx, N_test=100, N_subs_pow2=6)
return 0
if __name__ == "__main__": main()
13