量⼦遗传算法以及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
index复数
%-----------------代间复制------保存的是相邻两代:⽗代和⼦代染⾊体-------
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)运⾏结果如下图所⽰