Скачиваний:
0
Добавлен:
27.08.2024
Размер:
16.42 Кб
Скачать
import math
import numpy as np
from matplotlib import pyplot as plt
import random
#условия по варианту
#Температура если константой. Это 10 по цельсию (+273)
T_defolt=283
#Высота базовой станции (Пусть будет 30метров?)
h_b_s=30
#коэффициент теплового шума приемника
k_n=4
#Частота
f_0=900
#Пощность сигнала
p_t_x=40
#радиус По методе в метрах, но прошлую ж по км делала. Но если чисто 2, то
там слишком больше скорости получаются
r=2
#Число слотов(УВЕЛИЧИТЬ ДО В ПЯТОЙ)
#Увеличить не вариант – он десять минут уж считает для двух АБ и даже до
половины не дошел
#Будет до сотни.
n_slot=10**2
#Число ресурсных блоков - строк
n_r_v=25
#Полоса пропускания канала
delta_f=180
S=0
#длительность слота
time_slot=0.5
#Функция принимает на вход число абонентов
#расчитывает скорость для каждой части матрицы\распределяет абонентов
def return_C(N):
 #Случайным образом распределяем абонентов на разном R
 #Чтобы распределялись не кучками, применяем равномерное случаное
распределение
 mass_r=np.random.uniform(0, r, N).tolist()
 #определяем значение высоты (метры)
 mass_h_t_p=(np.random.uniform(0, 1, N)*h_b_s).tolist()
 #определяем расстояние (декартовое, изначальные координаыт 0,h_b_s
километры)
 mass_d=[]
 x=[]
 y=[]
 for i in range(len(mass_r)):
 mass_d.append(math.sqrt((mass_r[i]-0)**2+(mass_h_t_p[i]*10**(-3)-
h_b_s*10**(-3))**2))
 #чисто для графика ищем угл
 #angle=2*math.pi*random.random()
 #x.append(mass_d[i] * math.cos(angle))
 #y.append(mass_d[i] * math.sin(angle))
 #строим график кружочка с точками
 #fig, ax = plt.subplots()
 #ax.add_patch(plt.Circle((0,0), r, fill=False))
 #plt.scatter(x,y)
 #plt.title('Распределение абонентов вокруг базовой станции')
 #plt.xlabel('x')
 #plt.ylabel('y')
8
 #plt.show()
 #считаем скорость
 '''
 так заполнение
 t=[[[1,2,],
 [4,5,]]
 ,[[6,7],
 [8,9]]]
 print(t[1][1][1])
 len(t)- сколько масивов
 len(t[i]) - строк в массиве
 len(t[][])- сколько в строке
 '''
 mass_all_c=[]
 for i in range(N):
 #расчитываем основное l для абонента
 a_h=(1.1*math.log10(f_0)-0.7)*mass_h_t_p[i]-(1.56*math.log10(f_0)-
0.8)
 L=10**((46.3+33.9*math.log10(f_0)-13.82*math.log10(h_b_s)-a_h+(44.9-
6.55*math.log10(mass_h_t_p[i]))*math.log10(mass_d[i])+S)/10)
 mass_c=[]
 mass_une_c=[]
 #Для каждой из 25
 for j in range(n_r_v):
 #ДЛя каждого из 10 000 столбцов
 #расчитываем основное плюс случайное
 #мощность сигнала
 p_r_x=p_t_x/(L*abs(np.random.normal(0, 1,n_slot))) #РЫБА Тут по
идее надо не умножать, а прибавлять, но если это делать то числа одинаковые
выходят
 #Мощность теплового шума
 k=1.38*10**(-23)
 T=T_defolt
 p_n=delta_f*T*k*k_n
 #Отнешение сигнал шум
 snr=p_r_x/p_n
 #Пропускная способность сигнала
 #Числа разные, пусть и отличаются минимально(
 #разу тут переводим в Кбайт
 mass_c.append((delta_f*np.log2(1+snr))*128)
 mass_all_c.append(mass_c)
 return(mass_all_c)
