1.算法概述
如图1表示一个潜伏式认知中继网络,在这个场景中有一对主用户和一对次级用户,主用户由一个发射器和一个接收器组成,次级用户由一个发射器、一个接收器和n个中继节点组成。次级用户的认知节点之间没有直接链路,中继节点采用放大转发工作模式。假设场景中涉及到的信道都是相互独立的块衰落信道,也就是说即时功率增益在每个传输块之间是保持不变的,但是当一个传输块变化到另一个传输块时是可能发生改变的。
在现有捕获信道状态信息的技术支持下,假设次级用户能够获取完美的信道状态信息,即次级用户发射端和中继节点能通过不同的方法获取信道即时功率增益,从而使次级用户发射端和中继节点能够实现发射功率的最优分配以获得次级用户的最大吞吐量。
主用户在通信过程中可以采取不同的发射方案。为了计算的方便,本文假设主用户采用恒定功率的分配方案。为了从总体上保护主用户的通信质量,在主用户接收端考虑一个长时间平均的SINR约束条件。这个约束条件在本文中称为平均SINR约束条件,表述如下:
为了保护主用户的实时传输,使其不会因为最大化次级用户的吞吐量而被中断,确保主用户的传输质量,进而保证主用户的业务质量,本文也对主用户接收端的每个传输状态的SINR强加一个约束。这个约束称为谷值SINR约束,表述如下:
本文的优化标是在平均SINR约束、谷值SINR约束以及平均发射功率约束下,充分的利用共享的频谱资源,获取尽可能大的次级用户吞吐量。
2.仿真效果预览
matlab2022a仿真结果如下:
3.核心MATLAB代码预览
%次用户发射端到中继节点功率增益
f3 = 2;
%中继节点到次用户接收端功率增益
f4 = 3;
%中继节点到主用户接收端之间的信道即时功率增益
f5 = 3;
%预先确定的主用户能够接受的最小的平均SINR阈值
A1 = 3.6;
A2 = 2.5;
%次级用户发射端和中继节点的平均发射功率预算
Q1 = 3.48;
Q2 = 3.3;
%**************************************************************************
%%
%先确定lemda1,lemda2,lemda3,lemda4
Num = 2000;
beta1 = zeros(1,Num);
beta2 = zeros(1,Num);
beta3 = zeros(1,Num);
beta4 = zeros(1,Num);
lemdas1 = zeros(1,Num);
lemdas2 = zeros(1,Num);
lemdas3 = zeros(1,Num);
lemdas4 = zeros(1,Num);
lemda1 = 0;
lemda2 = 0;
lemda3 = 0;
lemda4 = 0;
for k = 1:Num-1
%步长的动态调整
alpha = 0.15;
beta1(k) = alpha*((Num-k+1)/Num)^k;
beta2(k) = alpha*((Num-k+1)/Num)^k;
beta3(k) = alpha*((Num-k+1)/Num)^k;
beta4(k) = alpha*((Num-k+1)/Num)^k;
lemdas1(k+1) = lemdas1(k) - beta1(k)*(mean((P1*f1)./(P2*f2 + N0))-A1);
lemdas2(k+1) = lemdas2(k) - beta2(k)*(mean((P1*f1)./(P3*f5 + N0))-A2);
lemdas3(k+1) = lemdas3(k) - beta3(k)*(Q1 - mean(P2));
lemdas4(k+1) = lemdas4(k) - beta4(k)*(Q2 - mean(P3));
end
%通过迭代,获得四个lemda
lemda1 = lemdas1(end);
lemda2 = lemdas2(end);
lemda3 = lemdas3(end);
lemda4 = lemdas4(end);
figure(1);
plot(lemdas1,'b','linewidth',2);
hold on
plot(lemdas2,'r','linewidth',2);
hold on
plot(lemdas3,'k','linewidth',2);
hold on
plot(lemdas4,'g','linewidth',2);
grid on
legend('lemda1','lemda2','lemda3','lemda4');
xlabel('迭代次数');
ylabel('lemda');
axis([0,Num,-2,2]);
%%
%通过优化,计算得到最后最佳的功率分配情况
%先通过遗传优化获得最佳的P2和P3
%**********************首先通过我使用的优化过程计算**************************
%根据中继节点数目,产生每个次用户-中继的信道参数
SNR0 = 15;
SNR = [8,12,15,20,4,11];
%测试发送数据
Signal = 1e6*rand(1,2);
x = 2*Signal-1;
for jAFN = 1:AFN
jAFN
zsnl = sqrt(1/(10^((SNR(jAFN))/10)));
zsnl0 = sqrt(1/(10^((SNR0)/10)));
%如下为需要拟合的参数
P2o = 3;
P3o = 3;
%根据遗传算法进行参数的拟合
MAXGEN = 200;
NIND = 600;
Chrom = crtbp(NIND,2*10);
%14个变量的区间
Areas = [0 ,0;
20 ,20];
FieldD = [rep([10],[1,2]);Areas;rep([0;0;0;0],[1,2])];
P2x_NIND = zeros(NIND,1);
P3x_NIND = zeros(NIND,1);
P2x = zeros(MAXGEN,1);
P3x = zeros(MAXGEN,1);
T = zeros(MAXGEN,1);
gen = 0;
for a=1:1:NIND
P2x_NIND(a) = P2o;
P3x_NIND(a) = P3o;
%计算对应的目标值
%计算不同中继点对应的信噪比
Ysr = sqrt(P2x_NIND(a)*f3)*x + zsnl*randn;
Ysd = sqrt(P3x_NIND(a))/sqrt(P2x_NIND(a)*f3 + N0)*sqrt(f4) * Ysr + zsnl0*randn;
Rr = sum(Ysd.^2)/sum(x.^2);
L = func_obj(Rr,mean(P1),P2x_NIND(a),P3x_NIND(a),f1,f2,f3,f4,f5,N0,lemda1,lemda2,lemda3,lemda4);
E = 1/L;
J(a,1) = E;
end
Objv = (J+eps);
gen = 0;
while gen < MAXGEN;
FitnV=ranking(Objv);
Selch=select('sus',Chrom,FitnV);
Selch=recombin('xovsp', Selch,0.9);
Selch=mut( Selch,0.01);
phen1=bs2rv(Selch,FieldD);
for a=1:1:NIND
if gen == 1
P2x_NIND(a) = P2o;
P3x_NIND(a) = P3o;
else
P2x_NIND(a) = phen1(a,1);
P3x_NIND(a) = phen1(a,2);
end
%计算不同中继点对应的信噪比
Ysr = sqrt(P2x_NIND(a)*f3)*x + zsnl*randn;
Ysd = sqrt(P3x_NIND(a))/sqrt(P2x_NIND(a)*f3 + N0)*sqrt(f4) * Ysr + zsnl0*randn;
Rr = sum(Ysd.^2)/sum(x.^2);
%计算对应的目标值
L = func_obj(Rr,mean(P1),P2x_NIND(a),P3x_NIND(a),f1,f2,f3,f4,f5,N0,lemda1,lemda2,lemda3,lemda4);
E = 1/L;
JJ(a,1) = E;
end
Objvsel=(JJ+eps);
[Chrom,Objv]=reins(Chrom,Selch,1,1,Objv,Objvsel);
gen=gen+1;
%保存参数收敛过程和误差收敛过程以及函数值拟合结论
P2x(gen) = mean(P2x_NIND);
P3x(gen) = mean(P3x_NIND);
Ysr = sqrt(P2x(gen)*f3)*x + zsnl*randn;
Ysd = sqrt(P3x(gen))/sqrt(P2x(gen)*f3 + N0)*sqrt(f4) * Ysr + zsnl0*randn;
Rr = sum(Ysd.^2)/sum(x.^2);
%计算对应的吞吐量
T(gen) = log2(1+Rr);
end
%计算对应的目标值
Ysr = sqrt(P2x(end)*f3)*x + zsnl*randn;
Ysd = sqrt(P3x(end))/sqrt(P2x(end)*f3 + N0)*sqrt(f4) * Ysr + zsnl0*randn;
Rr = sum(Ysd.^2)/sum(x.^2);
Tp2p3(jAFN) = log2(1+Rr);
P2_best(jAFN) = P2x(end);
P3_best(jAFN) = P3x(end);
end
%获得最佳中继点
[V,I] = max(Tp2p3);
disp('最优中继点:');
I
disp('最优功率分配结果:');
P2_best(I)
P3_best(I)
disp('吞吐量:');
Tp2p3(I)
01_088_m