找回密码
 注册
关于网站域名变更的通知
查看: 588|回复: 1
打印 上一主题 下一主题

量子遗传的函数寻优算法MATLAB实现

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-10-16 09:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
1 P( T6 r1 H2 R, ^: Z! B
量子遗传算法就是基于量子计算原理的一种遗传算法。将量子的态矢量表达引入了遗传编码,利用量子逻辑门实现染色体的演化,实现了比常规遗传算法更好的效果。0 W6 D% a: E5 t3 p- q

/ [" T2 y, M) W2 k& p3 _量子遗传算法建立在量子的态矢量表示的基础之上,将量子比特的几率幅表示应用于染色体的编码,使得一条染色体可以表达多个态的叠加,并利用量子逻辑门实现染色体的更新操作,从而实现了目标的优化求解。. o6 p6 N( l" j% @4 G+ ~  T

5 W; B8 A' @2 ZMatlab代码:
' C0 a) w! c+ Q, }4 `" N0 U
0 s* F+ K$ \$ Q! i4 l①QuantumMain.m
) y3 u8 r! A  m' r9 R" ]
0 ?) n0 N! O8 W# x* j4 y
  • 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)]);
    * k  |. y) H" P% a$ A
           " W, N6 w5 q& {' e
/ f1 J  Q5 q  v1 p; ~! [- P8 o
②Qgate.m
; U* O9 {+ M; N  U% v- p8 w& g; k! I5 E# 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
  • end3 Q+ {0 A. Z8 K* v7 R
      " x; `$ K7 Q0 x: m6 V: ?. R

7 G* d1 T- U9 O6 ^) F③Objfunction.m
" p& |% E9 d1 m: y* i: ?
6 r6 v; W$ r- c% y+ t0 z8 M
  • 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 Y; m( U9 e; k* E; w
       ' v9 @* {4 M2 Y6 {

# f8 Y8 j; i  n④InitPop.m
% X0 P6 A! m) R1 [
! s  Q! z9 p( d/ X
  • function chrom=InitPop(M,N)
  • %% 初始化种群-量子比特编码
  • % M:为种群大小×2,(α和β)
  • % N:为量子比特编码长度
  • for i=1:M
  •     for j=1:N
  •         chrom(i,j)=1/sqrt(2);
  •     end
  • end
    / D4 M% d# v9 U: z. g5 t
   
) |& ]0 Q: J7 F- r! H' G% G  K/ X- N  x3 e7 n) q" j
⑤FitnessFunction.m
+ ~8 {& H. n9 i; |8 U- d7 \. z/ @& [9 v
  • 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);         % 使用目标函数计算适应度
  • end0 f: j( N& k" g$ j9 l' j, w7 u
     ' I% ?3 T+ d  Z  Z' ?! @

3 l7 E* n: @$ e8 K& n⑥collapse.m5 a0 Y" ?% D- Y0 z" {
0 r- q# p+ n& s, n1 y: M. x/ t" L
  • 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) }& K; N# ]  a7 M; p5 O. {
   ! z/ B- K' c# m/ A; G3 Y
; `2 h* S! P$ L9 a" g
⑦bin2decFun.m
8 [8 h$ \" q+ h, _( x/ G
+ u& e) D7 ^2 o  x. K+ T  t; T
  • 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))';
    / l: q, g: ?7 a, Z! z+ V
     
; J! m& E5 e2 D& e. W& H/ L, q8 K8 e/ |) ]4 O
结果:
& E# A7 {) m- T5 P& b7 u
/ `, r' H. r7 [) w4 y. G
  • TA的每日心情

    2019-11-19 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-10-16 11:00 | 只看该作者
    量子遗传的函数寻优算法MATLAB实现
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 13:15 , Processed in 0.171875 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表