|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
, Z4 v* \& t" Z) s4 F7 t' W% z量子遗传算法就是基于量子计算原理的一种遗传算法。将量子的态矢量表达引入了遗传编码,利用量子逻辑门实现染色体的演化,实现了比常规遗传算法更好的效果。* B$ N3 `1 s( O! O4 A# v
o4 W' E" f: L量子遗传算法建立在量子的态矢量表示的基础之上,将量子比特的几率幅表示应用于染色体的编码,使得一条染色体可以表达多个态的叠加,并利用量子逻辑门实现染色体的更新操作,从而实现了目标的优化求解。
- a- ~1 f1 o8 @# P" l
1 o& T, W2 G$ `/ y% OMatlab代码:& b' m0 \7 O7 }3 J0 v; ?
) \# a7 ~0 X- m3 w5 Q. Q
①QuantumMain.m4 E ~" P: x" k3 t
& f0 V2 g9 |9 Z! A# i
- 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)]);" t- A8 N9 Y: Y! v+ G v. E
/ L' ^) q: u7 ]9 n- S
$ T5 F5 h4 z0 T* Q②Qgate.m
; q9 ? n1 Z, G9 f7 [7 \% `7 T3 A4 B' a2 m# E. ~
- 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( i6 g' d8 t, r% W5 w4 A
8 \. ?5 e! i. |7 N3 X. V( G
9 x) i" |7 B' Z7 S0 _③Objfunction.m
1 |+ c: z3 V- I# D# G' t/ p
8 ~7 F* g/ {7 g% v/ R- z- 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);0 b+ f/ a/ f/ Q+ @: X/ q
V' u5 ]3 Z) T2 f0 E, j# @, L
8 m+ h5 p$ \+ j4 h5 Y④InitPop.m5 Z1 ^* W; m8 T: J$ q7 |
7 ?$ Z! m' q4 X9 [8 A
- function chrom=InitPop(M,N)
- %% 初始化种群-量子比特编码
- % M:为种群大小×2,(α和β)
- % N:为量子比特编码长度
- for i=1:M
- for j=1:N
- chrom(i,j)=1/sqrt(2);
- end
- end
" v1 `3 d5 X4 J$ ^2 R
% A' i# O% q3 f% s+ r! @3 n7 M+ W( t: \& F
⑤FitnessFunction.m" w( g) p! r( J9 Y$ y5 ]' @9 w
% N+ p `: ]7 \6 J$ 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
" A8 e' v/ E9 m: |6 q! e7 A . [: t2 o4 B! ]# n% h, K
8 b* z# \4 M8 q$ M9 y ]
⑥collapse.m
+ x/ T9 H1 q; _
* j" ]& P9 s& Q7 a7 |% 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 L: O# Y% W3 c$ V, h, d/ [ " V$ t$ k$ \1 c4 B1 ~3 J
- _& l: b" q" `
⑦bin2decFun.m
8 h" l8 h1 Z2 t( j+ I
+ C1 W+ _+ r" n# c4 ~- 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))';
1 ~/ c" I2 S: c 4 x8 a" k. y( P$ |, d
) O3 v" W/ i7 Y8 a6 t结果:! B" ] v: f2 Z4 `2 L k: P
/ \$ X9 F3 l+ Y |
|