1.算法描述
注水算法是根据某种准则,并根据信道状况对发送功率进行自适 应分配,通常是信道状 况好的时刻,多分配功率,信道差的时候, 少分配功率,从而最大化传输速率。注水算法是根据某种准则,并根据信道状况对发送功率进行自适应分配,通常是信道状况好的时刻,多分配功率,信道差的时候,少分配功率,从而最大化传输速率。实现功率的注水分配,发送端必须知道CSI。当接收端完全知道信道而发送端不知道信号时,发送天线阵列中的功率平均分配是合理的。当发送端知道信道,可以增加信道容量。
信道功率的注水分配 [1] 是一种形象的说法——假设要为几个信噪比(γ)各不相同的子信道分配功率。曲线1/γ 代表碗底;而功率被注入这只碗,直到恒定的水面线1/γ0(γ0是参考信噪比)为止。对于某个给定信噪比为γ的子信道,注入的功率量是1/γ0− 1/γ,即碗底(1/γ)和水面(1/γ0)之间的水量。
注水原理背后的思路是充分利用信道的良好状况:信道状况好的时刻(γ大),多分配功率,即提高数据传输速率;信道状况差的时候(γ小),少分配功率,即降低数据传输速率;如果信道状况低于某个阀值(比如γ<γ0),就不分配功率。运用注水分配,可以最大化传输速率。
Step3:若分配到最小增益的信道能量为负值,即设,p=p+1,转至 Step1;
若任意非负,即得到最佳注水功率分配策略。
2.仿真效果预览
matlab2022a仿真如下:
分布式算法,主要是降低算法的资源消耗,但是性能不如集中式算法。降低资源消耗,集中性非常耗资源,而分布式则可以大大降低资源消耗,但性能只是略低于集中式,所以选择分布式。
3.MATLAB核心程序
Parts = 5;
Ts = 5;
Steps = 5;
End_Times = 10000;
Factor = zeros(2,KK);
Rm = zeros(1,1);
Qm = zeros(1,1);
Alloc = zeros(1,KK);
T_users = T_users;
dr = 0;
or = 0;
ind = 0;
ino = 0;
rhoBE = 0.5;
for schedule_time = 1:Steps:End_Times%for each time slot
t = schedule_time;
if schedule_time <= 2*Steps
M = randperm(length(T_users));
M1 = M(1:floor(length(T_users)/2));
M2 = M(floor(length(T_users)/2)+1:end);
PI1= zeros(1,length(M1));
PI2= zeros(1,length(M2));
ind0 = find(T_users <= mean(T_users));
ind1 = find(T_users > mean(T_users));
for j = 1:KK
for k = 1:length(M1)
PI1(k) = T_users(M1(k));
end
for k = 1:length(M2)
PI2(k) = T_users(M2(k));
end
Len = min(length(M1),length(M2));
PIs = PI1(1:Len) + PI2(1:Len);
[V,I] = max(PIs);
Xmax(j) = V;
end
SK =[];
for j1 = 1:length(ind0)
for j2 = 1:length(ind1)
if Xmax(ind0(j1)) >= Xmax(ind1(j2))
SK = [SK,j1];
end
end
end
SK = unique(SK);
if isempty(SK) == 1
SK = 1;
end
tmps = log2(1 + beta*abs(SNIR));
Rm = mean(Xmax(SK))*mean(mean(tmps));
Qm = 100;
tmpsR1= Rm;
tmpsR2= tmpsR1;
tmpsQ = Qm;
else
M = randperm(length(T_users));
M1 = M(1:floor(length(T_users)/2));
M2 = M(floor(length(T_users)/2)+1:end);
PI1= zeros(1,length(M1));
PI2= zeros(1,length(M2));
ind0 = find(T_users <= mean(T_users));
ind1 = find(T_users > mean(T_users));
for j = 1:KK
for k = 1:length(M1)
PI1(k) = T_users(M1(k));
end
for k = 1:length(M2)
PI2(k) = T_users(M2(k));
end
Len = min(length(M1),length(M2));
PIs = PI1(1:Len) + PI2(1:Len);
[V,I] = max(PIs);
Xmax(j) = V;
end
SK =[];
for j1 = 1:length(ind0)
for j2 = 1:length(ind1)
if Xmax(ind0(j1)) >= Xmax(ind1(j2))
SK = [SK,j1];
end
end
end
SK = unique(SK);
if isempty(SK) == 1
SK = 1;
end
Rm = (1-rhoBE)*tmpsR1 + rhoBE*tmpsR2;
Qm = tmpsQ - Rm*Ts*sum(T_users(SK));
tmpsR1 = Rm;
tmpsR2 = tmpsR1;
tmpsQ = Qm;
end
p = rand;
if p <= 0.3;
ino = ino + KK;
p2 = rand;
if p2 <= 0.5;
ind = ind + KK;
end
end
end
SU = Rm/1e2;
Rms= Rm/KK/3;
dr = ind/End_Times;
or = ino/End_Times;
01_098m