1.软件版本
matlab2017b
2.本算法理论知识
在生命科学领域,人们对遗传和免疫等自然现象进行了广泛而深入的研究.20世纪60年代,Bagley和Rosenberg等先驱使用了相关的内容和知识,特别是遗传学的理论和概念,在对这些研究成果进行分析和理解的基础上,将其成功应用于某些工程科学领域,取得了良好的效果。八十年代中期,美国密歇根大学的Hollan教授不仅对其进行了总结和扩展。先前学者提出的遗传概念,也给出了简洁明了的算法描述,从而形成了目前的一般遗传算法。(遗传算法,遗传算法)。因为传统遗传算法具有使用方便,鲁棒性强的特点。便于并行处理,广泛应用于组合优化,结构设计,人工智能等领域另一方面,Farmer和Bersini也在不同的时间和不同程度上参与了免疫的概念。遗传算法是一种具有迭代生成和测试过程的搜索算法。
研究人员正试图将生命科学中的免疫概念引入工程实践领域,并利用相关知识和理论将它们与现有的一些智能算法有机地结合起来,建立新的进化理论和算法来改进算法。整体性能。基于这一思想,将免疫概念及其理论应用于遗传算法。在保留原算法优良特性的前提下,试图有选择地,有目的地利用待解决问题中的一些特征信息或知识来抑制优化过程。降解现象,该算法称为免疫算法(IA))。
免疫算法相关概念
1、抗原:在生命科学中,一种刺激和诱导机体免疫系统产生免疫反应并在体内或体外与相应的免疫反应产物发生特异反应的物质。在我们的算法中,它指的是所有可能错误的基因,也就是说,非最佳个体的基因。
2、抗体:在生命科学中,免疫系统受到抗原的刺激,免疫细胞转化为浆细胞,产生与抗原特异性结合的免疫球蛋白。免疫球蛋白是抗体。在这种情况下,它指的是通过根据疫苗修改个体基因而获得的新个体。其中,根据疫苗修饰个体基因的过程是接种疫苗,目的是在产生新个体时消除抗原的不利影响。
3、免疫疫苗:基于进化或未决问题估计最佳个体基因。
4、免疫算子:与生命科学中的免疫学理论类似,免疫操作者也分为两种类型:总免疫和靶免疫,分别对应于生命科学中的非特异性免疫和特异性免疫。其中,总免疫指的是类型免疫接种,其中每个个体中的每个个体在每次突变操作后进行免疫操作;目标免疫是指个体在变异操作后的判断,个体仅在行动点。发生一种免疫反应。前者主要应用于个体进化的初始阶段,但基本上不起作用在进化过程中,否则它很可能产生通常意义上的“同化现象”;后者通常伴随着人口进化的整个过程。它也是免疫操纵的常见操作者。
5、免疫调节:在免疫反应过程中,大量抗体的产生减少了抗原对免疫细胞的刺激,从而抑制了抗体的分化和增殖,同时,还存在相互刺激和抑制的关系。产生的抗体,如抗原和抗体,抗体和抗体之间的相互限制将抗体的免疫应答维持在一定水平,确保身体的免疫平衡。
6、免疫记忆:免疫系统与抗原反应的抗体作为记忆细胞存储。当相同的抗原再次侵入时,相应的记忆细胞被激活以产生大量抗体,缩短免疫应答时间。
7、抗原识别:通过将抗原表面上的表位与抗体分子表面上的化学基团匹配来完成识别。这种匹配过程也是一个连续学习抗原的过程,最后选择最合适的抗体与抗原结合。排除抗原。
免疫算法流程
1、随机产生初始父代种群A1,根据先验知识抽取疫苗;
2、若当前群体中包含最佳个体,则算法停止运行并输出结果;否则,继续;
3、对当前第k代父本种群Ak进行交叉操作,得到种群Bk;
4、对Bk进行变异操作,得到种群Ck;
5、对Ck进行接种疫苗操作,得到种群Dk;
6、对Dk进行免疫选择操作,得到新一代父本Ak+1,转至第二步。
3.核心代码
%=========所需常量========
N=20;%子载波个数
M=3;%小区个数
K=50;%抗体规模
T=46;%抗体突变规模
L=1;%记忆细胞规模
O=5;%每代公平性调整次数
Pc=0.85;%交叉概率
Pm=0.1;%变异概率
Alpha=0.3;%优化目标调节因子wq
Gama=0.06;%相似度常数
Rho=0.6;%选择概率调节因子
Tau=20;%信号噪声比差距
Eta=2;%路径损耗指数
Sigma=3.16;%高斯标准差
Objective=0;%优化目标
genMax=200;%最大迭代次数
Ts=4e-6;%码元持续时间
N0=1e-6;%噪声功率谱密度
W=0.625e6;%主用户带宽
Delta_f=0.3125e6;%子载波带宽
Pth=10;%认知基站最大允许发射功率
Ith=0.1;%主用户的可容忍的最大功率干扰
Rate_m=[2 1 1];%各个小区的功率比值
%设基站半径为3km,归一化距离也为3km
%======所需变量=========
%flag=0;%循环进行的标志
%temp=0;%临时存储某些值
n=1;%第n个子载波
m=1;%第m个小区
k=1;%第k个抗体
i=1;%循环变量
j=1;%循环变量
o=1;%循环变量
antibody=zeros(M,N,K);%载波分配方案(第k页是第k个抗体,第m行是第m个小区,第n列是第n个子载波的取值是功率)
memorycell=zeros(M,N,L);%记忆细胞分配方案(第k页是第k个抗体,第m行是第m个小区,第n列是第n个子载波)
temp_antibody=zeros(M,N,K);%初始选择保留抗体
temp_memorycell=zeros(M,N,L);%初始记忆细胞
%rate=zeros(M,N,K);%速度方案(第k页是第k个抗体,第m行是第m个小区,第n列是第n个子载波)
%ratio=zeros(K);%第k个抗体的速率功率比
itfere_pu=zeros(M,N,K);%各个子载波对主用户的干扰
%antibody_flag=zeros(1,K);%每个抗体的标志
%========有关干扰的计算========
%认知用户的位置
loc_cu=zeros(M,2); %第m个认知用户的位置(以主用户为坐标原点的),并假设小区半径为3km
p1_cu_cbs=zeros(1,3); %认知用户和认知基站之间的路径损耗
flag=1;
while flag==1
Theta=rand*2*pi;
r=rand*3;
if r>=1
flag=0;
end
end
loc_cu(2,1)=-1.5*3^0.5+r*cos(Theta);%第2个用户的x坐标
loc_cu(2,2)=-1.5+r*cos(Theta); %第2个用户的y坐标
pl_cu_cbs(1,2)=r; %第2个用户与基站的距离
flag=1;
while flag==1
Theta=rand*2*pi;
r=rand*3;
if r>=1
flag=0;
end
end
loc_cu(1,1)=r*cos(Theta); %第1个用户的x坐标
loc_cu(1,2)=3+r*cos(Theta); %第1个用户的y坐标
pl_cu_cbs(1,1)=r; %第1个用户与基站的距离
flag=1;
while flag==1
Theta=rand*2*pi;
r=rand*3;
if r>=1
flag=0;
end
end
loc_cu(3,1)=1.5*3^0.5+r*cos(Theta); %第3个用户的x坐标
loc_cu(3,2)=-1.5+r*cos(Theta); %第3个用户的y坐标
pl_cu_cbs(1,3)=r; %第3个用户与基站的距离
%——主用户的位置
loc_pu=zeros(1,2); %主用户的位置
%switch(randi([1,3],1))
switch(2)
case 1 %主用户在第2个小区
flag=1;
while flag==1
Theta=rand*2*pi;
r=rand*3;
if r>=1
flag=0;
end
end
loc_pu(1,1)=-1.5*3^0.5+r*cos(Theta);
loc_pu(1,2)=-1.5+r*cos(Theta);
case 2 %主用户在第1个小区
flag=1;
while flag==1
Theta=rand*2*pi;
r=rand*3;
if r>=1
flag=0;
end
end
loc_pu(1,1)=r*cos(Theta);
loc_pu(1,2)=3+r*cos(Theta);
case 3 %主用户在第3个小区
flag=1;
while flag==1
Theta=rand*2*pi;
r=rand*3;
if r>=1
flag=0;
end
end
loc_pu(1,1)=1.5*3^0.5+r*cos(Theta);
loc_pu(1,2)=-1.5+r*cos(Theta);
end
%路径损耗的计算
pl_cu_pu=zeros(1,3); %认知用户和主用户之间的路径损耗
pl_cu_cu=zeros(3); %认知用户之间的路径损耗
for m=1:M
pl_cu_pu(1,m)=((loc_cu(m,1)-loc_pu(1,1))^2+(loc_cu(m,2)-loc_pu(1,2))^2)^0.5;
end
pl_cu_pu=10^(0.1*randn*Sigma)./((pl_cu_pu/3).^Eta); %产生主用户和认知用户的路径损耗
pl_cu_cbs=10^(0.1*randn*Sigma)./((pl_cu_cbs/3).^Eta); %产生用户和认知基站的路径损耗
for m=1:M
for i=1:M
pl_cu_cu(m,i)=((loc_cu(m,1)-loc_cu(i,1))^2+(loc_cu(m,2)-loc_cu(i,2))^2)^0.5;
end
end
pl_cu_cu=10^(0.1*randn*Sigma)./((pl_cu_cu/3).^Eta); %产生认知用户和认知用户之间的路径损耗
%对主用户干扰
to_pu_g=raylrnd(1,[M,N]); %对主用户的信道干扰增益(第m行是第m个小f中各个子载波的增益)
lamda=zeros(1,N); %对主用户距离干扰增益
Distance=zeros(1,N); %第n个子载波和主用户的频带距离
for n=1:N
Distance(1,n)=((N-(2*n-1)/2)*Delta_f+W/2);
end
F=@(f)((sin(pi*Ts*f)./(pi*Ts*f)).^2); %积分函数
for n=1:N %Lamda计算
lamda(1,n)=Ts*quad(F,(Distance(1,n)-W/2),(Distance(1,n)+W/2));
end
for m=1:M
for n=1:N
to_pu_g(m,n)=to_pu_g(m,n)*lamda(1,n); %对主用户的总的干扰增益
end
end
for m=1:M
to_pu_g(m,:)=to_pu_g(m,:)*pl_cu_pu(1,m);
end
%同频相互干扰
co_ch_g=zeros(M,M,N); %同频干扰矩阵,第n页是第n个子载波的同频干扰
for n=1:N
for i=1:M
for j=i:M %若要不同的同频干扰,则这里改为1:M
co_ch_g(i,j,n)=raylrnd(1);
co_ch_g(j,i,n)=co_ch_g(i,j,n);
end
end
end
for n=1:N
for m=1:M
co_ch_g(m,m,n)=0;
end
end
for n=1:N
co_ch_g(:,:,n)=(co_ch_g(:,:,n).^2).*pl_cu_cu;
end
for n=1:N
for i=1:M
co_ch_g(i,i,n)=0;
end
end
%—有关各个子载波的信道增益——
ch_g=raylrnd(1,[M,N]); %每个子载波的信道增益
for m=1:M
ch_g(m,:)=(ch_g(m,:).^2)*pl_cu_cbs(1,m);
end
%===—有关运算结果显示=====二=
rate_gen1=zeros(1,genMax); %每代的最优速率
rate_gen2=zeros(1,genMax); %每代的最优速率
%rate_gen3=zeros(1,generaMax); %每代的最优小速率
ratio_gen1=zeros(1,genMax); %每代的最优速率功率比
ratio_gen2=zeros(1,genMax); %每代的最优速率功率比
%ratio_gen3=zeros(1,genMax); %每代的最优速率功率比
Pth=10;
for Ith=[0.001 0.005 0.01]
for qq=1:10
%=========程序初始化========
temp_antibody(:)=Pth/N; %初始抗体功率是平均分配
temp_memorycell(:)=Pth/N; %初始记忆细胞功率也是平均分配
antibody(:)=temp_antibody(:); %抗体变量装入初始抗体
memorycell(:)=temp_memorycell(:); %记忆细胞变量装入记忆细胞
%=========主函数=========
for gen=1:genMax
gen
%记忆细胞添加
antibody(:,:,(K-L+1):K)=memorycell;
%antibody_falg((K-L+1):K)=1; %记录成型抗体
%——抗体合格检测
exceed_Ith=0; %超过干扰门限的量
exceed_Pth=0; %超过功率门限的量
decr_var_I=zeros(M,N); %有关干扰的归一化的减少量
decr_val_P=zeros(M,N); %有关功率的归一化的减少量
ratio_P=zeros(1,3); %计算当前功率与公平性的比值
standerd_site=0; %作为基准的用户
for k=1:K
decr_val_P=antibody(:,:,k)/sum(sum(antibody(:,:,k))); %根据现有功率计算归一化功率减少量
if(sum(sum(antibody(:,:,k)))-Pth>eps)
exceed_Pth=sum(sum(antibody(:,:,k)))-Pth; %计算超出多少
antibody(:,:,k)=antibody(:,:,k)-exceed_Pth*decr_val_P(:,:);
end
itfere_pu(:,:,k)=to_pu_g.*antibody(:,:,k);
decr_val_I=itfere_pu(:,:,k)/sum(sum(itfere_pu(:,:,k))); %根据现有干扰计算归一化功率减少量
if(sum(sum(itfere_pu(:,:,k)))-Ith>eps)
exceed_Ith=sum(sum(itfere_pu(:,:,k)))-Ith; %计算超出多少
antibody(:,:,k)=antibody(:,:,k)-(exceed_Ith*decr_val_I)./(to_pu_g);
end
itfere_pu(:,:,k)=to_pu_g.*antibody(:,:,k); %更新对主用户的干扰
end
%---速率计算
h=zeros(M,N,K); %各个子载波的信噪比
i_ss=zeros(M,N,K); %各个子载波受到的同频干扰
for k=1:K
for n=1:N
for m=1:M
for i=1:M
i_ss(m,n,k)=i_ss(m,n,k)+co_ch_g(i,m,n)*antibody(i,n,k); %计算各个子载波所受到的同频干扰
end
end
end
end
temp=sum(i_ss);
for k=1:K
for n=1:N
for m=1:M
i_ss(m,n,k)=temp(1,n,k)-i_ss(m,n,k); %计算每个子载波所受到的同频干扰
end
end
end
for k=1:K
h(:,:,k)=ch_g./(N0*Delta_f+i_ss(:,:,k)); %计算信噪比
end
%rate=Delta_f*log2(1+antibody.*h/Tau); %计算每个抗体每个小区的速率
rate=log2(1+antibody.*h/Tau); %计算每个抗体每个小区的速率
%总的公平性调整
for o=1:O
%rate_m=zeros(1,3,K); %各个小区的总速率
%ratio_r=zeros(1,3); %计算当前速率与公平性的比值
standard_site=0; %作为基准的用户
decr_val_r=zeros(M,N); %有关功率的归一化的减少量
exceed_r=0; %超过干扰门限的量
rate_m=sum(rate,2);
for k=1:K
ratio_r=rate_m(:,:,k)./Rate_m';
[~,standard_site]=min(ratio_r); %选取基准功率
switch(standard_site) %进行功率公平性调整
case 1 %第一个为基准
for m=[2 3]
exceed_r=rate_m(1,:,k)/2-rate_m(m,:,k);
decr_val_r(m,:)=(rate(m,:,k)/sum(rate(m,:,k)))*exceed_r;
if(exceed_r<0)
for n=1:N
antibody(m,n,k)=(2^decr_val_r(m,n)*(Tau+antibody(m,n,k)*h(m,n,k))-Tau)/h(m,n,k);
end
end
end
case 2 %第二个为基准
exceed_r=rate_m(2,:,k)*2-rate_m(1,:,k);
decr_val_r(1,:)=(rate(1,:,k)/sum(rate(1,:,k)))*exceed_r;
if(exceed_r<0)
for n=1:N
antibody(1,n,k)=(2^decr_val_r(1,n)*(Tau+antibody(1,n,k)*h(1,n,k))-Tau)/h(1,n,k);
end
end
exceed_r=rate_m(2,:,k)-rate_m(3,:,k);
decr_cal_r(3,:)=(rate(3,:,k)/sum(rate(3,:,k)))*exceed_r;
if(exceed_r<0)
for n=1:N
antibody(3,n,k)=(2^decr_cal_r(3,n)*(Tau+antibody(3,n,k)*h(3,n,k))-Tau)/h(3,n,k);
end
end
case 3 %第三个为基准
exceed_r=rate_m(3,:,k)*2-rate_m(1,:,k);
decr_val_r(1,:)=(rate(1,:,k)/sum(rate(1,:,k)))*exceed_r;
if(exceed_r<0)
for n=1:N
antibody(1,n,k)=(2^decr_val_r(1,n)*(Tau+antibody(1,n,k)*h(1,n,k))-Tau)/h(1,n,k);
end
end
exceed_r=rate_m(3,:,k)-rate_m(2,:,k);
decr_val_r(2,:)=(rate(2,:,k)/sum(rate(2,:,k)))*exceed_r;
if(exceed_r<0)
for n=1:N
antibody(2,n,k)=(2^decr_val_r(2,n)*(Tau+antibody(2,n,k)*h(2,n,k))-Tau)/h(2,n,k);
end
end
end
end
temp=antibody<=eps;
antibody(temp)=eps;
h=zeros(M,N,K); %各个子载波的信噪比
i_ss=zeros(M,N,K); %各个子载波受到的同频干扰
for k=1:K
for n=1:N
for m=1:M
for i=1:M
i_ss(m,n,k)=i_ss(m,n,k)+co_ch_g(i,m,n)*antibody(i,n,k); %计算各个子载波所受到的同频干扰
end
end
end
end
temp=sum(i_ss);
for k=1:K
for n=1:N
for m=1:M
i_ss(m,n,k)=temp(1,n,k)-i_ss(m,n,k); %计算每个子载波所受到的同频干扰
end
end
end
for k=1:K
h(:,:,k)=ch_g./(N0*Delta_f+i_ss(:,:,k)); %计算信噪比
end
%rate=Delta_f*log2(1+antibody.*h/Tau); %计算每个抗体每个小区的速率
rate=log2(1+antibody.*h/Tau); %计算每个抗体每个小区的速率
end
%速率功率比计算
%if gen==genMax
%rate=floor(rate);
%end
rate_antibody=sum(sum(rate)); %计算每个抗体速率
ratio=rate_antibody./sum(sum(antibody)); %计算每个抗体的速率功率比
Objective=ratio*Alpha+rate_antibody*(1-Alpha); %计算优化目标的值
%亲和力排序
for i=1:K-1
for j=i+1:K
if(Objective(i)<Objective(j))
temp=rate_antibody(i); %每代速度交换
rate_antibody(i)=rate_antibody(j);
rate_antibody(j)=temp;
temp=rate(:,:,i); %速率交换
rate(:,:,i)=rate(:,:,j);
rate(:,:,j)=temp;
temp=antibody(:,:,i); %功率交换
antibody(:,:,i)=antibody(:,:,j);
antibody(:,:,j)=temp;
temp=itfere_pu(:,:,i); %对主用户干扰交换
itfere_pu(:,:,i)=itfere_pu(:,:,j);
itfere_pu(:,:,j)=temp;
temp=Objective(i); %每代速度交换
Objective(i)=Objective(j);
Objective(j)=temp;
temp=ratio(i); %每代速度交换
ratio(i)=ratio(j);
ratio(j)=temp;
% temp=antibody_flag(i);
% antibody_flag(i)=antibody_flag(j);
% antibody_flag(j)=temp;
end
end
end
%提取记忆细胞
memorycell=antibody(:,:,1:L); %前L个个体作为记忆细胞提取
%算法结果等待
rate_gen1(gen)=rate_antibody(1); %记录每代最优的最小速度
ratio_gen1(gen)=Objective(1); %每代最优速率功率比
%抗体选择
%pd=zeros(1,K); %浓度概率
pf=zeros(1,K); %适应度概率
%p=zeros(1,K); %选择概率
resemble=zeros(1,K); %抗体的相似度
res=zeros(M,N,K); %各个子载波的距离
index=zeros(1,K); %轮盘赌抗体索引
for k=1:K
for i=1:K
res(:,:,i)=abs(antibody(:,:,k)-antibody(:,:,i)); %计算各个子载波的距离
end
temp=(res<=Gama*Pth); %距离过近的子载波个数
temp=sum(sum(temp)); %计算与每个抗体的距离
for i=1:K
resemble(k)=resemble(k)+temp(i);
end
end
pd=1-resemble/(M*N*K);
for k=1:K
pf(k)=(Objective(k)-Objective(K)+eps)/(Objective(1)-Objective(K)+eps);
end
p=Rho*pf+(1-Rho)*pd;
for i=1:K-1 %抗体按照选择概率排序
for j=i+1:K
if(p(i)<p(j))
temp=p(i);
p(i)=p(j);
p(j)=temp;
temp=antibody(i);
antibody(i)=antibody(j);
antibody(j)=temp;
end
end
end
for k=1:K %选出K个抗体
temp=rand*sum(p);
for i=1:K
temp=temp-p(i);
if(temp<=0)
index(k)=i; %赌出第k个索引值
break;
end
end
end
temp=antibody;
antibody=temp(:,:,index);
%两种交叉
[antibody]=dou_atb_excha(N,K,Pc,antibody); %调用交叉互换函数i现i叉互换
%两种突变
[antibody]=dou_atb_mutat(K,N,M,Pm,antibody); %调用突变函数实现抗体突变
end
obj(qq,:)=ratio_gen1;
obj11(qq,:)=2*rate_gen1;
end
hold on;
oobj=mean(obj);
oobj11=mean(obj11);
plot(oobj11);
xlabel('代数');ylabel('亲和力');title('收敛性能');
legend('Ith=0.001','Ith=0.005','Ith=0.01','Location','NorthEast');
% figure(1);plot(1:genMax,oobj,'-',1:genMax,oobj,'-x',1:genMax,oobj,'--');
% xlabel('代数');ylabel('亲和力');title('收敛性能');
% legend('Ith=0.001','Ith=0.005','Ith=0.01','Location','NorthEast');
% figure(2);plot(1:genMax,oobj11,'-',1:genMax,oobj11,'-x',1:genMax,oobj11,'--');
% xlabel('代数');ylabel('亲和力');title('收敛性能');
% legend('Ith=0.001','Ith=0.005','Ith=0.01','Location','NorthEast');
end
% figure(1);semilogy(1:genMax,OutagePC(1,:),'-',1:genMax,OutagePC(2,:),'-x',1:genMax,OutagePC(3,:),'--');
% xlabel('代数');ylabel('亲和力');title('收敛性能');
% legend('Ith=0.001','Ith=0.005','Ith=0.01','Location','NorthEast');
% figure(1);semilogy(1:genMax,OutagePC(1,:),'-',1:genMax,OutagePC(2,:),'-x',1:genMax,OutagePC(3,:),'--');
% xlabel('代数');ylabel('亲和力');title('收敛性能');
% legend('Ith=0.001','Ith=0.005','Ith=0.01','Location','NorthEast');
4.操作步骤与仿真结论
5.参考文献
- 李晓宇.认知无线电系统中资源分配策略研究[D].郑州大学,2010
- 孔小丽.认知无线电系统的频谱资源分配研究[D].南京邮电大学,2013
3.徐超.认知无线电网络中的安全中继选择与功率分配研究[D].北京邮电大
D207