700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【优化算法】非支配排序遗传算法(NSGA)【含Matlab源码 176期】

【优化算法】非支配排序遗传算法(NSGA)【含Matlab源码 176期】

时间:2019-11-07 21:17:44

相关推荐

【优化算法】非支配排序遗传算法(NSGA)【含Matlab源码 176期】

一、获取代码方式

获取代码方式1:

完整代码已上传我的资源:【优化算法】非支配排序遗传算法(NSGA)【含Matlab源码 176期】

获取代码方式2:

通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

备注:

订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、遗传算法简介

非支配排序遗传算法NSGA(Non-dominated So rng Genetic Algor thms) 是由Srinivas和Deb于1995年提出的”。这是一种基于Pareto最优概念的遗传算法, 它是众多的多目标优化遗传算法中体现God beg思想最直接的方法。该算法就是在基本遗传算法的基础上,对选择再生方法进行改进:将每个个体按照它们的支配与非支配关系进行分层,再做选择操作,从而使得该算法在多目标优化方面得到非常满意的结果。Z it z ler与Thiele等191曾对NSGA、NPG A、VEGA, 与Haj ela和Lin的加权向量算法以及纯随机搜索算法,作了系统的定量实验比较。通过采用多背包问题扩展形式的九种不同规模设置作为数值型多目标测试问题,经过全面的比较分析, 得到比较结果:NSGA的性能最优, 其次是VEGA, 而NPG A与Haj ela和Lin的加权向量算法的全部实验结果不分上下例。虽然这种比较结果不能无限制

的外推, 但是它在一定程度上说明了NSGA具有一定的优越性。因此, 对该算法进行理论研究和应用研究具有十分重要的意义。

虽然NSGA与其它多目标优化遗传算法比较具有一定的优越性:优化目标个数任选,非劣最优解分布均匀,并允许存在多个不同的等价解。但它仍存在一些问题(例:a)计算复杂度较高,当种群较大时,计算相当耗时;b)没有精英策略,精英策略可以加速算法的执行速度,而且也能在一定程度上确保已经找到的满意解不被丢失; c) 需要指定共享半径o, hare·

三、部分源代码

function NSGAII()clc;% format compact;tic;% hold on%--初始化 参数设定generations=100; %迭代次数popnum=100; %种群大小(偶数)poplength=30; %个体长度minvalue=repmat(zeros(1,poplength),popnum,1); %个体最小值---B = repmat(A, m, n) %将矩阵A复制m*n块,即B由m*n块A平铺而成maxvalue=repmat(ones(1,poplength),popnum,1); %个体最大值population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue; %产生新的初始种群%--开始迭代进化for gene=1:generations%开始迭代%--交叉newpopulation=zeros(popnum,poplength); %子代种群for i=1:popnum/2 %交叉产生子代k=randperm(popnum); %从种群中随机选择出两个父母,不采用二进制联赛方法beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481;%采用正态分布交叉产生两个子代newpopulation(i*2-1,:)=(population(k(1),:)+population(k(2),:))/2+beta.*(population(k(1),:)-population(k(2),:))./2; %产生第一个子代newpopulation(i*2,:)=(population(k(1),:)+population(k(2),:))/2-beta.*(population(k(1),:)-population(k(2),:))./2; %产生第二个子代end%--变异newpopulation(temp)=newpopulation(temp)+(maxvalue(temp)-minvalue(temp)).*((2.*miu(temp)+(1-2.*miu(temp)).*(1-(newpopulation(temp)-minvalue(temp))./(maxvalue(temp)-minvalue(temp))).^21).^(1/21)-1); %变异情况一newpopulation(temp)=newpopulation(temp)+(maxvalue(temp)-minvalue(temp)).*(1-(2.*(1-miu(temp))+2.*(miu(temp)-0.5).*(1-(maxvalue(temp)-newpopulation(temp))./(maxvalue(temp)-minvalue(temp))).^21).^(1/21)); %变异情况二%--越界处理/种群合并newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理%--计算目标函数值functionvalue=zeros(size(newpopulation,1),2); %合并后种群的各目标函数值,这里问题是ZDT1functionvalue(:,1)=newpopulation(:,1); %计算第一维目标函数值g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值%--非支配排序fnum=0;%当前分配的前沿面编号cz=false(1,size(functionvalue,1));%记录个体是否已被分配编号frontvalue=zeros(size(cz)); %每个个体的前沿面编号[functionvalue_sorted,newsite]=sortrows(functionvalue); %对种群按第一维目标值大小进行排序 则第一行个体p即为种群中支配个体p的数量为零的个体,Np=0while ~all(cz)%开始迭代判断每个个体的前沿面,采用改进的deductive sortfnum=fnum+1;d=cz;if ~d(i)for j=i+1:size(functionvalue,1) %判断i对应的所有集合里面的支配和非支配的解,被i支配则为1,不被i支配则为0if ~d(j)k=1;for m=2:size(functionvalue,2) %判断是否支配,找到个体p不支配的个体,标记为k=0if functionvalue_sorted(i,m)>functionvalue_sorted(j,m) %判断i,j是否支配,如果成立i,j互不支配k=0; %i,j互不支配break;endendif kd(j)=true; %那么p所支配的个体k=1并记录在d里,则后面该个体已被支配就不能在这一层里进行判断endendendfrontvalue(newsite(i))=fnum; %实际位置的非支配层赋值cz(i)=true;endendend%--计算拥挤距离/选择出下一代个体popu=find(frontvalue==fnum+1); %popu记录第fnum+1个面上的个体编号distancevalue=zeros(size(popu)); %popu各个体的拥挤距离fmax=max(functionvalue(popu,:),[],1); %popu每维上的最大值fmin=min(functionvalue(popu,:),[],1); %popu每维上的最小值for i=1:size(functionvalue,2) %分目标计算每个目标上popu各个体的拥挤距离[~,newsite]=sortrows(functionvalue(popu,i)); %popu里对第一维排序之后的位置distancevalue(newsite(1))=inf;distancevalue(newsite(end))=inf;for j=2:length(popu)-1distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i)); %endendpopu=-sortrows(-[distancevalue;popu]')'; %按拥挤距离降序排序第fnum+1个面上的个体population(newnum+1:popnum,:)=newpopulation(popu(2,1:popnum-newnum),:); %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代end%--程序输出fprintf('已完成,耗时%4s秒\n',num2str(toc)); %程序最终耗时output=sortrows(functionvalue(frontvalue==1,:)); %最终结果:种群中非支配解的函数值plot(output(:,1),output(:,2),'*b'); %作图axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1');

四、运行结果

五、matlab版本及参考文献

1 matlab版本

a

2 参考文献

[1]包子阳 ,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[J].电子工业出版社

[2]高媛.非支配排序遗传算法(NSGA)的研究与应用[D].浙江大学

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。