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