
- •Пример расчёта параметров моделируемой системы
- •Результаты моделирования
- •3 Описание разработанной программы
- •Что такое нисходящий канал связи в телекоммуникационных сетях?
- •2) Какой из изученных алгоритмов распределения ресурсов оптимален для передачи данных по заданному варианту базовой станции? Почему?
- •Приложение а «Генерация абонентов и отображение их положения»
- •Приложение б «Построение графиков распределения аб»
- •Приложение в «Реализация алгоритмов распределения ресурсов»
- •Приложение г «Вычисление оценок работы для каждого алгоритма»
- •Приложение д «Построение графиков оценок алгоритмов и запуск программы»
Приложение б «Построение графиков распределения аб»
# построение гистограммы и эмпирической функции распределения положения абонентов
def plot_ab_histogram(subs):
# углы расположения АБ
angles = [s['angle'] for s in subs]
# построение гистограммы распределения
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.hist(angles, bins=30, range=(0, 2 * np.pi), edgecolor='black')
plt.title('Гистограмма распределения абонентов')
plt.xlabel('Угол (радианы)')
plt.ylabel('Плотность вероятности')
# построение эмпирической функции распределения
plt.subplot(1, 2, 2)
sorted_angles = np.sort(angles)
y_vals = np.arange(1, len(angles) + 1) / len(angles)
plt.step(sorted_angles, y_vals, where='post', color='b')
plt.title('Эмпирическая функция распределения')
plt.xlabel('Угол (радианы)')
plt.tight_layout()
plt.show()
Приложение в «Реализация алгоритмов распределения ресурсов»
# равные скорости
def equal_blind(CC_list):
D = 1 / sum(1 / c for c in CC_list)
return {'algorithm': 'Equal Blind', 'minD': D, 'meanD': D, 'sumD': D * len(CC_list)}
# максимальная суммарная скорость
def maximum_throughput(CC_list):
max_CC = max(CC_list)
active_count = CC_list.count(max_CC)
D_list = [(c if c == max_CC else 0) / active_count for c in CC_list]
return {'algorithm': 'Maximum Throughput', 'minD': min(D_list), 'meanD': sum(D_list) / len(D_list), 'sumD': sum(D_list)}
# равные нагрузки
def proportion_fair(CC_list):
D_list = [c / len(CC_list) for c in CC_list]
return {'algorithm': 'Proportion Fair', 'minD': min(D_list), 'meanD': sum(D_list) / len(D_list), 'sumD': sum(D_list)}
Приложение г «Вычисление оценок работы для каждого алгоритма»
# прогон алгоритмов
def modulate(n_ab, tests):
results = {}
# перебор N АБ
for n in n_ab:
calculations = {'Equal Blind': [], 'Maximum Throughput': [], 'Proportion Fair': []}
# 100 прогонов
for _ in range(tests):
subs = generate_ab(n) # генерация n АБ
CC_list = [s['CC'] for s in subs] # получение пропускных спос. для АБ
# перебор алгоритмов
for algo_func in [equal_blind, maximum_throughput, proportion_fair]:
# вычисление оценок
result = algo_func(CC_list)
calculations[result['algorithm']].append(result) # под именем алг. записаны результаты
# вычисление средних оценок для 100 прогонов
for algo_name in calculations:
avg = average_val(calculations[algo_name])
# пустой массив для результатов ср. оценок для каждого алгоритма
if algo_name not in results:
results[algo_name] = {'count': [], 'minD': [], 'meanD': [], 'sumD': []}
# запись результатов
results[algo_name]['count'].append(n)
results[algo_name]['minD'].append(avg['minD'])
results[algo_name]['meanD'].append(avg['meanD'])
results[algo_name]['sumD'].append(avg['sumD'])
return results
# вычисление средних значений
def average_val(list_of_dicts):
keys = ['minD', 'meanD', 'sumD']
result = {}
# перебор оценок
for key in keys:
total = 0
# перебор вычислений
for d in list_of_dicts:
# суммирование
total += d[key]
# вычисление ср. значения
result[key] = total / len(list_of_dicts)
return result