|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6 _8 b' G7 P/ }% z/ A+ w
量子遗传算法就是基于量子计算原理的一种遗传算法。将量子的态矢量表达引入了遗传编码,利用量子逻辑门实现染色体的演化,实现了比常规遗传算法更好的效果。1 s. b, a, Y; P2 L
2 y3 @) x8 w3 H9 t& T, l! s' S9 s* B) s量子遗传算法建立在量子的态矢量表示的基础之上,将量子比特的几率幅表示应用于染色体的编码,使得一条染色体可以表达多个态的叠加,并利用量子逻辑门实现染色体的更新操作,从而实现了目标的优化求解。
. B* I' Z; [% Q& \0 V( u5 _) E& I! Q) F( s
Matlab代码:1 q* g5 o# _" v2 |. T
. `4 r) V- @) h/ e7 t H①QuantumMain.m$ w2 h$ }" x! b) A J2 ^
& J" K5 Z* f0 H. N- 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)]);
3 x! J1 D& N0 G; N3 p& n" D
: \' R# x2 `; |+ K, ]- x
- Z1 g; q9 p3 ~& [* j②Qgate.m2 i, S. \9 W: C" l0 l& b
2 r! U" m6 @3 V7 c
- 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
0 q, n' y! ~; D1 g
$ T- I+ X9 F+ V. F5 v3 N/ O2 i* H! X2 j) J( w
③Objfunction.m
! s! E9 @& [* @3 e, @
_+ Y. J& G! h$ \3 [- 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);" ~4 w5 R) R: ]5 j3 F
& ^ ~4 L% d$ [/ E$ ?+ o* _; |
) _, a) b1 e$ ?8 f* l④InitPop.m0 P1 \$ u% r; P# a; r! V2 y: E. Q
# z7 o% T) ~) Z0 P/ g. r$ T9 @4 C4 y
- function chrom=InitPop(M,N)
- %% 初始化种群-量子比特编码
- % M:为种群大小×2,(α和β)
- % N:为量子比特编码长度
- for i=1:M
- for j=1:N
- chrom(i,j)=1/sqrt(2);
- end
- end& v: i$ @ Z4 z" @' S
3 ] ?, M8 t6 j( H* a5 Z, q. v$ x& `- i4 r4 G' K
⑤FitnessFunction.m) P& o! d- d: B) A" Z Z# u0 ^. \
( B, ?1 L, h3 O# D2 K$ H% ?* R2 i3 z. N- 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. z- D9 a9 Q4 R1 k4 b. c) u
7 y5 z4 T* z& Q- x D3 A9 g: t9 N% b% N: K' P" Z: o
⑥collapse.m
3 R u3 R( S R: \+ w% g3 R5 B3 R8 e6 [0 q# x
- 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( ~5 ]+ P8 Z9 }; N
6 K( P8 O& n- y9 m# |$ x
8 c' C# l% ^" d# J: O⑦bin2decFun.m" I1 @+ u3 X; f$ [
+ N$ }: F# r* s# \+ k3 W- 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))';' X* N' r$ L, x8 }9 _+ Z4 t
# Y( e. [* R# ~4 P& v
* j+ M- I& c1 o/ h4 A; C结果: [- _) i/ y8 N" w$ ^
" j [/ |; Z; c5 |7 z5 Q
|
|