#Функция расчитает какой объем инфы поступает
#Чтоб проще было, я подразумеваю, что в этом массиве данные которые
#пришли на ПРОШЛЫЙ шаге для отправки на ЭТОМ шаге
def return_p_v(N,liamda):
 number_data_packets=[]
 #генерируем сколько каждому пришло d Кбайтах
 for i in range(N):
 number_data_packets.append(np.random.poisson(liamda,size=n_slot))
 return (number_data_packets)
#Функци считает методом сглаживания среднию скорость с которой аб скачивал
#В первом(и втором) столбце распределение будет случайнм
#Во втором по случайным реально будет посчитать V
#В третем уже начнется полный просчет
#Тут С это чисто значение скоростей на ПРОШЛЫЙ стобец для всех АБ вид -
[[Вспе для АБ_1],[]]
#Второе – информация о том как в прошлом столбце распределилась между АБ
слоты
#У меня в виде списка, где 0 - первый занял, 1 второй и т.д.
9
#Третье просто последний массив со средними скоростями(для первого столбца
там все 0)
def return_r(C,etap,b_last_mass,r_last_mass):
 #Вытаскиваем столбцы каждого из АБ
 C_past=[]
 for i in range(len(C)):
 C_une=[]
 #Идем по строкам для АБ
 for j in range(n_r_v):
 C_une.append(C[i][j][etap])
 C_past.append(C_une)
 #второе в значении это число слотов по которым расчитваем
 #для второго там 1
 if etap!=1:
 beta=1/2
 else:
 beta=1/1
 #Для каждого абонента находим скорость
 r_new_mass=[]
 for i in range(len(C)):
 V_maybe=0
 #Считаем сколько МОГЛО быть отправлено АБ по тому как занято на
ПРОШЛОМ ВСЕГО
 for j in range(len(b_last_mass)):
 if b_last_mass[j]==i+1:
 V_maybe=C_past[i][j]*time_slot+V_maybe
 t=(1-beta)*r_last_mass[i]+beta*(V_maybe/time_slot)
 r_new_mass.append(t)
 return(r_new_mass)
#Данный алгоритм выравнивает среднюю скорость закачки
def equal_blind(C,P_value):
 P_value=np.array(P_value).tolist()
 b_last=[]
 r_last=[]
 #Это будет повторятся для всех столбцов
 for i in range(n_slot):
 prior=[]
 #Это для прошлого списка того кто что занял
 #ВНИМАНИЕ тут 0 это ничто а первый 1
 #это для прошлых средних скоростей
 #Если это перый слот, то случайно распределеяем места, а скорости АБ
будут 0
 if i==0:
 #Тут надо так распределить, чтоб все учавстовали. Буду тупо по
очереди
 #1 это первый, помни
 while len(b_last)<n_r_v:
 for k in range(len(C)):
 b_last.append(k+1)
 while len(b_last)>n_r_v:
 b_last.pop()
 for k in range(len(C)):
 r_last.append(0)
 #Перетаскиваем из буфера все в следующий
 P_value[k][i+1]=P_value[k][i+1]+P_value[k][i]
 P_value[k][i]=0

 #Если второй, то считать по формуле
 else:
 #Получить нужно назад среднюю скорость
 #Вроде получается, но чет значение высокое, поэтому РЫБА
 r_new=return_r(C,i,b_last,r_last)
10
 b_last=[]
 r_last=r_new
 #По формуле определяем у кого какой приоритет
 for j in range(len(C)):
 prior.append(1/r_new[j])
 #идем по каждой строке
 for j in range(n_r_v):
 if max(prior)==0:
 b_last.append(0)
break
 #Находим кто из абонентов первый
 max_index=prior.index(max(prior))
 #Чистим буфер пока он не станет пустым(если?)
 #указываем кто в этой строке
 P_value[max_index][i]=P_value[max_index][i]-
