lab2
.pdf
# Для каждого блока
for j in range(len(C_list[0][0])):
all_c = [C_list[u][k][j] for u in range(len(C_list))] while v_sums[all_c.index(max(all_c))] < 0:
all_c[all_c.index(max(all_c))] = -1 if sum(all_c) == -1 * len(all_c):
break
choice_list[k][j] = all_c.index(max(all_c)) v_sums[all_c.index(max(all_c))] -= 1
return choice_list
def equal_blind(C_list, V_list): choice_list = []
num_users = len(V_list)
num_slots = len(C_list[0]) # Число слотов for k in range(num_slots):
choice_list.append([None for _ in range(N_rb)]) v_sums = [V_list[u][k] for u in range(len(V_list))] for j in range(N_rb):
if k < 2:
choice_list[k][j] = np.random.choice([i for i in range(num_users)])
else:
r = []
for i in range(num_users): y_slot = 2
R_interval_start = max(k - y_slot, 0)
R_interval_stop = k
b_list_temp = [[1 if x == i else 0 for x in choice_list[slot]] for slot in range(R_interval_start, R_interval_stop)]
vb_temp = np.array(C_list[i][R_interval_start:R_interval_stop]) * t_rb * np.array(b_list_temp)
r_temp = np.sum(vb_temp) / 1 r.append(r_temp)
p = 1 / np.array(r) x = np.argmax(p)
choice_list[k][j] = x if v_sums[x] > 0:
11
choice_list[k][j] = x v_sums[x] -= 1
else:
available_users = [i for i in range(num_users) if i not in choice_list[k][:j]]
if available_users:
choice_list[k][j] = np.random.choice(available_users) else:
choice_list[k][j] = np.random.choice(num_users)
return choice_list
def proportional_fair(C_list, V_list): choice_list = []
num_users = len(V_list) num_slots = len(C_list[0]) for k in range(num_slots):
v_sums = [V_list[u][k] for u in range(len(V_list))] choice_list.append([None for _ in range(N_rb)])
for j in range(N_rb): if k < 2:
choice_list[k][j] = np.random.choice([i for i in range(num_users)])
else:
r = []
for i in range(num_users): y_slot = 1
R_interval_start = max(k - y_slot, 0)
R_interval_stop = k
b_list_temp = [[1 if x == i else 0 for x in choice_list[slot]] for slot in range(R_interval_start, R_interval_stop)]
vb_temp = np.array(C_list[i][R_interval_start:R_interval_stop]) * t_rb * np.array(b_list_temp)
r_temp = np.sum(vb_temp) / 1 r.append(r_temp)
p = [C_list[i][k][j] / r_val for i, r_val in enumerate(r)] x = np.argmax(p)
choice_list[k][j] = x choice_list[k][j] = x
12
if v_sums[x] > 0: choice_list[k][j] = x v_sums[x] -= 1
else:
available_users = [i for i in range(num_users) if i not in choice_list[k][:j]]
if available_users:
choice_list[k][j] = np.random.choice(available_users) else:
choice_list[k][j] = np.random.choice(num_users)
return choice_list
def simulate_D(func, lambdas, n_users_list):
D_list_all = [[] for i in range(len(n_users_list))] V_list_all = [[] for i in range(len(n_users_list))] for users_index, n_users in enumerate(n_users_list):
print(users_index)
users_L = [get_L(f0, Rmax) for _ in range(n_users)] for lmbd in lambdas:
V_list = []
L_list = []
C_list = []
for user_L in users_L:
user_V_list, user_L_list, user_C_list = get_user_frame(user_L, 10**2, lmbd)
V_list.append(user_V_list)
L_list.append(user_L_list)
C_list.append(user_C_list)
D_list = [[] for i in range(n_users)]
SUM_list = [[] for i in range(n_users)]
P_list = func(C_list, V_list)
for user_index, user_list in enumerate(V_list): D_list[user_index] = [None for _ in range(len(V_list[0]))] SUM_list[user_index] = [None for _ in range(len(V_list[0]))] for k in range(len(V_list[0])):
if k != 0:
remains = D_list[user_index][k - 1] + V_list[user_index][k] - P_list[k].count(user_index)
remains = remains if remains > 0 else 0
13
sent = D_list[user_index][k - 1] + V_list[user_index][k] - remains
else:
remains = V_list[user_index][k] - P_list[k].count(user_index)
remains = remains if remains > 0 else 0 sent = 0
D_list[user_index][k] = remains
SUM_list[user_index][k] = sent
V_sums = [sum([SUM_list[u][k] for u in range(n_users) for k in range(len(D_list[0]))])]
D_sums = [sum([D_list[u][n] for u in range(n_users)]) for n in range(len(D_list[0]))]
D_mean = np.mean(D_sums) #/ 1024 / 8
V_mean = np.mean(V_sums) / N_rb
V_mean = V_mean if V_mean > 0 and V_mean < N_rb else N_rb D_list_all[users_index].append(D_mean) V_list_all[users_index].append(V_mean)
return D_list_all, V_list_all
# Параметры для симуляции
n_users_list = [2**i for i in range(1, 6)] # Список с количеством абонентов
# lambdas = [i for i in range(0, 100, 20)] # Список lambda - интенсивности входного потока
lambdas = [1, 3, 6, 12, 25]
D_list_all_max, V_list_all_max = simulate_D(maximum_throughput, lambdas, n_users_list)
D_list_all_equal, V_list_all_equal = simulate_D(equal_blind, lambdas, n_users_list)
D_list_all_proportional, V_list_all_proportional = simulate_D(proportional_fair, lambdas, n_users_list) V_list_all_equal_copy = np.array(V_list_all_equal) V_list_all_equal_copy[:,0] = 0
V_list_all_equal_copy = list(V_list_all_equal_copy)
14
V_list_all_max_copy = np.array(V_list_all_max)
V_list_all_max_copy[:,0] = 0
V_list_all_max_copy = list(V_list_all_max_copy)
V_list_all_proportional_copy = np.array(V_list_all_proportional) V_list_all_proportional_copy[:,0] = 0 V_list_all_proportional_copy = list(V_list_all_proportional_copy)
V_list_all_proportional_copy = 2000*np.array(V_list_all_proportional_copy) V_list_all_max_copy = 2000*np.array(V_list_all_max_copy) V_list_all_equal_copy = 2000*np.array(V_list_all_equal_copy)
# Всё на одном графике plt.figure(figsize=(10, 6))
for i in range(len(V_list_all_max)):
plt.plot(D_list_all_max[i], label=f'Max Trhroughput users 2^{i+1}') plt.plot(D_list_all_equal[i], label=f'Equal Blind users 2^{i+1}') plt.plot(D_list_all_proportional[i], label=f'Proportional fair users
2^{i+1}')
plt.legend()
plt.title("Средний суммарный объем данных в буфере от интенсивности входного потока")
plt.xlabel("lmbd")
plt.ylabel("Средний суммарный объем данных в буфере (кбайт)") plt.legend() plt.xticks(ticks=np.arange(len(lambdas)),labels=lambdas) plt.grid(True)
plt.show()
# Для 2^n пользователей
for i in range(len(D_list_all_max)):
plt.plot(D_list_all_max[i], label=f'Max Trhroughput users 2^{i+1}') plt.plot(D_list_all_equal[i], label=f'Equal Blind users 2^{i+1}') plt.plot(D_list_all_proportional[i], label=f'Proportional fair users
2^{i+1}')
plt.legend()
plt.xlabel("lmbd")
plt.title("Средний суммарный объем данных в буфере от интенсивности входного потока\n для 2^%s пользователей"%(i+1))
plt.ylabel("Средний суммарный объем данных в буфере (кбайт)") plt.legend() plt.xticks(ticks=np.arange(len(lambdas)),labels=lambdas) plt.grid(True)
plt.show()
15
