【调度算法】快速非支配排序算法

简介: 【调度算法】快速非支配排序算法

这段代码实现的是快速非支配排序算法(Fast Non-dominated Sorting Algorithm)。

算法输入和输出:

这个函数的输入是两个列表 values1values2,分别表示多目标优化问题中每个解在两个目标函数下的取值。输入的两个列表应该具有相同长度,即每个解在两个目标函数下均有取值。

这个函数的输出是一个二维列表 front,其中包含 Pareto 前沿中每层非支配解的索引。具体而言,front[i] 表示第 i 层 Pareto 前沿中非支配解的索引列表。前沿的层数不确定,因此 front 列表中的子列表数量也不确定,需要根据具体的解集确定。每个非支配解只会出现在其中的一个 Pareto 前沿层级中。

举个例子,如果返回结果是 [[1, 4], [0, 3], [2]],表示在多目标优化问题中存在三个 Pareto 前沿层级。其中第一层包含解索引 1 和 4,第二层包含解索引 0 和 3,第三层包含解索引 2。

算法思路:

快速非支配排序算法是一种用于多目标优化问题的非支配解搜索算法。所谓“非支配解”指的是在多个优化目标下,无法找到一个解集中的解,比这个解更好。

具体实现过程:

首先,算法输入两个向量 values1 和 values2,对于其中的每一个解 p,在 values1 和 values2 上进行比较寻找支配解 q,如果 p 被 q 支配,那么就将 p 加入到 q 的被支配集合 S[q] 中。同时记录下 q 被支配的次数,即 n[q],表示有多少个解与 q 相比,更优秀或者等价。如果一个解 p 的 n[p] 为 0,那么它就是一个非支配解,将其放入 Pareto 前沿的第一层 front[0] 中。

接下来,将 front[0] 中的所有非支配解从解集中删除,并将其加入到 Pareto 前沿的列表 front 中。循环处理直到没有解可以放入前沿。

最后,返回计算得到的 Pareto 前沿集合 front,其中的元素是按照被支配的关系排列的。

python代码:

def fast_non_dominated_sort(values1, values2):
    # 初始化 S, front, n 和 rank 列表
    S = [[] for i in range(0, len(values1))]  # 记录每个解的被支配解集合
    front = [[]]  # 记录 Pareto 前沿层级
    n = [0 for i in range(0, len(values1))]  # 记录每个解被支配的次数
    rank = [0 for i in range(0, len(values1))]  # 记录每个解所处的 Pareto 前沿层级
    # 对每个解计算被支配解集合 S 和支配该解的次数 n
    for p in range(0, len(values1)):
        S[p] = []
        n[p] = 0
        for q in range(0, len(values1)):
            if (values1[p] > values1[q] and values2[p] > values2[q]) or (
                    values1[p] >= values1[q] and values2[p] > values2[q]) or (
                    values1[p] > values1[q] and values2[p] >= values2[q]):
                if q not in S[p]:
                    S[p].append(q)
            elif (values1[q] > values1[p] and values2[q] > values2[p]) or (
                    values1[q] >= values1[p] and values2[q] > values2[p]) or (
                    values1[q] > values1[p] and values2[q] >= values2[p]):
                n[p] = n[p] + 1
        # 如果一个解没有被任何其他解支配,则将其归为 Pareto 前沿的第一层
        if n[p] == 0:
            rank[p] = 0
            if p not in front[0]:
                front[0].append(p)
    # 循环计算 Pareto 前沿集合
    i = 0
    while (front[i] != []):
        Q = []
        for p in front[i]:
            # 遍历被支配解集合 S,更新其 n 值
            for q in S[p]:
                n[q] = n[q] - 1
                # 如果某个解 q 不被其他解支配,则将其归为下一层 Pareto 前沿
                if (n[q] == 0):
                    rank[q] = i + 1
                    if q not in Q:
                        Q.append(q)
        i = i + 1
        # 将下一层 Pareto 前沿加入到 front 中
        front.append(Q)
    # 删除最后一个空元素
    del front[len(front) - 1]
    # 返回 Pareto 前沿集合
    return front

用例测试:

假设有以下输入:

values1 = [5, 2, 9, 3, 7, 4]
values2 = [6, 4, 8, 2, 5, 3]

