啊要出分数线了好紧张. 赶紧复习复习以前学的东西_(:з」∠)_
竟然写了大半天, 全都忘光了, 怕不是要凉 (/゚Д゚)/
文章目录
- 遗传算法(Genetic Algorithm)
- 非支配排序遗传算法(Non-Dominated Sorting Genetic Algorithm, NSGA)
- Pareto 支配关系
- 非支配排序
- 虚拟适应度(略)
- 带精英策略的非支配排序遗传算法(NSGA-II)
遗传算法(Genetic Algorithm)
此处使用二进制编码法形成染色体.
种群初始化: 随机将染色体的某些 DNA 置 1, 进行 M 次, 形成 M 个不重复的个体组成第一代种群.
适应度评价: 对每个个体运行适应度评价函数, 区分群体中个体好坏. 并按照一定策略选择出部分适应度高的个体, 作为下一代的父代.
交叉与变异: 对挑选出的父代, 每次随机选择两个染色体, 在一定概率下将两者的某些 DNA 进行交换, 形成两个新的个体, 即为染色体的交叉; 同时上述新产生的个体有一定概率发生染色体变异, 即对染色体的某些位取反. 最后形成新的子代. 遗传算法就是上述步骤的反复.
非支配排序遗传算法(Non-Dominated Sorting Genetic Algorithm, NSGA)
有时候我们的优化目标不止一个, 比如买菜时同时要求菜越新鲜越好, 且单价越便宜越好. 这便是多目标优化问题. 面对此类问题时, 无法用 1 个指标衡量染色体的好坏, 在判断两个染色体孰优孰劣时将会产生困难. NSGA 解决多目标问题和普通 GA 的主要区别就是在选择算子执行之前对个体关系的分层, 而选择算子, 交叉算子, 变异算子没有区别.
Pareto 支配关系
Pareto 最优解给出了多目标问题的判别的方法.
对于最小化多目标问题, n 个目标分量 f i f_i fi ( i = 1 , . . . , n ) (i=1,...,n) (i=1,...,n) 组成的向量 f ‾ ( X ‾ ) = ( f 1 ( X ‾ ) , f 2 ( X ‾ ) , . . . , f n ( X ‾ ) ) \overline{f}(\overline{X})=(f_1(\overline{X}), f_2(\overline{X}), ..., f_n(\overline{X})) f(X)=(f1(X),f2(X),...,fn(X)), 给定两个决策变量 X ‾ u , X ‾ v ∈ U \overline{X}_u, \overline{X}_v \isin U Xu,Xv∈U:
- 当且仅当 ∀ i ∈ { 1 , . . . , n } \forall i \isin \{1, ..., n\} ∀i∈{1,...,n} 时, 都有 f i ( X ‾ u ) < f i ( X ‾ v ) f_i(\overline{X}_u) < f_i(\overline{X}_v) fi(Xu)<fi(Xv), 则 X ‾ u \overline{X}_u Xu 支配 X ‾ v \overline{X}_v Xv.
- 当且仅当 ∀ i ∈ { 1 , . . . , n } \forall i \isin \{1, ..., n\} ∀i∈{1,...,n} 时, 都有 f i ( X ‾ u ) ⩽ f i ( X ‾ v ) f_i(\overline{X}_u) \leqslant f_i(\overline{X}_v) fi(Xu)⩽fi(Xv), 且至少存在一个 j ∈ { 1 , . . . , n } j \isin \{1, ..., n\} j∈{1,...,n} 则 X ‾ u \overline{X}_u Xu 弱支配 X ‾ v \overline{X}_v Xv.
- 当且仅当 ∃ i ∈ { 1 , . . . , n } \exists i \isin \{1, ..., n\} ∃i∈{1,...,n}, 使 f i ( X ‾ u ) < f i ( X ‾ v ) f_i(\overline{X}_u) < f_i(\overline{X}_v) fi(Xu)<fi(Xv), 且 ∃ j ∈ { 1 , . . . , n } \exists j \isin \{1, ..., n\} ∃j∈{1,...,n}, 使 f j ( X ‾ u ) > f j ( X ‾ v ) f_j(\overline{X}_u) > f_j(\overline{X}_v) fj(Xu)>fj(Xv), 则 X ‾ u \overline{X}_u Xu 和 X ‾ v \overline{X}_v Xv 互不支配.
若 X ‾ u \overline{X}_u Xu 为 Pareto 最优解, 则不存在 X ‾ v ∈ U \overline{X}_v \isin U Xv∈U 支配 X ‾ u \overline{X}_u Xu.
非支配排序
对于互不支配的染色体, 我们称这些染色体处于同一层. 则所有的染色体可以被划分到若干层. 非支配排序就是将染色体分层的排序算法, 分得的层称为第一级非支配层, 第二级非支配层… 其中第一级非支配层处于 Pareto 前沿(Pareto Front).
非支配排序步骤如下:
- (1) 设 i = 1;
- (2) 对所有的 j = 1, 2, …, N(i != j), 基于适应度函数比较个体 xi, xj 之间的支配关系;
- (3) 若不存在任何一个个体 xj 优于 xi, 则标记 xi 为非支配个体;
- (4) 令 j = j + 1, 转到(1), 重复直至找到所有非支配个体.
上述步骤将得到第一级非支配层, 过滤第一层所有个体后再次运行非支配排序, 即可得到第二级非支配层.
虚拟适应度(略)
为了算法更快地收敛, 虚拟适应度越大(层数越低)的个体应该有更多机会进入下一代. 但同时, 我们期望的 Pareto 最优解集应该是均匀分布的(而不是都挤在一个或几个点附近), 因此还要保证当前非支配层上的个体具有多样性。NSGA 中引入了基于拥挤策略的小生境(NIChe)技术, 对每个个体计算共享适应度.
带精英策略的非支配排序遗传算法(NSGA-II)
NSGA-II 是 NSGA 的改进. NSGA-II 相对于 NSGA,
- 提出了快速非支配排序算子, 将非支配排序从 O ( M N 3 ) O(MN^3) O(MN3) 优化到了 O ( M N 2 ) O(MN^2) O(MN2) (M为目标数, N 为种群大小);
- 提出了拥挤距离算子;
- 提出了精英策略选择算子.
NSGA-II 流程图(CSDN 可能有 bug无法正常显示)
Created with Raphaël 2.2.0 开始 随机生成第一代种群 计算每个个体的所有目标 快速非支配排序 拥挤距离计算 运行代数大于最大代数? 输出 Pareto 前沿 结束 选择优秀个体组成新的父代 选择, 交叉, 变异 父代与子代合并 yes no
快速支配排序算子
- (1) 对种群 P P P 中的每个个体 p p p, 计算 p p p 在种群 P P P 中支配的个体数 n p n_p np, 并将这些被 p p p 支配的个体存入 S p S_p Sp 中(每个个体都要比较一次, 共比较 N ( N − 1 ) ) 2 \frac{N(N-1))}{2} 2N(N−1)) 次, 每次比较要遍历 M M M 个目标, 时间复杂度 O ( M N 2 ) O(MN^2) O(MN2));
- (2) l a y e r = 1 layer = 1 layer=1;
- (3) 找出所有 n p = 0 n_p = 0 np=0 的个体, 保存在数组 F l a y e r F_{layer} Flayer 中;
- (4) 对于 F l a y e r F_{layer} Flayer 中的每个个体 p p p 的支配集 S p S_p Sp: 遍历 S p S_p Sp, 对 S p S_p Sp 中每个个体 l l l, 执行 n l = n l − 1 n_l = n_l - 1 nl=nl−1;
- (5) l a y e r = l a y e r + 1 layer = layer + 1 layer=layer+1, 重复(3).
拥挤距离算子
- (1) 对每个个体 p p p 令拥挤距离 d p = 0 , p = 1 , 2 , . . . , N d_p = 0, p = 1, 2, ..., N dp=0,p=1,2,...,N
- (2) 对 M M M 个目标的每个目标函数 f m f_m fm:
- 1) 根据目标 f m f_m fm 的数值大小, 对每个个体排序;
- 2) 对每个个体 p p p, 计算 d p = d p + ( f m ( p + 1 ) − f m ( p − 1 ) ) d_p = d_p + (f_m(p+1) - f_m(p-1)) dp=dp+(fm(p+1)−fm(p−1))
(其中第一个和最后一个个体拥挤距离设为无穷 d 1 = d N = ∞ d_1 = d_N = \infty d1=dN=∞)
选择时优先选择拥挤距离 d d d 大的.
精英策略选择算子
即保留父代优良个体直接进入子代, 以防止 Pareto 前沿的解丢失. 具体操作就可以直接把父代子代合并到一起进行非支配排序.