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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
! m) u( [( @. P$ J! F3 Z. v  o# x
量子遗传算法就是基于量子计算原理的一种遗传算法。将量子的态矢量表达引入了遗传编码,利用量子逻辑门实现染色体的演化,实现了比常规遗传算法更好的效果。9 E5 {1 J# k( F) G' S8 \  O& [  c
) F6 P2 C4 s% o
量子遗传算法建立在量子的态矢量表示的基础之上,将量子比特的几率幅表示应用于染色体的编码,使得一条染色体可以表达多个态的叠加,并利用量子逻辑门实现染色体的更新操作,从而实现了目标的优化求解。3 u, J3 i% o! S
( z7 M8 `+ V! h9 ~! [; G( Y  a
Matlab代码:9 N2 U* J  j; `" }4 \* R
0 }4 S, a+ l# L+ I: `0 H
①QuantumMain.m
' c8 Q6 H! x3 d% G6 w2 V. U4 b7 S1 ]6 [, u5 L
  • 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 x# W6 W6 U/ w
           & i3 w- B9 I1 Q/ k& q

) g4 M- R6 k8 r9 J" U' p& [+ @②Qgate.m1 N+ @" ~/ i- ^- E( I& p  }
- v1 g9 o+ s6 i
  • 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
  • end1 r: e. o+ k1 d' A% a( t1 V
      + \& w0 F6 K( Q
* K) n) V8 Y- J4 {7 B
③Objfunction.m
0 d; G: r/ O8 h1 C. h9 A! h' O8 i+ @5 |
  • 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);7 i. Z  @! t+ N# l: g
      
% {* ?* J! `# ]7 W
4 j: u) l  t6 r7 D④InitPop.m
: t) H9 J1 `$ H& F, M$ }! e3 }) ~9 F0 l5 \6 L; O) Q
  • function chrom=InitPop(M,N)
  • %% 初始化种群-量子比特编码
  • % M:为种群大小×2,(α和β)
  • % N:为量子比特编码长度
  • for i=1:M
  •     for j=1:N
  •         chrom(i,j)=1/sqrt(2);
  •     end
  • end4 ]! y3 T% Q/ t6 d7 }2 X1 P( n
   ( \) s2 n  I. H$ j' m
8 c& A( F/ ]8 N8 G3 G% h
⑤FitnessFunction.m
4 x- v" S2 d* X  F6 d6 w7 I4 q5 k  ~! S/ |
  • 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* S% I7 C0 {( O9 r: c
     
! A, K4 h7 @! y- E8 Y. C1 B5 t2 A6 Y3 o+ I# i3 c
⑥collapse.m
, `: a9 I* e; ^/ ^( m, n3 g; w. ?% \. m  u2 Z
  • 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$ ^% C. Q& J+ ]7 s/ Z
   4 o7 c, C% n4 y$ }
  a" |" Q, J) n- j
⑦bin2decFun.m  L6 j* [3 l; z8 _
$ j1 [# F2 A; }5 e0 R+ ^; M% X8 K
  • 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 T/ b6 t- u/ v; q8 g7 [1 P$ X
     0 J# N* ]6 }2 G' n5 g
. J- \! k0 q- d/ W) e; U
结果:
  m5 ]( z# N: z( R  ^# N3 J
1 |& R4 f+ }$ g/ \( i! c- n: z
  • 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 22:17 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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