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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

# E  g8 L; c. e* W' o' ]量子遗传算法就是基于量子计算原理的一种遗传算法。将量子的态矢量表达引入了遗传编码,利用量子逻辑门实现染色体的演化,实现了比常规遗传算法更好的效果。
- h" i9 S1 y: y; T
4 \" o6 [: a) _3 @& A  [* x3 N4 G量子遗传算法建立在量子的态矢量表示的基础之上,将量子比特的几率幅表示应用于染色体的编码,使得一条染色体可以表达多个态的叠加,并利用量子逻辑门实现染色体的更新操作,从而实现了目标的优化求解。1 }3 G: d' a2 Q0 Z
9 V) V' m, x9 y% z+ c% q7 ~
Matlab代码:
$ q/ C; x( U9 |2 U* I% G
$ D1 }4 q  q* o2 |, ?  I2 j, t①QuantumMain.m
% V! `4 A* e: F: s3 d
9 l$ i" b5 T9 H+ f
  • 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)]);& v0 `% F8 o' d
           $ |" X' `: u$ h  P1 e/ a& l" K

: N+ C2 D% k6 ~7 g$ I  x②Qgate.m
7 M9 D- I7 c) `1 s7 z, x) j3 N/ M. T) D" ?, J# 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
  • end( g5 u% |# v: }2 l$ ~7 O1 G
      
* k4 A7 M# @* Y7 a9 r# u% m9 F$ X8 e: A1 C
③Objfunction.m
" Q- y/ p9 ^8 G9 f. ^
* G$ |" \2 T% ^& E! Q
  • 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);
    ! q) n$ ]  R8 v
      
% ?: Y0 ?6 t$ [+ J! S
4 k  `, ?+ ^+ w0 G" y. Q④InitPop.m
* J8 e3 `$ d/ [1 C, |3 a$ `
' |" U# ]0 _6 ~/ ]' B
  • function chrom=InitPop(M,N)
  • %% 初始化种群-量子比特编码
  • % M:为种群大小×2,(α和β)
  • % N:为量子比特编码长度
  • for i=1:M
  •     for j=1:N
  •         chrom(i,j)=1/sqrt(2);
  •     end
  • end6 @. `  S- \+ ~# p0 f$ V
   & I1 T' O! M, @/ l8 F4 d

3 I! F/ Q) i/ \7 i+ J1 e⑤FitnessFunction.m
4 r. u( R* ]+ T+ F  s( O/ e0 x9 J  m/ c7 [' V- n4 [7 o/ E. H6 e
  • 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- T) d) }; ?; S& h  n3 M- \
     
9 }. j- t( V: {' D, X( S) P/ _- F) G; U- d% p0 o
⑥collapse.m5 v- r6 k" [- X8 P& L7 `
/ O: x& G$ t8 Q/ S, ?" P
  • 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. O- @$ G7 b- X
   , C9 }$ x: k$ n4 D9 @* g1 d4 i
5 n8 K8 a% ]; ^% e0 F  s
⑦bin2decFun.m$ n# N3 k7 {2 T2 F

9 N) S5 S/ E/ ?8 P0 P! i% Q" a
  • 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))';
    . I9 m" d1 p. u
     , ]$ u" h. K3 E$ s6 N, I6 o* z

: c' z! i( [) l* j* w: V结果:
# ?2 D0 L2 z3 n 7 Q9 C8 K; E# ?
  • 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 11:37 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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