The file: File(execute the main_testing.m)
I use some simple function I created. So I uploaded the whole folder for executing.
clear; close all; clc;
rng(13)
%% initialize parameters
basic = struct(‘K’,2,‘M’,2,‘U’,4,‘N’,10); % K: #bs / M: #uav / U: #user / N: period
pos.H = 30;
pos.q_bs = zeros(basic.K,2);
pos.q_bs = [0,0;200,200];
pos.q_uav = [pos.q_bs(:,:,1) pos.H*ones(basic.M,1)];
pos.q_uav = repmat(pos.q_uav,[1,1,basic.N]);
pos.q_us = 200 * round(rand(basic.U,2),1);
scale = 6;
power.P_max = 0.1*10^(scale);
power.p_m = power.P_max * ones(basic.M,basic.N);
power.p_k = 0.2 *10^(scale);
power.noise = -140 + pow2db(10^(scale));
bw.bs = 40 * ones(basic.K,basic.N);
bw.uav = 20 * ones(1,basic.N);
pl.xi = 0; % shadowing effect coefficient (dB)
pl.epsilon = 3.50; % path-loss exponent
pl.rho = -60; % the reference channel gain at the distance d0 = 1 m (dB)
pl.d0 = 1; % the reference distance (m)
pl.fc = 5e9; % operation frequency (Hz)
cache.F = 10; % #file
cache.ava = 3;
cache.size = 3; % uav cache size
cache.r = init_cache(basic,cache,‘user’);
cache.c = init_cache(basic,cache,‘uav’);
usera.alpha = init_association(basic,‘uav’);
usera.beta = init_association(basic,‘bs’);
%% CJCT
R = r_net_u(power,basic,pos,pl,usera,bw);
h = h_um(basic,pos,pl);
uavpower = power.p_m;
s_um = zeros(basic.U,basic.M,basic.N);
for u = 1 : basic.U
for m = 1 : basic.M
for n = 1:basic.N
interference = power.p_m(:,n)’ * h(u,:,n)’ - power.p_m(m,n) * h(u,m,n);
s_um(u,m,n) = h(u,m,n) * log2(exp(1)) / ( interference + db2pow(power.noise) );
end
end
end
r_bs = sum( rate_bs(power,basic,pos,pl,usera,bw) , 2);
r_bs = reshape(r_bs,basic.U,basic.N);
cvx_begin
cvx_solver mosek
% cvx_precision low
variable eta
variable uavpower(basic.M,basic.N)
expression r_hat_ub(basic.U,basic.M,basic.N)
expression r_lb(basic.U,basic.M,basic.N)
expression r_hat_ub(basic.U,basic.M,basic.N)
expression r_net(basic.U,1)
expression r_uav(basic.U,basic.N)
expression first_term(basic.U,basic.M,basic.N)
second_term = zeros(basic.U,basic.M,basic.N);
for u = 1 : basic.U
for m = 1 : basic.M
for n = 1:basic.N
first_term(u,m,n) = ( s_um(u,:,n) * ( uavpower(:,n) - power.p_m(:,n) ) ) - ( s_um(u,m,n) * ( uavpower(m,n) - power.p_m(m,n) ) );
second_term(u,m,n) = log2( h(u,:,n) * power.p_m(:,n) - h(u,m,n) * power.p_m(m,n) + db2pow(power.noise) );
end
end
end
r_hat_ub = first_term + second_term;
for u=1:basic.U
for m=1:basic.M
for n=1:basic.N
r_lb(u,m,n) = ( log( h(u,:,n) * uavpower(:,n) + db2pow(power.noise) ) / log(2) ) - r_hat_ub(u,m,n);
end
end
end
for u=1:basic.U
for n=1:basic.N
r_uav(u,n) = usera.alpha(u,:,n) * bw.uav(n) * r_lb(u,:,n).';
end
end
r_net = sum( (r_uav + r_bs), 2);
maximize(eta)
subject to
eta <= r_net ;
0 <= uavpower <= power.P_max;
cvx_end
power.p_m = uavpower;
power.p_m = round(power.p_m,4);
r_net_u_sp2 = r_net_u(power,basic,pos,pl,usera,bw);
eta = min(r_net_u_sp2);
disp([‘Improvment: ‘,num2str(eta-min(R)),’(Mbps)’]); % for test
I want to solve the following problem:
I think I coding everything right, even I tried to scale the variables properbly. However, the answer wasn’t right sometimes.
For example, my origin min. rate is 1026.2 Mbps (there are four users).
and after using cvx to allocate the uav power, it tells me that new min power is 1221 Mbps.
So for cvx, it did improve the min rate.
But when I bring back the new uav power to my formulate which can compute the rate for each user, it tell me that the min rate is 989.6 Mbps. This value is lower than the original. It didn’t make sense because cvx did give me the improment of min rate. What did it go on?