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

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

[复制链接]

该用户从未签到

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

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
  • 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-10-7 07:46 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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