|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
8 |: B+ N, @9 U- v6 a# o9 `量子遗传算法就是基于量子计算原理的一种遗传算法。将量子的态矢量表达引入了遗传编码,利用量子逻辑门实现染色体的演化,实现了比常规遗传算法更好的效果。3 D7 ?, O4 P' M
8 X. S( Z* s0 h量子遗传算法建立在量子的态矢量表示的基础之上,将量子比特的几率幅表示应用于染色体的编码,使得一条染色体可以表达多个态的叠加,并利用量子逻辑门实现染色体的更新操作,从而实现了目标的优化求解。9 V! n" F6 j' \ J4 J d6 b
- w! E$ J* y) a, B6 H, P
Matlab代码:7 u% J) V9 _, b9 P( |3 |
0 \/ H" W- D4 b! S% }- W①QuantumMain.m
6 S% o+ y4 X( z4 y
8 L; k. A) r$ v' H" m; u) G- 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)]);
6 o+ X8 B# F- ^ 7 k) G& P! K' m
0 q! e( H1 a/ ?) g5 R9 S9 N
②Qgate.m
& x: |! r9 f0 T, I) h( U) R' D! A7 \& j# W# [! B* P
- 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
- end5 C6 z" _% h6 g& y! R
% V! a2 p5 |8 @: i* Z6 _
& ]& |! V, |, I6 c/ S7 k③Objfunction.m
% K) h+ G0 G$ T, h6 F" l8 t# o& H$ m8 ~+ H E
- 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);2 j0 @+ ~' N$ R( Q3 r8 ^6 Q
4 {8 [+ M) j5 x* x6 M5 {- K
, ~- q. I& l, S% p2 Y$ p④InitPop.m
$ W) R% k1 [# N% ~' C* r. y! g i- ~
- function chrom=InitPop(M,N)
- %% 初始化种群-量子比特编码
- % M:为种群大小×2,(α和β)
- % N:为量子比特编码长度
- for i=1:M
- for j=1:N
- chrom(i,j)=1/sqrt(2);
- end
- end
5 ]* j' b# S1 V! k7 S( w1 } # o" r% J' b# N5 e
r4 L6 f% W E⑤FitnessFunction.m# Z0 n* e0 S o% m) q m
$ [. w0 H) C+ Y! `* @
- 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
# p; @3 D. d& e; Y
$ n5 n+ F7 q$ a" }, Z! {& w( C; F# \2 O3 q( r. ~
⑥collapse.m
0 W& I H) h. @6 Q. s+ @2 b8 }5 C4 H4 q1 f( t* `
- 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
( q4 x3 e% `" j9 i# N% J3 ?2 v( [
3 {6 Y, I1 h6 {* O7 ?, n
9 P- ~+ X1 I% a- f+ l; N; e⑦bin2decFun.m4 I* k# v- o1 e" ]& Y
& b* i1 J; ^1 ^6 G- c5 d- 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))';7 d% f1 F* U% D* I5 Z, @
2 W( w. q5 ? T ^3 S* [1 t6 T4 {
结果:
7 r, m. Y7 j+ C- K; K
4 L& k! F9 I( l5 `, F9 d
|
|