num_m = 8;
num_n = 3;
K = 3;
d_min = 10;
d_max = 50;
p_max = 100;
c = 0.056;
rho = 0;
%d = unifrnd(d_min,d_max,num_m,1);
d = [10;20;30;40;50;60;70;80];
gain = UVLC_getchg(num_m,d,c,rho)
pg_sic = zeros(num_m,num_m);
noise = 1e-10*ones(num_m,1);
noise_1 = zeros(num_m,1);
%串行干扰消除
for i = 1:num_m
pg_self = gain(i);
for j = 1:num_m
if i~=j
if gain(j)<gain(i)
pg_sic(i,j) = gain(j)/pg_self;%归一化干信比
end
end
end
noise_1(i) = noise(i)/pg_self;%归一化噪信比
end
f_mn = zeros(num_m,num_n);
rate_vec = ;%存放前几次迭代后的rate
A = zeros(num_m,num_n);
B = zeros(num_m,num_n);
beta = zeros(num_m,num_n);
for epoch = 1:100
if epoch == 1
%初始化,信道分配变量f,功率控制变量p,和速率rate
f_tmp = [1,0,0;1,0,0;1,0,0;1,0,0;1,0,0;1,0,0;1,0,0;1,0,0];
p_tmp = 100*ones(num_m,1);
r = 0;%存放传感器m的速率
rate = 0;%存放所有传感器的对数效用之和
for i = 1:num_m
for j = 1:num_n
%判断传感器m是否占用信道n,不占用则不用计算
if f_tmp(i,j) ~= 0
r = r + log2(1 + f_tmp(i,j)p_tmp(i)/(pg_sic(i,(p_tmp.*f_tmp(:,j)) + noise_1(i)));
end
end
rate = rate + log(r);
end
rate_vec=[rate_vec,rate];
end
%每次循环都需要计算分式规划各辅助变量的初值
for i = 1:num_m
for j = 1:num_n
A(i,j) = f_tmp(i,j)p_tmp(i);
B(i,j) = (pg_sic(i,(p_tmp.*f_tmp(:,j)) + noise_1(i));
beta(i,j) = sqrt(A(i,j))/(B(i,j));
end
end
%使用cvx工具箱
% 如果可能,最好在开始之前清空之前的问题
cvx_clear
cvx_solver Mosek
cvx_save_prefs %设置为默认求解器
cvx_begin quiet %不显示求解过程,只输出结果
variable f_tmp(num_m,num_n);%优化变量,不可以赋值修改,可以用双等号==来写约束条件
expressions obj r1 a b;%中间变量
obj = 0;
r1 = 0;
for i = 1:num_m
for j = 1:num_n
a = f_tmp(i,j)*p_tmp(i);%对应A
b = (pg_sic(i,:)*(p_tmp.*f_tmp(:,j)) + noise_1(i));%对应B
r1 = r1 + log(1+2*beta(i,j)*sqrt(a) - pow_pos(beta(i,j),2)*b)/log(2);%cvx不接受^表示次方,应用函数pow_pos(x,n)
end
obj = obj + log(r1);
end
maximize obj
subject to
f_tmp <= 1%C1
f_tmp >= 0%C1
for i = 1:num_m
%sum(f_tmp(i,:)) <= 1 %C2
sum(f_tmp(i,:)) == 1 %C2
end
for j = 1:num_n
%sum(f_tmp(:,j)) == K %C3
sum(f_tmp(:,j)) <= K %C3
end
cvx_end
rate = cvx_optval
%重新计算和速率
% r = 0;%存放传感器m的速率
% rate = 0;%存放所有传感器的对数效用之和
% for i = 1:num_m
% for j = 1:num_n
% %判断传感器m是否占用信道n,不占用则不用计算
% if f_tmp(i,j) ~= 0
% r = r + log2(1 + f_tmp(i,j)p_tmp(i)/(pg_sic(i,(p_tmp.*f_tmp(:,j)) + noise_1(i)));
% end
% end
% rate = rate + log(r);
% end
%误差判断
delt = rate-rate_vec(end);
rate_vec = [rate_vec,rate];
if epoch == 1 && delt < 0
f_mn = [1,0,0;1,0,0;1,0,0;1,0,0;1,0,0;1,0,0;1,0,0;1,0,0];
end
if delt >= 0 && delt < 1e-2
%取整,得到最终的信道分配变量
for i = 1:num_m
[~,index] = max(f_tmp(i,:));
f_mn(i,index) = 1;
end
break;
end
end