
- •Примеры расчетов согласно варианту
- •Краткие теоретические сведения
- •Результаты моделирования
- •Описание разработанной программы
- •Приложение а «Генерация абонентов, расчёт расстояния, потерь, скоростей»
- •Приложение б «Моделирование работы передачи данных, вычисление среднего объёма данных в буферах»
- •Приложение в «Вычисление средней скорости передачи двумя способами»
- •Приложение г «Реализация алгоритмов распределения ресурсов с вычислением приоритетов»
- •Приложение д «Запуск программы, построение графика»
Приложение в «Вычисление средней скорости передачи двумя способами»
def get_avg_R(slot_resource_blocks, subs, sub_idx, slot_idx):
packs_sum = 0
for i in range(max(0, slot_idx - 1 - y_slot), slot_idx):
sub_slot_res_block_cnt = slot_resource_blocks[i].count(sub_idx)
packs_sum += subs[sub_idx][i] * sub_slot_res_block_cnt
return packs_sum / y_slot
def get_avg_R_smooth(slot_resource_blocks, subs, sub_idx, slot_idx, sub_R_mean_list):
betta = 1 / y_slot
return (1 - betta) * sub_R_mean_list[sub_idx] + betta * sum(
[subs[sub_idx][slot_idx] for res_sub_idx in slot_resource_blocks[-1] if res_sub_idx == sub_idx]) / T_rb
Приложение г «Реализация алгоритмов распределения ресурсов с вычислением приоритетов»
# сортировка аб по приоритетам
def filter_and_sort(priorities, sub_with_full_buffer):
sorted_indices = np.argsort(priorities)
return [idx for idx in sorted_indices if idx in sub_with_full_buffer]
# Equal blind
def equal_blind(sub_R_mean_list, sub_with_full_buffer):
priorities = [1 / r if r > 0 else 1 for r in sub_R_mean_list]
return filter_and_sort(priorities, sub_with_full_buffer)
# Maximum throughput
def maximum_throughput(subs_slot_CC, sub_with_full_buffer):
return filter_and_sort(subs_slot_CC, sub_with_full_buffer)
# Proportional fair
def proportional_fair(subs_slot_CC, sub_R_mean_list, sub_with_full_buffer):
priorities = [cc / (rm if rm > 0 else 1) for cc, rm in zip(subs_slot_CC, sub_R_mean_list)]
return filter_and_sort(priorities, 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 equal_blind(sub_R_mean_list, sub_with_full_buffer)
case 'Maximum Throughput':
return maximum_throughput(subs_slot_CC, sub_with_full_buffer)
case 'Proportional fair':
return proportional_fair(subs_slot_CC, sub_R_mean_list, sub_with_full_buffer)
return 0
Приложение д «Запуск программы, построение графика»
def modeling():
plt.figure(figsize=(12, 6))
for subs_cnt in subs_list:
for lambd in lambd_list:
subs, packs = generate_ab(subs_cnt, lambd)
for alg in algoritm_list:
score = get_avg_score(subs, packs, alg)
key = f'{subs_cnt} {alg}'
if lambd == lambd_list[0]:
buffer_scores_by_alg[key] = []
buffer_scores_by_alg[key].append(score)
print(f'lam : {lambd}, метод :{alg}, абонентов : {subs_cnt}, V : {score}')
# Отрисовка графиков
for key, buffer_scores in buffer_scores_by_alg.items():
plt.plot(lambd_list, buffer_scores, marker='o', label=key)
plt.title(f"Зависимость среднего объёма данных в буферах от интенсивности потока (SLOTS={SLOTS})")
plt.xlabel("Интенсивность входного потока (λ)")
plt.ylabel("Средний суммарный объём в буферах")
plt.legend()
plt.grid()
plt.show()
modeling()