那么根据该测试用例,函数的返回结果应该是:

[[2], [0, 4], [1, 5], [3]]

解释一下返回结果的含义:返回列表中的第一个子列表 [2] 表示 Pareto 前沿的第一层,其中的解索引是 2 。这表示在给定的输入中,解 2 是非支配解且无法被其他解支配。返回列表中的第二个子列表 [0, 4] 表示 Pareto 前沿的第二层,其中的解索引分别是 0 和 4。这表示在给定的输入中,解 2 支配解 0和 4 ,解 0和 4 之间是非支配解。返回列表中的第三个子列表 [1, 5] 表示 Pareto 前沿的第三层,其中的解索引分别是 1 和 5。这表示在给定的输入中,解 0 和解 4 支配解 1和 5 ,解 1 和 5 之间是非支配解。其余类推。

目录
相关文章
|
11月前
|
算法 调度 UED
探索操作系统的心脏:调度算法的奥秘与影响
【10月更文挑战第9天】 本文深入探讨了操作系统中至关重要的组件——调度算法,它如同人体的心脏,维持着系统资源的有序流动和任务的高效执行。我们将揭开调度算法的神秘面纱,从基本概念到实际应用,全面剖析其在操作系统中的核心地位,以及如何通过优化调度算法来提升系统性能。
|
5月前
|
存储 算法 调度
基于和声搜索优化算法的机器工作调度matlab仿真,输出甘特图
本程序基于和声搜索优化算法(Harmony Search, HS),实现机器工作调度的MATLAB仿真,输出甘特图展示调度结果。算法通过模拟音乐家即兴演奏寻找最佳和声的过程,优化任务在不同机器上的执行顺序,以最小化完成时间和最大化资源利用率为目标。程序适用于MATLAB 2022A版本,运行后无水印。核心参数包括和声记忆大小(HMS)等,适应度函数用于建模优化目标。附带完整代码与运行结果展示。
152 24
|
22天前
|
机器学习/深度学习 算法 新能源
【优化调度】基于matlab粒子群算法求解水火电经济调度优化问题研究(Matlab代码实现)
【优化调度】基于matlab粒子群算法求解水火电经济调度优化问题研究(Matlab代码实现)
|
22天前
|
传感器 并行计算 算法
【无人机编队】基于非支配排序遗传算法II NSGA-II高效可行的无人机离线集群仿真研究(Matlab代码实现)
【无人机编队】基于非支配排序遗传算法II NSGA-II高效可行的无人机离线集群仿真研究(Matlab代码实现)
103 3
|
25天前
|
机器学习/深度学习 分布式计算 算法
【升级版本】基于多目标粒子群算法的微电网优化调度【风光、储能、柴油、燃气、电网交互】(Matlab代码实现)
【升级版本】基于多目标粒子群算法的微电网优化调度【风光、储能、柴油、燃气、电网交互】(Matlab代码实现)
|
3月前
|
算法 调度 SoC
基于粒子群算法的微电网经济调度
基于粒子群算法的微电网经济调度
41 1
|
2月前
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
118 0
|
7月前
|
存储 搜索推荐 算法
算法系列之排序算法-堆排序
堆排序(Heap Sort)是一种基于堆数据结构的比较排序算法。它的时间复杂度为 $O(nlogn)$,并且是一种原地排序算法(即不需要额外的存储空间)。堆排序的核心思想是利用堆的性质来维护一个最大堆或最小堆,然后逐步将堆顶元素(最大值或最小值)取出,放到数组的末尾,最终得到一个有序的数组。
160 8
算法系列之排序算法-堆排序
|
6月前
|
算法 数据可视化 调度
基于NSGAII的的柔性作业调度优化算法MATLAB仿真,仿真输出甘特图
本程序基于NSGA-II算法实现柔性作业调度优化,适用于多目标优化场景(如最小化完工时间、延期、机器负载及能耗)。核心代码完成任务分配与甘特图绘制,支持MATLAB 2022A运行。算法通过初始化种群、遗传操作和选择策略迭代优化调度方案,最终输出包含完工时间、延期、机器负载和能耗等关键指标的可视化结果,为制造业生产计划提供科学依据。
|
6月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章