|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
: f8 J) E* i. w8 O' V
量子遗传算法就是基于量子计算原理的一种遗传算法。将量子的态矢量表达引入了遗传编码,利用量子逻辑门实现染色体的演化,实现了比常规遗传算法更好的效果。6 H0 y, I( @5 N( J Z9 K0 g
/ {) M' b; E7 P' `: |7 b
量子遗传算法建立在量子的态矢量表示的基础之上,将量子比特的几率幅表示应用于染色体的编码,使得一条染色体可以表达多个态的叠加,并利用量子逻辑门实现染色体的更新操作,从而实现了目标的优化求解。
' q5 l1 f) f+ b& R1 I. Y# h# J. o; Z# t4 L, f
Matlab代码:3 n9 a7 v) P/ f1 R# n: ^8 ~& e+ A
9 Y) @6 H5 p+ d/ q5 K+ E! w+ M% ^①QuantumMain.m
. ] Z: O; p- A1 e6 w1 I+ E
) s; P& s+ O1 c* O- 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)]);! p5 L; J1 m5 D z& Q2 M' d
8 U" ^+ n. y& L' b6 E
- f* a. e) ]3 e7 \" D9 s②Qgate.m+ z( x1 M y) D! v3 D$ W
5 L+ C. G7 N6 D" W- v* Y! K) ~- 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
t |, G, G/ K. p
E" b- |. e& S' T9 p1 M5 _- U! j" u+ t# h
③Objfunction.m
! _6 f' n, H/ W. k z' d) W% S2 r, [& ]2 a* }6 Q2 h
- 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);
% e4 S. N0 K- @2 U) }
! @1 R0 Y4 a' a( T+ b, `) _- V+ H+ _+ A) ~! r. O. Q( |
④InitPop.m8 W; f7 P/ t& [' u' q1 z" V
4 M* m& J$ [) k! f
- function chrom=InitPop(M,N)
- %% 初始化种群-量子比特编码
- % M:为种群大小×2,(α和β)
- % N:为量子比特编码长度
- for i=1:M
- for j=1:N
- chrom(i,j)=1/sqrt(2);
- end
- end
$ ~+ o9 x; V, q' S4 u% a; O, i
3 o4 n" z6 J8 c: c) {; H3 O3 {9 Y5 C( s6 m7 B
⑤FitnessFunction.m
9 `6 I: W, A% H. }+ d) W, `8 s3 h' I: x- T
- 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, q: ~4 e/ G, v* T4 I- Q
% ` D8 Q; L4 l6 f0 g! D1 i* R* m! D3 m3 ?+ f: j; j' p9 p. [
⑥collapse.m. \. A' L5 _5 q( D; s$ N- A& N
$ L0 N" a0 n- Z( F4 j- 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
- end8 U" l6 C2 S+ L* g+ {' S2 D- c+ D. a
8 Y- |' V* {& w2 u x# c6 y1 u$ K
0 E6 m+ s$ p! D; ^4 p& Z
⑦bin2decFun.m" ?6 C" u$ Z, a' j# B% w
" t5 I3 c5 y' Q2 s& V
- 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))';
3 {! M* x5 p, Y & S' B0 y) a2 b2 @; U( p
& q* m: G" V9 z0 K5 X: y结果:
! a6 x5 Q# h7 e5 U1 y8 d* l
6 u" d5 l% h+ P. h3 s2 z |
|