Скачиваний:
9
Добавлен:
27.08.2024
Размер:
876 Кб
Скачать
☆

# Для каждого блока

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

Соседние файлы в предмете Моделирование систем распределения ресурсов