📄 main.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 + -