• NSGA-多目标遗传算法


    NSGA-I

    1.非支配个体排序

    1. i=1;
    2. for all j=1,2..,n ; j!=i:

    比较xi与xj的支配关系,并标记;

    1. if no any xj支配xi:

    则标记xi为非被支配个体;

    1. i=i+1;
    2. go to (2) ,unitl all 非支配个体被判断标记出来;
    3. then get first F1={xi,xj,xk,...第一层非被支配个体}
    4. ignore 被标记为非支配的x;

    do (1)-(6) until all 个体被标记为非支配体

    1. 为每一层F1,F2,...指定一个虚拟适应度,F1:1,F2:0.9,F3:0.8,...

    2.共享适应度计算:

    p层Fp上有np个个体,虚拟适应值为fp;i,j=1,2,...np;

    (1)计算Fp内个体xi、xj的欧氏距离:

    (2)

          

    (3)loop j=1,2,...np.计算:

    (4)xi的共享适应度计算:

    (5)loop (1)-(4),until all 个体的共享适应度计算完成;

     

    NSGA-II

    快速排序,拥挤度策略,精英策略

    每个个体属性:ni(种群中能支配xi的个体的数量)、Si(被xi支配的个体的集合)

    1.计算支配层级:

    fast-nodominate-sort(P)
    P={x1,x2,x...,xm}
    (1)计算所有个体的ni,Si;
    (2) found all xi where xi.ni==0
        input xi into F1 where xi.ni==0
    (3) for xj{nj,Sj} in F1:
            for xk in xj.Sj:
                xk.nk--;
                if xk.nk==0:
                    H.putinto(xk)
    (4)此时,F1为一级非支配层个体集;设F1层里面的个体一个相同的序列:irank=当前层+1
    (5)用H作为新的集合F2,fast-nodominate-sort(F2)
        loop (2)-(4) until all x1,2,...m被分层完到F1,F2,....

    2.拥挤度计算

    原一版中,采用共享函数以确保种群多样性,需要指定共享半径σshare;II代提出了拥挤度概念,表示个体周围的密度,id;意义是个体xi周围只包含xi不包含其它个体的最大长方形区域。

    拥挤度计算函数

    crowding-distance(L)
        l=|L|	个体数;
        L[i].id=0 每个个体初始拥挤度为0 ;
        for  fi  in  objectfuncs F={f1,f2,...,fm} : 遍历所有目标函数
            L=sort(L,fi)	 在fi目标函数下对L中个体进行非支配排序
            L[1].id=L[l].id=∞ 第一个和最后一个不可能有上下界,无限大
            for i=2至(l-1):
                L[i].id=L[i].id+(fi(L[i+1])-fi(L[i-1]))/(max(fi)-min(fi))

    最后:

    id小的个体周围比较拥挤;为了维持种群多样性,需要一个拥挤度比较算子以确保能收敛到均匀的pareto面;
    经过1获得的排序irank,和2获得的拥挤度id,可定义偏序关系(比较解的好坏的时候):
    如果两个体支配排序不同,先取小的;如果同支配级,取不拥挤的即拥挤度id大的。

    算法:

    t=0
    随机产生Pt={x1,x2,...,xN}
    对所有个体计算快速支配排序:fast-nodominate-sort(Pt);
    选择、交叉、变异产生下一代:Qt=GA(Pt);
    然后执行算法:
    NSGA-II(Pt,Qt)
        Rt = Pt+Qt  第t代的父代Pt,第t代的新种群Qt合并,2N个体
        F = fast-nodominate-sort(Rt) 	父子代参与快速非支配排序,F={F1,F2,...}
        Pt+1 = ∅						下一代初始空
        i = 0 
        while |Pt+1|+|Fi|<=N:	//i=1,2,....没有被填满
            crowding-distance(Fi) 计算Fi层中个体拥挤度
            P(t+1) = P(t+1)∪Fi	Fi层中个体并入下一代
            i = i+1
        sort(Fi,<n)	对i层种群按照拥挤度排序
        P(t+1) = P(t+1)∪Fi[1:,N-|Pt+1|]	取与排序后Fi层合并集的前N个
        Q(t+1) = new(Pt+1) 遗传等产生新种群
        t = t+1
        如果不满足条件(精度、迭代次数等)重复执行:
            NSGA-II(Pt+1,Qt+1)
        直到收敛条件
        return Pt

    NSGAII实现

    我自己Github实现:

    https://github.com/425776024/NSGA-II


    2019-11-18 更新

    发现有这么一个库很不错,已经集成了这么多算法,本人写的真的有误人子弟,献丑了,想了解更好的实现细节的也可以参考这个库的源码

    Single-objective: Genetic Algorithm, Differential Evolution, Nelder Mead
    Multi-objective: NSGA-II, R-NSGA-II, NSGA-III, R-NSGA-III, U-NSGA-III, MOEA/D
    网址:https://pymoo.org/
     

  • 相关阅读:
    Vue基本用法:vuex、axios 拦截器和vue-router路由导航守卫
    Vue基本用法:vue-router路由、refs属性和axios基本使用
    Tensorflow基本开发架构
    5. Vue3.x双向数据绑定
    4. Vue3.x中的事件方法详解
    3. Vue3.x中的事件方法入门
    2. Vue3绑定数据
    1. Vue3 入门 —— 简介、环境搭建
    2.5.1 MongoDB 介绍与基础
    2.6.8 Masstransit异常处理和总结
  • 原文地址:https://www.cnblogs.com/onenoteone/p/12441765.html
Copyright © 2020-2023  润新知