NSGA算法

先给自己叠甲,记录自己的学习过程,如有内容错误欢迎指正!!!

1. NSGA算法简介(Nondominated Sorting Genetic Algorithm)

根据标题,NSGA算法分为两个要点,Nondominated Sorting(非支配排序)Genetic Algorithm(遗传算法)遗传算法讲解文章

因此本文主要介绍非支配排序算法本身的内容,对遗传算法仅作简要提及。

1.1 基本概念

要明白非支配的含义,自然要知道支配(dominated)的含义。
支配的含义
从字面意思上看来看,A “能力” 大于
B
A就能够支配B
在多目标优化问题中,涉及到多个目标。
如果一个解在所有目标上都不比另一个解差,并且在至少一个目标上更好,那么这个解被称为支配另一个解。
具体来说,假设有两个解 A A A B B B,如果对于所有的目标函数 F ( X ) F(X) F(X)都有 F ( A ) ≤ F ( B ) F(A)≤F(B) F(A)F(B),并且至少存在一个目标函数 f i f_i fi使得 f i ( A ) < f i ( B ) f_i(A)<f_i(B) fi(A)<fi(B),那么我们就说解A支配解B

俗话来讲,就是“我哪哪都与你一样,但有一项能力比你强,我就能支配你。(当然,方方面面比你强,当然也能支配你)
下面用一个草图简单表述这个意思。
草图描述支配关系

该问题是 m i n F ( X ) , 即最小化优化问题。目标函数 F 内有两个子函数 f 1 和 f 2 。 该问题是min F(X),即最小化优化问题。目标函数F内有两个子函数f_1和f_2。 该问题是minF(X),即最小化优化问题。目标函数F内有两个子函数f1f2
对于A和B而言, F ( A ) ≤ F ( B ) , 且 f 1 ( A ) < f 1 ( B ) ; f 2 ( A ) < f 2 ( B ) F(A)≤F(B),且f_1(A)<f_1(B);f_2(A)<f_2(B) F(A)F(B),f1(A)<f1(B);f2(A)<f2(B)
满足 当解 A 在所有目标上都不比解 B 差,并且在至少一个目标上优于解 B 。 当解A在所有目标上都不比解B差,并且在至少一个目标上优于解B。 当解A在所有目标上都不比解B差,并且在至少一个目标上优于解B
所以说,解A 支配 解B。

对于A和C而言, F ( A ) ≤ F ( C ) , 且 f 1 ( A ) < f 1 ( C ) ; f 2 ( A ) = f 2 ( C ) F(A)≤F(C),且f_1(A)<f_1(C);f_2(A)=f_2(C) F(A)F(C),f1(A)<f1(C);f2(A)=f2(C)
满足 当解 A 在所有目标上都不比解 C 差,并且在至少一个目标上优于解 C 。 当解A在所有目标上都不比解C差,并且在至少一个目标上优于解C。 当解A在所有目标上都不比解C差,并且在至少一个目标上优于解C
所以说,解A 支配 解C。

注意!!!

解A 支配 解B时,解A称之为支配解(Dominating Solution),那解B呢? 非支配解?

千万注意!!!解B 不是 非支配解,解B称之为被支配解(Dominated Solution)

那何为非支配解(Non-dominating Solution)???
非支配解是指在解集合中没有任何其他解可以支配它的解。
解集合中有A、B和C三个解。B和C都不能支配A。
此时解A成为非支配解

