量子遗传算法就是基于量子计算原理的一种遗传算法。将量子的态矢量表达引入了遗传编码,利用量子逻辑门实现染色体的演化,实现了比常规遗传算法更好的效果。
量子遗传算法建立在量子的态矢量表示的基础之上,将量子比特的几率幅表示应用于染色体的编码,使得一条染色体可以表达多个态的叠加,并利用量子逻辑门实现染色体的更新操作,从而实现了目标的优化求解。
Matlab代码:
①QuantumMain.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
clc; clear all; close all; %----------------参数设置----------------------- MAXGEN=200; % 最大遗传代数 sizepop=40; % 种群大小 lenchrom=[20 20]; % 每个变量的二进制长度 trace=zeros(1,MAXGEN); %-------------------------------------------------------------------------- best=struct('fitness',0,'X',[],'binary',[],'chrom',[]); % 最佳个体 记录其适应度值、十进制值、二进制编码、量子比特编码 %% 初始化种群 chrom=InitPop(sizepop*2,sum(lenchrom)); %% 对种群实施一次测量 得到二进制编码 binary=collapse(chrom); %% 求种群个体的适应度值,和对应的十进制值 [fitness,X]=FitnessFunction(binary,lenchrom); % 使用目标函数计算适应度 %% 记录最佳个体到best [best.fitness bestindex]=max(fitness); % 找出最大值 best.binary=binary(bestindex,:); best.chrom=chrom([2*bestindex-1:2*bestindex],:); best.X=X(bestindex,:); trace(1)=best.fitness; fprintf('%d\n',1) %% 进化 for gen=2:MAXGEN fprintf('%d\n',gen) %提示进化代数 %% 对种群实施一次测量 binary=collapse(chrom); %% 计算适应度 [fitness,X]=FitnessFunction(binary,lenchrom); %% 量子旋转门 chrom=Qgate(chrom,fitness,best,binary); [newbestfitness,newbestindex]=max(fitness); % 找到最佳值 % 记录最佳个体到best if newbestfitness>best.fitness best.fitness=newbestfitness; best.binary=binary(newbestindex,:); best.chrom=chrom([2*newbestindex-1:2*newbestindex],:); best.X=X(newbestindex,:); end trace(gen)=best.fitness; end %% 画进化曲线 plot(1:MAXGEN,trace); title('进化过程'); xlabel('进化代数'); ylabel('每代的最佳适应度'); %% 显示优化结果 disp(['最优解X:',num2str(best.X)]) disp(['最大值Y:',num2str(best.fitness)]); |
②Qgate.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
function chrom=Qgate(chrom,fitness,best,binary) %% 量子旋转门调整策略 % 输入 chrom:更新前的量子比特编码 % fitness:适应度值 % best:当前种群中最优个体 % binary:二进制编码 % 输出 chrom:更新后的量子比特编码 sizepop=size(chrom,1)/2; lenchrom=size(binary,2); for i=1:sizepop for j=1:lenchrom A=chrom(2*i-1,j); % α B=chrom(2*i,j); % β x=binary(i,j); b=best.binary(j); if ((x==0)&(b==0))||((x==1)&(b==1)) delta=0; % delta为旋转角的大小 s=0; % s为旋转角的符号,即旋转方向 elseif (x==0)&(b==1)&(fitness(i)<best.fitness) delta=0.01*pi; if A*B>0 s=1; elseif A*B<0 s=-1; elseif A==0 s=0; elseif B==0 s=sign(randn); end elseif (x==0)&(b==1)&(fitness(i)>=best.fitness) delta=0.01*pi; if A*B>0 s=-1; elseif A*B<0 s=1; elseif A==0 s=sign(randn); elseif B==0 s=0; end elseif (x==1)&(b==0)&(fitness(i)<best.fitness) delta=0.01*pi; if A*B>0 s=-1; elseif A*B<0 s=1; elseif A==0 s=sign(randn); elseif B==0 s=0; end elseif (x==1)&(b==0)&(fitness(i)>=best.fitness) delta=0.01*pi; if A*B>0 s=1; elseif A*B<0 s=-1; elseif A==0 s=0; elseif B==0 s=sign(randn); end end e=s*delta; % e为旋转角 U=[cos(e) -sin(e);sin(e) cos(e)]; % 量子旋转门 y=U*[A B]'; % y为更新后的量子位 chrom(2*i-1,j)=y(1); chrom(2*i,j)=y(2); end end |
③Objfunction.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function [Y,X]=Objfunction(x,lenchrom) %% 目标函数 % 输入 x:二进制编码 % lenchrom:各变量的二进制位数 % 输出 Y:目标值 % X:十进制数 bound=[-3.0 12.1;4.1 5.8]; % 函数自变量的范围 %% 将binary数组转化成十进制数组 X=bin2decFun(x,lenchrom,bound); %% 计算适应度-函数值 Y=sin(4*pi*X(1))*X(1)+sin(20*pi*X(2))*X(2); |
④InitPop.m
1 2 3 4 5 6 7 8 9 10 11 12 |
function chrom=InitPop(M,N) %% 初始化种群-量子比特编码 % M:为种群大小×2,(α和β) % N:为量子比特编码长度 for i=1:M for j=1:N chrom(i,j)=1/sqrt(2); end end |
⑤FitnessFunction.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function [fitness,X]=FitnessFunction(binary,lenchrom) %% 适应度函数 % 输入 binary:二进制编码 % lenchrom:各变量的二进制位数 % 输出 fitness:适应度 % X:十进制数(待优化参数) sizepop=size(binary,1); fitness=zeros(1,sizepop); num=size(lenchrom,2); X=zeros(sizepop,num); for i=1:sizepop [fitness(i),X(i,:)]=Objfunction(binary(i,:),lenchrom); % 使用目标函数计算适应度 end |
⑥collapse.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
function binary=collapse(chrom) %% 对种群实施一次测量 得到二进制编码 % 输入chrom :为量子比特编码 % 输出binary:二进制编码 [M,N]=size(chrom); %得到种群大小 和编码长度 M=M/2; % 种群大小 binary=zeros(M,N); %二进制编码大小初始化 for i=1:M for j=1:N pick=rand; %产生【0,1】随机数 if pick>(chrom(2.*i-1,j)^2) % 随机数大于α的平方 binary(i,j)=1; else binary(i,j)=0; end end end |
⑦bin2decFun.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
function X=bin2decFun(x,lenchrom,bound) %% 二进制转化成十进制 % 输入 x:二进制编码 % lenchrom:各变量的二进制位数 % bound:各变量的范围 % 输出 X:十进制数 M=length(lenchrom); n=1; X=zeros(1,M); for i=1:M for j=lenchrom(i)-1:-1:0 X(i)=X(i)+x(n).*2.^j; n=n+1; end end X=bound(:,1)'+X./(2.^lenchrom-1).*(bound(:,2)-bound(:,1))'; |
结果:
参考文献:
史峰. MATLAB智能算法30个案例分析[M]. 北京航空航天大学出版社, 2011.