因为NSGA-II算法是一种遗传算法,所以首先搞清楚遗传算法的流程。
遗传算法流程
一般遗传算法的流程:
- 种群初始化
- 计算每个个体的适应度
- 选择
- 交叉
- 变异
根据是否满足解的精度要求和迭代次数来判断是否进行下一轮的遗传进化。
NSGA算法存在的3个问题
- O(MN^3)计算时间复杂度(其中M代表目标个数,N代表种群个数)
- 非精英机制方法
- 需要指定一个共享参数
NSGA-II算法
NSGA-II算法主要由以下三个部分组成
A、快速非支配排序方法
B、拥挤比较算子
C、主程序
A、快速非支配排序方法
- 传统排序方法:时间复杂度O(MN3),M是目标个数,N是种群个数。为了计算第一非支配前沿面,需要判断每个解和种群中的其他解的支配关系。一个解和其他解的支配关系需要O(MN)复杂度,每个解和其他解的支配关系需要O(MN2)复杂度。最坏的情况,N个解各自构成一个前沿面,时间复杂度就是O(MN3)。
- 快速非支配排序方法:首先需要计算两个变量 1)支配计数np,即支配解p的解的数量。2)Sp,即解p支配的解的集合。
如上图所示,对解c而言,解c被a,b两个解支配,所以nc为2。对解b而言,解b支配c,d,e,所以Sb={c,d,e}。
算法流程如下:
首先计算每个解的np和Sp,这需要O(MN2)时间复杂度,同时得到了第一前沿面
F
1
\mathcal{F1}
F1。第二部分就是计算其余的前沿面,需要遍历前沿面中的每个解以及这个解的Sp集合,将对应解p的np值减一,如果np值减为0了,就加入下一前沿面集合,这部分需要O(N2)时间复杂度。由于第一部分和第二部分是分开的,所以总的时间复杂度是O(MN2)。
B、拥挤比较算子
密度估计:对同一前沿面的解按照目标函数值排序,计算每个解在该目标函数下两侧解的目标函数归一化差值,然后将所有目标函数下的分量累加作为拥挤系数。
具体算法流程如下:
如图所示,直观上看,解i的拥挤系数就是虚线矩形周长的一半。
C、主程序
- 种群初始化:随机创建父代种群P0 ,为父代种群利用快速非支配排序算法计算出非支配等级,并利用二进制锦标赛机制重组以及变异算子生成大小为N的子代种群。
- 子代个体选择