NSGA2 算法Matlab实现「建议收藏」

NSGA2 算法Matlab实现「建议收藏」为了能随时了解Matlab主要操作及思想。故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。更多内容访问omegaxyz.comNSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了

大家好,又见面了,我是你们的朋友全栈君。

为了能随时了解Matlab主要操作及思想。

故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。
更多内容访问omegaxyz.com
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。

Matlab实现:

function NSGAII()
clc;format compact;tic;hold on
    
%---初始化/参数设定
    generations=100;                                %迭代次数
    popnum=100;                                     %种群大小(须为偶数)
    poplength=30;                                   %个体长度
    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值
    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
        
%-------变异        
        k=rand(size(newpopulation));    %随机选定要变异的基因位
        miu=rand(size(newpopulation));  %采用多项式变异
        temp=k<1/poplength & miu<0.5;   %要变异的基因位
        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); %子代越下界处理
        newpopulation=[population;newpopulation];                               %合并父子种群
        
%-------计算目标函数值        
        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1
        functionvalue(:,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);    %对种群按第一维目标值大小进行排序
        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort
            fnum=fnum+1;
            d=cz;
            for i=1:size(functionvalue,1)
                if ~d(i)
                    for j=i+1:size(functionvalue,1)
                        if ~d(j)
                            k=1;                            
                            for m=2:size(functionvalue,2)
                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)
                                    k=0;
                                    break
                                end
                            end
                            if k
                                d(j)=true;
                            end
                        end
                    end
                    frontvalue(newsite(i))=fnum;
                    cz(i)=true;
                end
            end
        end
        
%-------计算拥挤距离/选出下一代个体        
        fnum=0;                                                                 %当前前沿面
        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群
            fnum=fnum+1;
        end        
        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数
        population(1:newnum,:)=newpopulation(frontvalue<=fnum,:);               %将前fnum个面的个体复制入下一代                       
        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));
            distancevalue(newsite(1))=inf;
            distancevalue(newsite(end))=inf;
            for j=2:length(popu)-1
                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));
            end
        end                                      
        popu=-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')
end

更多内容访问omegaxyz.com

网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2018 • OmegaXYZ-版权所有 转载请注明出处

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144351.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 事务隔离级别与锁的对应关系_隔离级别和锁的关系

    事务隔离级别与锁的对应关系_隔离级别和锁的关系隔离级别org.springframework.transaction.annotation.Isolationpublic enum Isolation { DEFAULT(-1), READ_UNCOMMITTED(1), READ_COMMITTED(2), REPEATABLE_READ(4), SERIALIZABLE(8);}DEFAULT :这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是: READ_CO..

    2022年8月8日
    1
  • c#中高效的excel导入sqlserver的方法

    将oledb读取的excel数据快速插入的sqlserver中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.S

    2021年12月27日
    34
  • 牛客:数据库实战—1—查找最晚入职员工的所有信息、查找入职员工时间排名倒数第三的员工所有信息

    牛客:数据库实战—1—查找最晚入职员工的所有信息、查找入职员工时间排名倒数第三的员工所有信息1、查找最晚入职员工的所有信息CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` date NOT NULL,`first_name` varchar(14) NOT NULL,`last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL,`hir…

    2022年6月13日
    45
  • 基于RGBD的slam_rgb算法

    基于RGBD的slam_rgb算法一.引言  首先,我们需要知道什么是SLAM(simultaneous localization and mapping, 详见SlamCN),SLAM,即时定位与制图,包含3个关键词:实时、定位、制图,就是实时完成定位和制图的任务,这就是SLAM要解决的基本任务。按照使用的传感器分为激光SLAM(LOAM、V-LOAM、cartographer)与视觉SLAM,其中视觉SLAM又可分为单

    2022年9月18日
    0
  • 每天一道算法_2_求高精度幂

    今天这个可能有点偷懒,学c++的时候就知道大数计算很复杂,现在一直用java,有幸有大数的方法可以用那么今天的算法就用java偷懒过去吧Description对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。 现在要你解决的问题是:对一个实数R( 0.0 n),其中n 是整数并且 0 InputT输入包括多组 R 和 n。

    2022年3月10日
    38
  • tmux 如何自定义背景颜色 | How does the tmux color palette work?

    tmux 如何自定义背景颜色 | How does the tmux color palette work?坑1:256colorsupportforvimbackgroundintmuxhttps://superuser.com/questions/399296/256-color-support-for-vim-background-in-tmux原因Fromthelookofyour.bashrcand.profile,theshellsinsidetmuxareoverridingthe‘default-terminal’settinginyour

    2022年6月21日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号