当然,现实中的多目标优化问题不会只有三个解,往往有许多解。
我们还以两个优化目标举例,如下图。
在这里插入图片描述
求解 m i n G ( X ) , 在目标约束下,所有的解如上图所示。 求解 min G(X),在目标约束下,所有的解如上图所示。 求解minG(X),在目标约束下,所有的解如上图所示。
可以发现,红色的点无法被继续优化。当 g 1 g_1 g1减小时, g 2 g_2 g2就会增大;当 g 2 g_2 g2减小时, g 1 g_1 g1就会增大。
这些红色点所代表的解即为非支配解(它也称为帕累托解(Pareto Solution)
这些非支配解组成的集合称之为 帕累托最优集 ,这些解在目标空间中形成了 帕累托前沿(上图里面的黑色实线)。
帕累托前沿(Pareto Front) 是多目标优化问题中的一个关键概念,它是 帕累托最优解集(Pareto Optimal Set) 在目标空间中的表示。帕累托前沿是目标空间中所有帕累托解的集合,它展示了不同目标之间的最佳权衡。

注意!!!
帕累托解和非支配解的定义是基于解之间的比较,因此它们都是相对于问题中的解集合而言的。帕累托前沿是针对目标空间的。

总结来说,非支配解和帕累托解在多目标优化中是等价的概念,它们都描述了在多个目标之间达到最佳权衡的解。在实际应用中,寻找帕累托最优解通常意味着寻找非支配解,因为这些解代表了在多个相互冲突的目标之间无法进一步改进的解决方案。

1.2 非支配排序

NSGA与传统的遗传算法的主要区别在于:该算法在选择“基因”执行之前根据解之间的支配关系进行了分层。其选择“基因”、交叉“基因”和变异“基因”与传统的遗传算法没有区别。

假如每代保留10个解,但本代的帕累托最优集中有50个解。使用基于拥挤策略的虚拟适应度值进行调整,并确定每个种群的虚拟适应度值,然后根据虚拟适应度值的大小,确定优先选择进行处理的种群。
这里与传统遗传算法的适应度原理类似。遗传算法中以个体适应度的大小来判定各个个体的优劣程度,从而决定其遗传机会的大小。

考虑一个规模大小为N的种群,通过非支配排序算法可以对该种群进行分层,具体的步骤如下:
非支配排序
通过上述步骤得到的非支配个体集是种群的第一级非支配层;然后,忽略这些标记的非支配个体,再遵循步骤(1)一(4),就会得到第二级非支配;依此类推,直到整个种群被分级。
分级完成
在对种群进行非支配排序的过程中,需要给每一个非支配层指定一个虚拟适应度值。级数越大,虚拟适应度值越小(Rank 2 的虚拟适应度小);反之,虚拟适应度值越大(Rank 1 的虚拟适应度大)。这样可以保证在选择操作中等级较低的非支配个体有更多的机会被选择进入下一代,使得算法以最快的速度收敛于最优区域(也就是说,让当前的帕累托最优集内的解参与遗传迭代)。另一方面,为了得到分布均匀的Pareto最优解集,就要保证当前非支配层上的个体具有多样性。(解所处的空间位置不能太拥挤,要保留一定的间距)
在这里插入图片描述
C点更能够代表B、E两点之间的信息,而不会去选择D点。

不断完成迭代,能够求出多目标优化问题的帕累托集。
在这里插入图片描述
当然不一定能够求出全局最优解,但对于现实问题,以一个较快的运算速度求出非常接近全局最优解的解集,能够满足实际需要,即完成了优化的目标。
参考:
从NSGA到 NSGA II,
我翔哥的文章
数之道37】多目标优化求解策略与遗传算法NSGA-II<最优化系列第3集>

### NSGA-II 算法原理 NSGA-II 是一种基于快速非支配排序和拥挤距离机制的多目标进化算法。其核心在于通过两层筛选来保持种群多样性并加速收敛速度。首先,它利用 **非支配排序** 将解分为不同的等级层次[^1]。其次,在同一等级内的个体之间采用 **拥挤距离** 来衡量它们之间的分布密度,从而保留分布在边界上的个体。 #### 非支配排序 非支配排序是一种分层方法,用于评估每个解的质量。对于一个多目标优化问题中的任意两个解 \(A\) 和 \(B\),如果 \(A\) 在所有目标上都不劣于 \(B\) 并至少在一个目标上优于 \(B\),则称 \(A\) 支配 \(B\)。这种支配关系可以用来构建多个前沿面(fronts),其中第一个前沿面由不受任何其他解支配的解组成。 #### 拥挤距离计算 为了维持种群的多样性,NSGA-II 使用了拥挤距离的概念。该指标反映了某个特定解周围区域的空间大小。具体来说,对于每一个目标维度,计算相邻解的目标值差值之和作为当前解的拥挤距离。较大的拥挤距离意味着更高的稀疏度,因此更有可能被选入下一代种群中。 --- ### NSGA-III 多目标优化实现 相比于 NSGA-II,NSGA-III 主要改进之处在于引入了一个参考方向集来进行选择操作,这使得它可以更好地处理具有更多目标的情况。以下是其实现的关键部分: #### 参考方向向量定义 在 NSGA-III 中,预先设定一组均匀分布在整个目标空间内的参考方向向量 \(\{d_1, d_2,...,d_k\}\),这些向量指导着搜索过程如何探索各个子区域内可能存在的帕累托最优解集合。 #### 基于参考点的选择策略 当需要从父代与后代共同组成的临时群体选出固定数量的新一代成员时,除了继续沿用传统的非支配分级外,还增加了额外一步——按照各候选解到最近参考线的距离进行分配优先级排序。这样做的好处是可以确保最终得到的结果覆盖整个有效范围而不会偏向某些局部区域。 ```python import numpy as np def nsga3_selection(population, reference_points): fronts = fast_non_dominated_sort(population) selected_population = [] i = 0 while len(selected_population) + len(fronts[i]) <= population_size: selected_population.extend(fronts[i]) i += 1 remaining_solutions = assign_to_reference_lines(fronts[i], reference_points) sorted_remaining = sort_by_niche_count_and_crowding_distance(remaining_solutions) selected_population.extend(sorted_remaining[:population_size - len(selected_population)]) return selected_population ``` 上述伪代码展示了 NSGA-III 的主要框架逻辑,其中包括调用了几个辅助函数如 `fast_non_dominated_sort`、`assign_to_reference_lines` 和 `sort_by_niche_count_and_crowding_distance` ,分别对应执行非支配分类、关联至最接近的参考直线以及依据生态位计数加拥塞间距重新排列剩余选项的操作流程。 --- ### 应用场景分析 无论是 NSGA-II 还是 NSGA-III,都广泛应用于工程设计领域中的各种实际问题求解当中,比如机械零件参数调整、电力调度规划等方面均可见其身影。特别是在面对那些难以找到单一全局最佳方案的情形下尤为适用,因为它能够一次性给出一系列折衷备选答案供决策者挑选使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值