大家好,又见面了,我是你们的朋友全栈君。
NSGA-II算法学习
什么是支配:
支配就是统治,在各方面都优于其余个体
如个体i支配个体j,就说明个体i在所有目标函数的表现上都不差于个体j,并且至少在一个目标上优于个体j;
什么是非支配:
非支配就是个体在种群中是最优秀的,它们在该种群中不受其余个体支配。
快速非支配排序,将种群中的个体进行分层,最优秀的个体处于第一层,然后除了第一层,再从其余个体中找出非支配个体,以此类推。
为什么要记录np和Sp:
Np是指支配个体p的个体数,就是比个体p优秀的个体
Sp是指受p支配的个体,也就是没有个体优秀的个体。
因为算法首先可以找出第一层最优秀的个体,然后再从它们中获取到受它们所支配的个体(除了第一层都受它们支配),也就是从Sp中找,它们没有个体p优秀,让它们的np-1;因为p已经存在于第一级了。
然后再判断np是否为0,即它是否还受其余个体支配,0说明除了个体p,它不再受其余个体支配,则将这样的个体分到第二级,也就是比第一级稍微弱点的个体。
拥挤度是什么?
表示种群中给定点的种群密度。用来确保种群多样性。
为什么引入拥挤度?
因为在NSGA中需要认为指定一个共享参数,这个参数需要结合经验,不太好确定,所以引入拥挤度,就不需要小生境技术了。
当进行完快速非支配排序和拥挤度计算之后,每个个体都拥有这两个参数,然后根据拥挤度比较算子进行选择,
采用共享小生境技术以确保种群的多样性,但需要决策者指定共享半径。
为了解决这个问题,NSGA-II中提出了拥挤度的概念,拥挤度表示在种群中给定点的周围个体的密度,直观上用个体i周围包含个体i但不包含其余个体的最大长方形的长来表示。
算法:
每个点的拥挤度置为0
针对每个目标,对种群进行非支配排序,令边界两个个体的拥挤度为无穷。
对其余个体进行拥挤度计算:
算法基本思想:
首先,随机产生规模为N的初始种群Pt,产生子代种群Qt,并将两个种群联合在一起形成大小为2N的种群Rt;
其次,将父代种群与子代种群合并,进行快速非支配排序并且分层,同时对每个非支配层中的个体进行拥挤度计算,根据非支配关系以及个体的拥挤度选取合适的个体组成新的父代种群Pt+1,最后,通过遗传算法的基本操作产生新的子代种群Qt+1,将Pt+1与Qt+1合并形成新的种群Rt,重复以上操作,直到满足程序结束的条件。
拥挤度比较算子:根据非支配排序后赋予的虚拟适应度值和拥挤度来决定那些个体进入下一代。
密度估计:为了得到种群中特定解周围的解的密度估计,我们根据每一目标函数计算这点两侧的两个点的平均距离。这个数值作为以最近邻居作为顶点的长方体周长的估计(称为拥挤系数)
拥挤系数的计算需要根据每一目标函数值的大小的升序顺序对种群进行排序。因此,对每一目标函数,边界解(拥
有最大和最小值的解)被指定为无穷大距离的值。所有其它
中间的解都被指定为等于两个相邻解的函数值归一化后的绝对差值。全部拥挤系数值是通过个体每一目标的距离值的加和计算得到的。每一目标函数在计算拥挤系数前都会进过归一化处理。在页底展示的算法概括了非支配集合中所有解拥挤系数的计算过程。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144406.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...