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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

9 C) _9 P& ], |7 y量子遗传算法就是基于量子计算原理的一种遗传算法。将量子的态矢量表达引入了遗传编码,利用量子逻辑门实现染色体的演化,实现了比常规遗传算法更好的效果。  f& J* C& G# J9 P

* v* _: u& Z! }+ ]) I3 B/ Z5 d量子遗传算法建立在量子的态矢量表示的基础之上,将量子比特的几率幅表示应用于染色体的编码,使得一条染色体可以表达多个态的叠加,并利用量子逻辑门实现染色体的更新操作,从而实现了目标的优化求解。
% F  @, {, x0 J" z; r  R+ [
* y0 Y6 J7 T$ D3 T6 hMatlab代码:% k" {4 ~3 a  i- R- R0 C8 @1 F% ~
" y5 F. ^0 @  U. F
①QuantumMain.m, V. n1 b& G9 j$ R8 X- V8 }
" x' Z0 r; S1 y! E  Y4 A
  • 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)]);
    $ w1 o0 _7 C1 y) U) R% U4 R1 P" a2 M
           
: c* I0 k3 H" U1 B$ G
; `/ d+ G; k! Q" Z②Qgate.m
) {5 S6 S* ?/ I! X* o. b2 H0 Y! c+ e+ 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
    % S6 @# R7 G2 Y) X5 J' |0 ^8 N7 m5 d
      : m6 [$ k% U. I. \4 D* F/ K, r: R

) T" \# v$ z( @3 B: {7 N③Objfunction.m
% o6 }- P' _6 c9 l/ H
% \) g* C( v: Q( t5 ]
  • 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);
    1 t5 B) ?7 @% j  K5 V* d0 w4 F( `7 @
       ! m* [: ]- y; n2 Q" P2 r4 x9 d6 Y" T

. w. Y" h4 A/ T: i& \9 E④InitPop.m
: @. h- U0 V3 H2 ~* M& e$ A, J" i
; |# I3 ^0 \! z& c2 c. x, Y6 [3 [
  • function chrom=InitPop(M,N)
  • %% 初始化种群-量子比特编码
  • % M:为种群大小×2,(α和β)
  • % N:为量子比特编码长度
  • for i=1:M
  •     for j=1:N
  •         chrom(i,j)=1/sqrt(2);
  •     end
  • end6 y0 U- `- c$ Q9 X
   
& l* Y/ F& p. M' K5 q
3 \$ O3 Z$ B, \! M1 C4 `⑤FitnessFunction.m
3 U0 v( X! \0 v4 P& {3 d5 [1 D  Y3 Q1 t) O$ {# 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);         % 使用目标函数计算适应度
  • end4 O$ r; G: U* a) E$ D( M/ u) _* J
     
4 v- q' b, a% k7 g0 }8 b: t9 R
9 U0 f1 E( J3 u⑥collapse.m
9 M) w8 @  K: E# Q1 D8 ~& D- ?4 V3 G6 R) F+ M% [- [
  • 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
    # F5 l) K! E) P4 f: w% S
   
! Q- h; Y8 v) I; ?$ e- M; z2 N4 d% L% H) E% ?5 m
⑦bin2decFun.m
! k5 E" c( Q1 A; D3 r
2 K( v- R( }! I; U' U0 ~' S* s
  • 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))';
    . j% Z; N% Z% p. T* v' B- o1 T
     ( U5 Y( ?$ E) s
9 u! n- q9 n. |6 n3 l
结果:
/ R3 Y1 i! R. ^5 x# h+ y& N
% u! ?" q, @9 t9 R: {6 ]1 r
  • 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-7-23 04:51 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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