C[max_index][j][i]*time_slot
 if P_value[max_index][i]<=0:
 P_value[max_index][i]=0
prior[max_index]=0
 b_last.append(max_index+1)
 for k in range(len(C)):
 #Перетаскиваем из буфера все в следующий
 if i!=n_slot-1:
 P_value[k][i+1]=P_value[k][i+1]+P_value[k][i]
P_value[k][i]=0
 D=np.mean(P_value)
 if D<0:
 t=1
 return(D)
#Алгоритм MT «отдает» ресурсный блок тому пользователю, у которого
максимальна пропускная канала связи
def maximum_throughput(C,P_value):
 P_value=np.array(P_value).tolist()
 D_all=[]
 r=np.array(P_value)
 r_2=P_value[1]
 #Просто проходимся по массиву С и ищем маскимумы
 for i in range(n_slot):
 b_une=[]
 for j in range(n_r_v):
 max_C_old=-1
 # АБ с max скоростью в этом слоте и на который есть инфа в
буфере
 for k in range(len(C)):
 if (max_C_old<C[k][j][i])and(P_value[k][i]>0):
 max_index=k
max_C_old=C[k][j][i]
 #если уже все АБ получили все что надо то надо к новому слоту
переходить
 if max_C_old==-1:
 break
 #знаем АБ с макисмальной скоростью тут. работаем с его буфером
 #Если не первый слот, то нужно прибавить что осталось со старых
 if i!=0:

P_value[max_index][i]=P_value[max_index][i]+P_value[max_index][i-1]
 P_value[max_index][i]=abs(P_value[max_index][i])
 if max_C_old*time_slot>P_value[max_index][i]:
 P_value[max_index][i]=0
 else:
 P_value[max_index][i]=P_value[max_index][i]-
max_C_old*time_slot
11
 #Нужно пополнить буфер для тех кто дальше, если не освободились
 if i!=n_slot-1:
 for j in range(len(P_value)):
 P_value[j][i+1]=P_value[j][i]+P_value[j][i+1]
 P_value[j][i]=0
 #После всего нужно вернуть среднее число в буфере по последним строкам
 D=np.mean(P_value)
 if D<0:
 t=1
 return(D)
# выравнивание ресурсов, отдаваемых пользователям
#В осноном код будет из первого алгоритма, так что коментарии могут врать
def proportional_fair(C,P_value):
 b_last=[]
 r_last=[]
 P_value=np.array(P_value).tolist()
 #Это будет повторятся для всех столбцов
 for i in range(n_slot):
 prior_all=[]
 #Это для прошлого списка того кто что занял
 #ВНИМАНИЕ тут 0 это ничто а первый 1
 #это для прошлых средних скоростей
 #Если это перый слот, то случайно распределеяем места, а скорости АБ
будут 0
 if i==0:
 #Тут надо так распределить, чтоб все учавстовали. Буду тупо по
очереди
 #1 это первый, помни
 while len(b_last)<n_r_v:
 for k in range(len(C)):
 b_last.append(k+1)
 while len(b_last)>n_r_v:
 b_last.pop()
 for k in range(len(C)):
 r_last.append(0)
 #Перетаскиваем из буфера все в следующий
 P_value[k][i+1]=P_value[k][i+1]+P_value[k][i]
 P_value[k][i]=0

 #Если второй, то считать по формуле
 else:
 #Получить нужно назад среднюю скорость
 #Вроде получается, но чет значение высокое, поэтому РЫБА
 r_new=return_r(C,i,b_last,r_last)
 b_last=[]
 r_last=r_new
 #Вот тут уже прям третий третий
 #По формуле определяем у кого какой приоритет
 #Считаем сколько будет на Каждую строку
 for j in range(len(C)):
 prior_une=[]
 for k in range(n_r_v):
 prior_une.append(C[j][k][i]/r_new[j])
 prior_all.append(prior_une)
 #идем по каждой строке
 for j in range(n_r_v):
 #Смотрим у кого приоритет в этой строке
 max_value=-1
 for k in range(len(prior_all)):
 if prior_all[k][j]>max_value:
 max_index=k
