量子遺傳演算法以及matlab實現
1、基本概念
(1)量子遺傳演算法是量子計算與遺傳演算法相結合的智慧優化演算法,由K.H.Han等人提出,其將量子態、量子門、量子狀態特性、概率幅等量子概念引入到遺傳演算法當中。量子遺傳演算法也是一種概率搜素演算法,它採用量子位來表示基因。遺傳演算法的基因所表達的是某一確定的資訊,而量子遺傳演算法中,由於量子資訊的疊加性使量子位所表達的基因包含所有可能的資訊。
(2)在量子計算中,量子位元|0〉和|1〉表示微觀粒子的兩種基本狀態,根據疊加原理,量子資訊的疊加態可以表示為這兩個基本態的線性組合,即|ψ〉=α|0〉+β|1〉,式中α和β為複數,表示量子位狀態的概率幅,其中和分別表示量子態|ψ〉因測量導致坍縮到|0〉態和|1〉態的概率,且滿足的歸一化條件
(3)在量子遺傳演算法中,染色體採用量子位的概率幅進行編碼,編碼方案如下:
θ為量子位元的相位,n為染色體數目,k為量子位的位數即解空間的維數,rand是[0,1]範圍內的隨機數。每個量子位為分上下兩行,分別對應兩個量子基本態的概率幅,滿足歸一化條件,因此每個個體包含上下兩條文化基因鏈,每條基因鏈是優化問題的一個候選解。由此可知,量子遺傳演算法在種群規模不變的情況下,候選解個數比遺傳演算法多一倍,增加了解空間的多樣性,提高了尋優成功的概率。
(4)在量子遺傳演算法中,採用量子旋轉門改變數子位元相位,以更新量子位的概率幅,從而達到基因變異的效果。
2、量子遺傳演算法的基本步驟:
step1:初始化父代染色體
step2:對每個染色體基因位即量子位進行測量,得到一個狀態。對每個狀態計算適應度,記錄最佳個體及適應度。
step3:遺傳進化設定的代數,其中採用量子旋轉門對每一代染色體進行遺傳變異。
step4:達到終止條件,輸出最佳個體及適應度。
3、量子遺傳演算法的MATLAB實現程式碼如下
clear all; close all; %------------------------變數部分--------------------- popsize = 100; %種群規模 vartotal = 2; %變數個數即一條染色體的量子位數 shiftstep = 0.01*pi; %轉角步長 Pm = ones(1,popsize)*0.05;%設定變異概率 maxgen = 500; %設定迭代次數 %------陣列部分--解空間的優化變數的取值範圍------------ var_range(1,1) = -100; var_range(1,2) = 100; var_range(2,1) = -100; var_range(2,2) = 100; %--------------------染色體初始化---------------------- % 初始化了2*popsize條染色體,其中每條染色體兩條基因鏈 for i=1:1:vartotal fai(:,i)=2*pi*rand(popsize,1); chrom(:,1,i)=cos(fai(:,i)); chrom(:,2,i)=sin(fai(:,i)); oldfai(:,i)=2*pi*rand(popsize,1); oldchrom(:,1,i)=cos(oldfai(:,i)); oldchrom(:,2,i)=sin(oldfai(:,i)); end %--------------------解空間變換------------------------- for i=1:1:2 for j=1:1:vartotal chromx(:,i,j)=0.5*(var_range(j,2)*(1+chrom(:,i,j))+var_range(j,1)*(1-chrom(:,i,j))); oldchromx(:,i,j)=0.5*(var_range(j,2)*(1+oldchrom(:,i,j))+var_range(j,1)*(1-oldchrom(:,i,j))); end end %-----------計算適應度---適應度函式:Shaffer's F6函式------------- for i=1:1:popsize for j=1:1:2 x1=chromx(i,j,1); x2=chromx(i,j,2); fitness(i,j)=0.5-((sin(sqrt(x1^2+x2^2)))^2-0.5)/(1+0.001*(x1^2+x2^2))^2; x1=oldchromx(i,j,1); x2=oldchromx(i,j,2); oldfitness(i,j)=0.5-((sin(sqrt(x1^2+x2^2)))^2-0.5)/(1+0.001*(x1^2+x2^2))^2; end end %----------------------獲得最優解及相應自變數---------------------- [Bestf,Indexf]=sort(fitness,2); [BestF,IndexF]=sort(Bestf,1); gBestfit=BestF(popsize,2); gBestpop=IndexF(popsize,2); gBestg=Indexf(gBestpop,2); gBestfai=fai(gBestpop,:); gBestC=chrom(gBestpop,:,:); gBest_x=chromx(gBestpop,:,:); gBest_fit=fitness(gBestpop,:); %----------------------------主迴圈開始----------------------------- for gen = 1:1:maxgen for i = 1:1:vartotal tmp=abs(chromx(1,gBestg,i)-oldchromx(1,gBestg,i)); if tmp<1.0e-2 tmp=1.0e-2; end max(i)=abs(fitness(1,gBestg)-oldfitness(1,gBestg))/tmp; for j = 1:1:popsize tmp=abs(chromx(j,gBestg,i)-oldchromx(j,gBestg,i)); if tmp<1.0e-2 tmp=1.0e-2; end if max(i)<abs(fitness(j,gBestg)-oldfitness(j,gBestg))/tmp max(i)=abs(fitness(j,gBestg)-oldfitness(j,gBestg))/tmp; end if min(i)>abs(fitness(j,gBestg)-oldfitness(j,gBestg))/tmp min(i)=abs(fitness(j,gBestg)-oldfitness(j,gBestg))/tmp; end end end %---------------執行量子位相位旋轉,得到新的相位-------------------- for i=1:1:popsize for j = 1:1:vartotal tmp=abs(chromx(i,gBestg,j)-oldchromx(i,gBestg,j)); if tmp<1.0e-2 tmp=1.0e-2; end grad=abs(fitness(i,gBestg)-oldfitness(i,gBestg))/tmp; tmp=abs(grad-min(j)); if tmp<1.0e-2 tmp=1.0e-2; end rate(i,j)=tmp/abs(max(j)-min(j)); fai(i,j)=fai(i,j)+sign(chrom(i,1,j)*gBestC(1,2,j)-gBestC(1,1,j)*chrom(i,2,j))*(1-rate(i,j))*shiftstep*exp(-gen/maxgen); end end %-----------------執行量子位相位變異-------------------------- Pm_rand = rand(popsize,vartotal);%生成隨機數,與變異概率比較,決定是否變異 for i=1:1:popsize for j=1:1:vartotal if (Pm(i)>Pm_rand(i,j))&&(i==gBestpop) fai(i,j)=0.5*pi-fai(i,j); end end end %-----------------代間複製------儲存的是相鄰兩代:父代和子代染色體------- oldchrom=chrom; oldchromx=chromx; oldfitness=fitness; %---------------生成新的量子染色體----------------- chrom(:,1,:)=cos(fai(:,:)); chrom(:,2,:)=sin(fai(:,:)); %---------------解空間變換----------------------- for i=1:1:2 for j=1:1:vartotal chromx(:,i,j)=0.5*(var_range(j,2)*(1+chrom(:,i,j))+var_range(j,1)*(1-chrom(:,i,j))); end end %-----------計算適應度---適應度函式:Shaffer's F6函式------------- for i=1:1:popsize for j=1:1:2 x1=chromx(i,j,1); x2=chromx(i,j,2); fitness(i,j)=0.5-((sin(sqrt(x1^2+x2^2)))^2-0.5)/(1+0.001*(x1^2+x2^2))^2; end end %----------------------獲得最優解及相應自變數---------------------- [Bestf,Indexf]=sort(fitness,2); [BestF,IndexF]=sort(Bestf,1); Bestfit=BestF(popsize,2); Bestpop=IndexF(popsize,2); Bestg=Indexf(Bestpop,2); Bestfai=fai(Bestpop,:); BestC=chrom(Bestpop,:,:); Best_x=chromx(Bestpop,:,:); Best_fit=fitness(Bestpop,:); Badpop=IndexF(1,1); %-----------------若最優解退化則取回上代最優解------------------ if Bestfit<gBestfit Bestfit=gBestfit; fai(Badpop,:)=gBestfai(1,:); chrom(Badpop,:,:)=gBestC(1,:,:); chromx(Badpop,:,:)=gBest_x(1,:,:); fitness(Badpop,:)=gBest_fit(1,:); gBestpop=Badpop;%最差染色體號變成了最好 end %---------------若最優解進化則將最優解替換------------------ if Bestfit>=gBestfit gBestfit=Bestfit; gBestpop=Bestpop; gBestg=Bestg; gBestfai=Bestfai; gBestC=BestC; gBest_x=Best_x; gBest_fit=Best_fit; end %---------------------記錄優化結果--------------------- result(gen)=gBestfit; iteration(gen)=gen; if result(gen)>0.995 break; end end %-----------------主迴圈結束------------------- bestresult=result(gen); iterationstep=iteration(gen); bestresult iterationstep gBestg figure(1) plot(iteration,result)
執行結果如下圖所示