关闭

关闭

关闭

封号提示

内容

首页 基于遗传算法的稀布阵.doc

基于遗传算法的稀布阵.doc

基于遗传算法的稀布阵.doc

上传者: 创始者 2011-10-10 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《基于遗传算法的稀布阵doc》,可适用于IT/计算机领域,主题内容包含主函数位于x轴上的不等间距直线阵列,参考文献《一种有阵元间距约束的稀布阵天线综合方法陈客松》clc,clear,clfformatT=clocks=符等。

主函数位于x轴上的不等间距直线阵列,参考文献《一种有阵元间距约束的稀布阵天线综合方法陈客松》clc,clear,clfformatT=clocks=sprintf('程序正在运行中请稍等')disp(s)N=阵元数L=阵列孔径dc=最小阵元间距SP=L(N)*dcSP为孔径上剩余布阵区间长度popsize=设置初始种群规模pc=设置初始交叉概率pm=设置初始变异概率numitera=设置迭代次数chromlength=N设置初始决策变量个数In=设各个阵元激励是等幅同相的res=设置采样点数也就是分辨率theta=:pires:pitheta是观察方向与阵轴的夹角theta=*pitheta为波束指向当为*pi时为侧射阵u=cos(theta)cos(theta)pop=initpop(popsize,chromlength,SP,L,dc)运行初始化函数产生初始化种群num=初始化循环变量(现在是只有完成所要求的迭代次数循环才会终止)bestindividual=ones(numitera,N)保存每次迭代的最佳值whilenum<=numitera设置程序终止条件SLLmax,Elog=calobjvalue(pop,popsize,N,u,res)计算目标函数并求出最大峰值旁瓣fitvalue=calfitvalue(SLLmax,popsize)计算适应度值的大小newpop=select(fitvalue,popsize,pop)newpop为经过轮盘赌选择之后的新的种群newpop=pretreat(newpop,popsize,dc,chromlength)遗传操作预处理newpop=crossover(newpop,popsize,pc,N)进行交叉运算newpop=mutation(newpop,popsize,pm,N,SP)进行变异运算newpop=posttreat(newpop,popsize,dc,chromlength)遗传操作后处理遗传操作之后再重新计算适应度函数大小newSLLmax,newElog=calobjvalue(newpop,popsize,N,u,res)newfitvalue=calfitvalue(newSLLmax,popsize)求出最佳个体并保存最小峰值旁瓣和最佳个体Minvalue,Index=min(newfitvalue)bestindividual(num,)=Minvalue每一代中的最小峰值旁瓣保存在第一列bestindividual(num,:N)=newpop(Index,:)每一代最小峰值旁瓣所对应的最优染色体(也即是阵元所在的位置)pop=newpop重新赋值进行循环num=num自变量加end求出bestindividual中的最小值及最优染色体bestindividual=abs(bestindividual)取绝对值Minfit,I=max(bestindividual(:,))求出bestindividual中最大值也就是bestindividual中的最小值及其所在的行Minfit=*Minfit求出最低峰值旁瓣电平chromosome=bestindividual(I,:N)最优染色体str=sprintf('进化到第d代n',I)str=sprintf('对应的染色体:sn',numstr(chromosome))str=sprintf('最优值为:fn',Minfit)disp(str)disp(str)disp(str)画出方向图S=zeros(,length(u))初始化阵因子form=:NS(,:)=S(,:)exp(j**pi*u*chromosome(,m))endS=abs(S)Slog=*log(Smax(S))plot(theta*pi,Slog,'k','linewidth',)绘制阵因子方向图xlabel('方位角(degree)','FontSize',)ylabel('PSLL(dB)','FontSize',)axis()计算程序运行时间T=clockT=TTifT()<计算秒T()=T()T()=T()endifT()<计算分钟T()=T()T()=T()endifT()<计算小时T()=T()T()=T()ends=sprintf('程序运行耗时:d小时d分钟f秒',T(),T(),T())disp(s)遗传算法子函数,产生初始种群functionpop=intipop(popsize,chromlength,SP,L,dc)pop=SP*(ones(popsize,chromlength)rand(popsize,chromlength))产生popsize行chromlength=N列个随机数pop=sort(pop,)按行进行从小到大的排列a=ones(popsize,chromlength)(dc)产生popsize行chromlength=N列个相距为dc的矩阵a=cumsum(a,)按行叠加计算累积和pop=popapop=cat(,zeros(popsize,),pop,L*ones(popsize,))产生popsize行N列的初始化种群遗传算法子程序:遗传操作预处理functionnewpop=pretreat(newpop,popsize,dc,chromlength)newpop为预操作之后得到的基因矩阵创建约束矩阵con=ones(popsize,chromlength)(dc)产生popsize行chromlength=N列个相距为dc的矩阵con=cumsum(con,)按行叠加计算累积和cons=cat(,zeros(popsize,),con,zeros(popsize,))约束矩阵cat(dim,A,B,C)dim=表示按列连接dim=表示按行连接newpop=newpopcons遗传算法子程序计算适应度值functionfitvalue=calfitvalue(SLLmax,popsize)fitvalue=zeros(popsize,)fori=:popsizefitvalue(i)=SLLmax(i)fitvalue也是列向量其实和SLLmax是一样的相当于赋值end遗传算法子程序计算目标函数值的大小functionSLLmax,Elog=calobjvalue(pop,popsize,N,u,res)E=zeros(popsize,length(u))E为阵元无方向性时的方向性函数也即是阵因子FFmax=zeros(popsize,)用于保存主瓣峰值index=zeros(popsize,)用于保存主瓣峰值所在的位置form=:popsizeforn=:NE(m,:)=E(m,:)exp(j**pi*u*pop(m,n))计算目标函数endE(m,:)=abs(E(m,:))适应度函数都是非负的且是为了下面的对数用算Elog(m,:)=*log(E(m,:)max(E(m,:)))以分贝数来表示,其中log表示以为底的对数FFmax(m),index(m)=max(Elog(m,:))求出主瓣位置并保存end求出最大旁瓣fori=:popsizeforn=index(i):res用于求出最靠近主瓣右边的凹陷点的位置ifElog(i,n)>Elog(i,n)continueendifElog(i,n)<Elog(i,n)brk=nbreakendendform=index(i)::用于求出最靠近主瓣左边的凹陷点的位置ifElog(i,m)>Elog(i,m)continueendifElog(i,m)<Elog(i,m)brk=mbreakendendSLL=Elog(i,brk:res)右边除去主瓣所在区域的旁瓣值集合SLL=Elog(i,:brk)左边除去主瓣所在区域的旁瓣值集合SLLmax(i)=max(SLL,SLL)求出最大的峰值旁瓣endSLLmax=SLLmax'此时得到的SLLmax为列向量遗传算法子程序进行轮盘赌选择(在轮盘赌之前利用最优染色体代替最次染色体然后参与轮盘赌)functionnewpop=select(fitvalue,popsize,pop)newpop为经过轮盘赌选择之后的新的种群minvalue,index=min(fitvalue)求出当前种群中最优解并求出其所在的行数maxvalue,index=max(fitvalue)求出当前种群中最次解求出其所在行数pop(index,:)=pop(index,:)将最优染色体代替最次染色体参与轮盘赌选择fitscore=fitvaluesum(fitvalue)计算个体被选中的概率,由于fitvalue为负值因此fitscore越大fitvalue越小也就是说峰值旁瓣电平越小越是最优解fitscore=cumsum(fitscore)群体中个体的累积概率wh=sort(rand(popsize,))生成,区间上的随机数wh并从小到大排列wheel=fitone=whilewheel<=popsize执行轮盘赌选择操作ifwh(wheel)<fitscore(fitone)newpop(wheel,:)=pop(fitone,:)wheel=wheelelsefitone=fitoneendend遗传算法子程序:交叉运算(单点交叉)functionnewpop=crossover(newpop,popsize,pc,N)fori=::popsizeifrand<pc交叉规则只有随机数小于交叉概率才可以进行交叉cpoint=round(rand*(N))产生交叉位置位于N区间newpop(i,:)=newpop(i,:cpoint),newpop(i,cpoint:N)单点交叉交换数据newpop(i,:)=sort(newpop(i,:),)对交叉后的基因矩阵进行按行排列元素从小到大newpop(i,:)=newpop(i,:cpoint),newpop(i,cpoint:N)newpop(i,:)=sort(newpop(i,:),)elsenewpop(i,:)=newpop(i,:)不满足交叉条件不进行交叉newpop(i,:)=sort(newpop(i,:),)newpop(i,:)=newpop(i,:)newpop(i,:)=sort(newpop(i,:),)endend也可以利用算数交叉下面是简要的说明a是某一个参数fori=::popsizeifrand<pcnewpop(i,:)=a*newpop(i,:)(a)*newpop(i,:)newpop(i,:)=sort(newpop(i,:),)newpop(i,:)=a*newpop(i,:)a*newpop(i,:)newpop(i,:)=sort(newpop(i,:),)elsenewpop(i,:)=newpop(i,:)newpop(i,:)=sort(newpop(i,:),)newpop(i,:)=newpop(i,:)newpop(i,:)=sort(newpop(i,:),)endendpc也可以随着进化时间而变化遗传算法子程序:变异运算functionnewpop=mutation(newpop,popsize,pm,N,SP)newpop=newpopfori=:popsizeif(rand<pm)变异规则只有随机数小于变异概率才进行变异操作mpoint=round(rand*(N))产生变异位置位置区间为,Nnewpop(i,mpoint)=rand*SP变异位置上的元素用,SP区间上的随机数代替newpop(i,:)=sort(newpop(i,:),)将变异后的基因矩阵按行从小到大排序elsenewpop(i,:)=newpop(i,:)endend也可以使pm随着进化代数的变化逐渐增大有利于跳出局部最优fori=:popsizepm=pm(pm)*ipopsize

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/6
1下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部