12
 max_value=prior_all[k][j]
 if max_value==0:
 b_last.append(0)
break
 #Чистим буфер пока он не станет пустым(если?)
 #указываем кто в этой строке
 P_value[max_index][i]=P_value[max_index][i]-
C[max_index][j][i]*time_slot
 if P_value[max_index][i]<=0:
 P_value[max_index][i]=0
#Забираем весь приоритет у получившего все АБ
for k in range(n_r_v):
 prior_all[max_index][k]=0
 b_last.append(max_index+1)
 for k in range(len(C)):
 #Перетаскиваем из буфера все в следующий
 if i ==n_slot-2:
 t=1
 if i!=n_slot-1:
 P_value[k][i+1]=P_value[k][i+1]+P_value[k][i]
P_value[k][i]=0
 if i==n_slot-1:
 break
 D=np.mean(P_value)
 if D>0:
 t=1
 return D
#главная функция для вызова остальных для работы по программе
def main(N=[2,4,8,16],liamda_min=5*10**4,liamds_max=5*10**6,etap=5*10**4):
 #По итогу должно получится для трех алгаритмов
 #наборы из среднего в буфере для каждого значения числа абонентов
 D_mean_e_q_all=[]
 D_mean_m_t_all=[]
 D_mean_p_f_all=[]
 #Наборы пополняются для каждого числа абонентов
 for i in range(len(N)):
 D_mean_e_q=[]
 D_mean_m_t=[]
 D_m_t=[]
 D_mean_p_f=[]
 x=[]
 #дальше все дложно быть для каждой из частот
 for j in range(liamda_min,liamds_max,etap):
 x.append(j)
 D_m_t=[]
 D_e_q=[]
 D_p_f=[]
 #получаем обем инфы, которая в приходит к КОНЦУ каждой
столбца(слота)
 #Короче отмена. Будет это та инфа, которая пришла ранее на
выполнение на этом слоте
 #Так по логичнее и нет последнего не пойми за чем существующего
 #Вообще, тут получаем слолько в кбайт получили
 #Но С у нас в Мбит, поэтому переводятся в кбайты в основной
функции
 #Дальше идут в работу каждый из алгаритмов
 for k in range(10):
 C=return_C(N[i])
 P_value=return_p_v(N[i],j)
 #самый понятный алгорим
 D_m_t.append(maximum_throughput(C,P_value))
 #Второй
13
 D_e_q.append(equal_blind(C,P_value))
 #Третий
 D_p_f.append(proportional_fair(C,P_value))
 D_mean_m_t.append(np.mean(D_m_t))
 D_mean_e_q.append(np.mean(D_e_q))
 D_mean_p_f.append(np.mean(D_p_f))
 print('Готово для ',N[i])
 D_mean_m_t_all.append(D_mean_m_t)
 D_mean_e_q_all.append(D_mean_e_q)
 D_mean_p_f_all.append(D_mean_p_f)
 legend=[]
 for i in range(len(D_mean_p_f_all)):
 plt.plot(x,D_mean_p_f_all[i])
 legend.append('Proportional Fair'+repr(N[i]))
 plt.plot(x,D_mean_e_q_all[i])
 legend.append('Equal Blind'+repr(N[i]))
 plt.plot(x,D_mean_m_t_all[i])
 legend.append('Maximum Throughput '+repr(N[i]))
 plt.legend(legend)
 plt.xlabel('Средн. суммарный объём данных в буфере (Кбайт)')
 plt.ylabel('Интенсивность входного потока')
 plt.title('Зависимость ср. суммарного объема данных в буфере от
интенсивности')
 plt.show()
 return 0
main()
Соседние файлы в предмете Моделирование систем распределения ресурсов