• 大小: 1.82MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-08-13
  • 语言: Matlab
  • 标签: NSGA-Ⅱ  matlab  NSGA  

资源简介

1)本程序主要针对测试函数集ZDT1进行的NSGA-Ⅱ算法的编写; 2)本程序有详细的备注解释; 3)本文件里包含论文《非支配排序遗传算法(NSGA)的研究与应用》.pdf,用来指导学习NSGA-Ⅱ算法

资源截图

代码片段和文件信息

function NSGAII()
clc;
% format compact;
tic;
% hold on

%--初始化 参数设定
generations=100;        %迭代次数
popnum=100;             %种群大小(偶数)
poplength=30;           %个体长度
minvalue=repmat(zeros(1poplength)popnum1);   %个体最小值---B = repmat(A m n) %将矩阵A复制m*n块,即B由m*n块A平铺而成
maxvalue=repmat(ones(1poplength)popnum1);    %个体最大值
population=rand(popnumpoplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群

    %--开始迭代进化
    for gene=1:generations      %开始迭代

        %--交叉
        newpopulation=zeros(popnumpoplength);  %子代种群
        for i=1:popnum/2                        %交叉产生子代
            k=randperm(popnum);                 %从种群中随机选择出两个父母,不采用二进制联赛方法
            beta=(-1).^round(rand(1poplength)).*abs(randn(1poplength))*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        newpopulation=[population;newpopulation];   %合并父子种群

        %--计算目标函数值
        functionvalue=zeros(size(newpopulation1)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(1size(functionvalue1));      %记录个体是否已被分配编号
        frontvalue=zeros(size(cz));             %每个个体的前沿面编号
        [functionvalue_sortednewsite]=sortrows(functionvalue); %对种群按第一维目标值大小进行排序 则第一行个体p即为种群中支配个体p的数量为零的个体,Np=0
        while ~all(cz)      %开始迭代判断每个个体的前沿面,采用改进的deductive sort
            fnum=fnum+1;
            d=cz;
            for i=1:size(functionvalue1) %:(1)找到种群中所有n=0的个体,并保存在当前集合F1中;
                if ~d(i)
                    for j=i+1:size(functionvalue1) %判断i对应的所有集合里面的支配和非支配的解,被i支配则为1,不被i支配则为0
                        if ~d(j)
                            k=1;
                            for m=2:size(functionvalue2) %判断是否支配,找到个体p不支配的个体,标记为k=0
       

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        5838  2019-04-12 22:40  NSGA_Ⅱ\NSGAII.m
     文件         310  2019-04-12 22:59  NSGA_Ⅱ\备注.txt
     文件     1970580  2019-03-15 16:20  NSGA_Ⅱ\非支配排序遗传算法(NSGA)的研究与应用.pdf

评论

共有 条评论