前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于量子遗传的函数寻优算法MATLAB实现

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

作者头像
里克贝斯
发布2021-05-21 16:32:24
8110
发布2021-05-21 16:32:24
举报
文章被收录于专栏:图灵技术域图灵技术域

量子遗传算法就是基于量子计算原理的一种遗传算法。将量子的态矢量表达引入了遗传编码,利用量子逻辑门实现染色体的演化,实现了比常规遗传算法更好的效果。

量子遗传算法建立在量子的态矢量表示的基础之上,将量子比特的几率幅表示应用于染色体的编码,使得一条染色体可以表达多个态的叠加,并利用量子逻辑门实现染色体的更新操作,从而实现了目标的优化求解。

Matlab代码:

①QuantumMain.m

MATLAB

代码语言:txt
复制
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)]);

②Qgate.m

MATLAB

代码语言:txt
复制
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

③Objfunction.m

MATLAB

代码语言:txt
复制
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);

④InitPop.m

MATLAB

代码语言:txt
复制
function chrom=InitPop(M,N)
%% 初始化种群-量子比特编码
 
% M:为种群大小×2,(α和β)
 
% N:为量子比特编码长度
 
for i=1:M
    for j=1:N
        chrom(i,j)=1/sqrt(2);
    end
end

⑤FitnessFunction.m

MATLAB

代码语言:txt
复制
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

⑥collapse.m

MATLAB

代码语言:txt
复制
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

⑦bin2decFun.m

MATLAB

代码语言:txt
复制
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))'; 

结果:

参考文献:

史峰. MATLAB智能算法30个案例分析[M]. 北京航空航天大学出版社, 2011.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档