⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.m

📁 量子遗传算法MATLAB源代码
💻 M
字号:
% 主函数,整个算法包含排序,移民、灾变,存在BUG
% main
%function [EMinB,HInd,HTar,w]=main();
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 个体初始化                          function [individualP,individualR]=InitiaInd(n,k,numLayer,bestIndR)
% 初始个体数据随机发生器 CreatQ        function [ai,bi,R]=CreatQ(n,var,i,numLayer,bestIndR)    量子态Q为ai与bi,计算单个变量的量子串与十进制值
% 得到二进制观察态C,计算出十进制解R     function [R]=tranQ2R(ai,n,var,i,numLayer,bestIndR)
% 第preGen代种群适应度计算             function [E_AGen,EMin_AGen,A]=FitEva(n,k,m,w,wp,ws,wt,pop,HTar,communityR,preGen,maxGen)
% 计算个体频域                        function [HInd,A]=FreqCalcu(n,k,m,w,HTar,individualR)
% 移民函数                            function [individualQ,individualR]=Migration(n,k,preGen,migGen,migRate,numLayer,bestIndR,individualQ,individualR)
% 灾变操作                            function [preGenC,communityQ,communityR,flagC]=Catastrophe(n,k,pop,EMinB,preGen,preGenC,catGen,numLayer,bestIndR,communityQ,communityR)
% 生成量子门并更新个体                 function [individualQ,individualR]=Gate(n,k,ii,preGen,preGenC,maxGen,numLayer,bestIndQ,bestIndR,individualQ,individualR)
% 目标函数的幅频响应                   function[HTar]=Target(m,w,wt,wp,ws)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;
layer=4                              % 遗传算法层数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:2*layer
    clf(figure(i));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
maxGen=200                           % 最大运行代数
pop=50                               % 种群数量
preGen=0;                            % 当前代数
n=20;                                % 量子位长度
k=3;                                 % 系统单元数
m=512;                               % 频域抽样点数
w=[0:pi/(m-1):pi];                   % 数字频率范围
wt=0.44*pi                           % 逼近边界
wp=0.4*pi                            % 通带边界
ws=0.5*pi                            % 阻带边界
bestIndQ=zeros(2,n,4,k);             % 最佳个体量子位数据
bestIndR=zeros(4,k);                 % 最佳个体实数解数据
individualQ=zeros(2,n,4,k);          % 量子态个体
individualR=zeros(4,k);              % 十进制态个体
communityQ=zeros(2,n,4,k,pop);       % 种群量子位数据库
communityR=zeros(4,k,pop);           % 种群实数解数据库
E=zeros(maxGen+1,pop);               % 种群适应度
EMin=zeros(1,maxGen);              % 种群历代最佳个体适应度
EMinB=zeros(1,maxGen);             % 最佳个体历代适应度
flag=zeros(1,maxGen);                % 群体灾变处
catGen=50;                           % 最大种群停滞代数即灾变代数
migGen=20;                           % 移民间隔代数
migRate=0.1;                         % 移民率
preGen=1; 
preGenC=1;
A=zeros(1,pop);                      %种群的个体前置系数
A_Best=0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[HTar]=Target(m,w,wt,wp,ws);            %逼近函数频域计算
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for numLayer=1:layer
    %生成初始种群
    for i=1:pop
        [communityQ(:,:,:,:,i),communityR(:,:,i)]=InitiaInd(n,k,numLayer,bestIndR);      % 单个个体数据进入种群数据库
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % 单层计算
    preGen=1;preGenC=1;
    E=zeros(maxGen+1,pop);               % 种群适应度
    EMin=zeros(1,maxGen);                % 种群历代最佳个体适应度
    EMinB=zeros(1,maxGen);               % 最佳个体历代适应度
    for i=1:maxGen
        % 进行种群适应性分析并得出当前代最佳个体位置
        [E(i,:),EMin(i),A]=FitEva(n,k,m,w,wp,ws,wt,pop,HTar,communityR,preGen,maxGen); 
        [communityQ,communityR,E(i,:),A]=PaiXu(pop,E(i,:),A,communityQ,communityR);
        if i==1
            bestIndQ(:,:,:,:)=communityQ(:,:,:,:,pop);              % 初始代最佳个体量子位数据
            bestIndR(:,:)=communityR(:,:,pop);                      % 初始代最佳个体实数解数据
            EMinB(i)=EMin(i);
            A_Best=A(pop);
        else
            if EMin(i)<=EMinB(i-1)                                  % 若移民后个体误差值大于原个体,则保存原个体
                bestIndQ(:,:,:,:)=communityQ(:,:,:,:,pop);          % 当前代最佳个体量子位数据
                bestIndR(:,:)=communityR(:,:,pop);                  % 当前代最佳个体实数解数据
                EMinB(i)=EMin(i);
                A_Best=A(pop);
            else
                EMinB(i)=EMinB(i-1);
            end
        end
        %%%%%%%%%%%%%%% 
        % 移民
        if 0==mod(preGen,migGen)
            for ii=pop-20:pop
            %ii=pop;
            [communityQ(:,:,:,:,ii),communityR(:,:,ii)]=Migration(n,k,preGen,migGen,migRate,numLayer,bestIndR,communityQ(:,:,:,:,ii),communityR(:,:,ii));    % 移民操作
            end
        end
        %%%%%%%%%%%%%%%%%%%%%%%%%%%
        % 灾变
        %[preGenC,communityQ,communityR,flag(i)]=Catastrophe(n,k,pop,EMinB,preGen,preGenC,catGen,numLayer,bestIndR,communityQ,communityR);    % 灾变操作
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % 好个体移民操作后取代差个体
        for ii=1:20
            [communityQ(:,:,:,:,ii),communityR(:,:,ii)]=Migration(n,k,preGen,migGen,migRate,numLayer,bestIndR,communityQ(:,:,:,:,30+ii),communityR(:,:,30+ii));          
        end
        %%%%%%%%%%%%%%%
        %画出最终代最佳个体与目标函数
        if i==maxGen
            figure(0+numLayer)
            [HInd,A_Best]=FreqCalcu(n,k,m,w,HTar,bestIndR(:,:));
            plot(w/pi,abs(HInd),'k');grid on;hold on 
            plot([ws/pi,ws/pi],[0,1.2],'g');
            plot([wp/pi,wp/pi],[0,1.2],'g');
            axis([0,1,0,1.2]);
            plot(w/pi,HTar);grid on
            figure(layer+numLayer)
            plot(w/pi,20*log10(abs(HInd)),'r');grid on;hold on
            plot([ws/pi,ws/pi],[-80,5],'g');
            plot([wp/pi,wp/pi],[-80,5],'g');
            axis([0,1,-80,5]);
        end
       % 生成量子门并更新种群
        for ii=1:pop
            [communityQ(:,:,:,:,ii),communityR(:,:,ii)]=Gate(n,k,ii,preGen,preGenC,maxGen,numLayer,bestIndQ,bestIndR,communityQ(:,:,:,:,ii),communityR(:,:,ii));  %个体更新
        end
        preGen=preGen+1;
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%画等阶数MATLAB的巴特沃兹数字低通滤波器
%figure(1)
%[num,den]=butter(2*k,wp/pi);
%Hb=freqz(num,den,w);
%plot(w/pi,abs(Hb),'g');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%






















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -