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

这段代码实现的是快速非支配排序算法(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 和支配该解的次数 nfor p in range(0, len(values1)):S[p] = []n[p] = 0for 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] = 0if p not in front[0]:front[0].append(p)# 循环计算 Pareto 前沿集合i = 0while (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 + 1if 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 之间是非支配解。其余类推。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

encoding/json vs json-iterator

encoding/json vs json-iterator 100% Compatibility 默认情况下,jsoniter 不会像标准库那样对映射键进行排序。如果你想要 100% 的兼容性,就这样使用 m : map[string]interface{}{"3": 3,"1": 1,"2": 2, } json : json…

线性代数 --- 矩阵的QR分解,A=QR

矩阵的QR分解,格拉姆施密特过程的矩阵表示 首先先简单的回顾一下Gram-Schmidt正交化过程的核心思想,如何把一组线性无关的向量构造成一组标准正交向量,即,如何把矩阵A变成矩阵Q的过程。 给定一组线性无关的向量a,b,c,我…

Transformer预测 | Pytorch实现基于mmTransformer多模态运动预测(堆叠Transformer)

文章目录 文章概述程序设计参考资料文章概述 Transformer预测 | Pytorch实现基于mmTransformer多模态运动预测(堆叠Transformer) 程序设计 Initialize virtual environment: conda create -n mmTrans python=3.7# -*- coding: utf-8 -*- import argparse import os

推荐高效的电脑磁盘备份解决方案!

该怎样实现电脑磁盘备份? 接下来,我们将为你介绍两种磁盘备份方法。一种是利用操作系统自带的功能,另一种则是通过第三方工具实现。 方法一. Windows自带的备份还原功能 要在Windows 11/10/8/7中备份软件,你可以使…

[代码学习]matmul的理解与使用

matmul 的理解与使用 引言:本实例以paddle框架中的matmul为例进行说明。torch和numpy中的matmul同理。 简介 PaddlePaddle中的matmul是一个矩阵乘法函数,可以用来实现两个矩阵的乘法操作。在PaddlePaddle的动态图模式下,可以用paddle.matmul…

一文带你了解 Linux 的 Cache 与 Buffer

目录 前言一、Cache二、Buffer三、Linux 系统中的 Cache 与 Buffer总结 前言 内存的作用是什么?简单的理解,内存的存在是为了解决高速传输设备与低速传输设备之间数据传输速度不和谐而设立的中间层(学过计算机网络的应该都知道,这…

【内网穿透】Docker部署Drupal并实现公网访问

目录 前言 1. Docker安装Drupal 2. 本地局域网访问 3 . Linux 安装cpolar 4. 配置Drupal公网访问地址 5. 公网远程访问Drupal 6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS,适用于各种不同的网站项目,从小型个人博客到大型企业级门户网站。…

【Python】实现excel文档中指定工作表数据的更新操作

在做数值计算时,个人比较习惯利用excel文档的公式做数值计算进行对比,检查异常,虽然计算量大后,excel计算会比较缓慢,但设计简单,易排错 但一般测试过程中使用到的数据都不是最终数值,会不停根据…

红队专题-从零开始VC++远程控制软件RAT-C/S-[1]远控介绍及界面编写

红队专题 招募六边形战士队员[1]---远控介绍及界面编写1.远程控制软件演示及教程简要说明主程序可执行程序 服务端生成器主机上线服务端程序 和 服务文件管理CMD进程服务自启动主程序主对话框操作菜单列表框配置信息 多线程操作非模式对话框 2.环境:3.界面编程新建项…

实现基于 GitLab 的数据库 CI/CD 最佳实践

数据库变更一直是整个应用发布过程中效率最低、流程最复杂、风险最高的环节,也是 DevOps 流程中最难以攻克的阵地。那我们是否能在具体的 CI/CD 流程中,像处理代码那样处理数据库变更呢? DORA 调研报告 DORA(DevOps Research &am…

前后端分离项目-基于springboot+vue的足球青训俱乐部管理后台系统的设计与实现(内含代码+文档+报告)

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

用于物体识别和跟踪的下游任务自监督学习-1-引言

一:引言: 图像和视频理解是计算机视觉应用中的基本问题,旨在使机器能够像人类一样解释和理解视觉数据。这些问题涉及识别图像和视频中的对象、人物、动作、事件和场景。如图1.1-(a)所示的图像识别任务包括对象检测[1]…

Python 对字符串切片及翻转(毫无含金量)

给定一个字符串,从头部或尾部截取指定数量的字符串,然后将其翻转拼接。 def rotate(input,d):lfirstinput[0:d]lsecondinput[d:]rfirstinput[0:len(input)-d]rsecondinput[len(input)-d:0]print("头部切片反转:",(lsecondlfirst))…

Netty深入浅出Java网络编程学习笔记(一) Netty入门篇

目录 一、概述 1、什么是Netty 2、Netty的优势 二、入门案例 1、服务器端代码 2、客户端代码 3、运行流程 组件解释 三、组件 1、EventLoop 处理普通与定时任务 关闭 EventLoopGroup 处理IO任务 服务器代码 客户端代码 分工细化 划分Boss 和Work 增加自定义EventLoopGroup 切换…

云计算:常用运维软件工具

目录 一、理论 1.云管理工具 2.虚拟化工具 3.容器管理工具 4.运维自动化工具 5.版本控制工具 6.配置管理工具 7.编辑器工具 8.代码质量工具 9.网络管理工具 10.数据库管理工具 11.数据中心设备管理工具 12.数据可视化工具 13.服务器管理工具 14.应用性能管理工具…

银河麒麟安装arm架构mysql8

1. 准备工作 2. 查看麒麟系统版本 使用命令 Linux version 4.19.90-25.21.v2101.ky10.aarch64 (KYLINSOFTlocalhost.localdomain) (gcc version 7.3.0 (GCC)) #1 SMP Wed Sep 28 16:37:42 CST 2022可以看出这是麒麟 v10 ,aarch64 (ARM 架构的&#xff…

【d2l动手学深度学习】 Lesson 10 多层感知机 + 代码实现 试验结果对比

文章目录 1. 介绍2. 单层Softmax回归2.1 手写Softmax训练效果 2.2 调用pytorch内置的softmax回归层实现调用pytorch内置softmax实验结果总结 3. 一层感知机(MLP) Softmax实验结果 Reference写在最后 1. 介绍 在第十节课 多层感知机 的代码实现部分&…

机器学习1:k 近邻算法

k近邻算法(k-Nearest Neighbors, k-NN)是一种常用的分类和回归算法。它基于一个简单的假设:如果一个样本的k个最近邻居中大多数属于某一类别,那么该样本也很可能属于这个类别。 k近邻算法的步骤如下: 输入&#xff1a…

JVM第二讲:JVM 基础 - 字节码详解

JVM 基础 - 字节码详解 本文是JVM第二讲,JVM 基础-字节码详解。源代码通过编译器编译为字节码,再通过类加载子系统进行加载到JVM中运行。 文章目录 JVM 基础 - 字节码详解1、多语言编译为字节码在JVM运行2、Java字节码文件2.1、Class文件的结构属性2.2、…

Linux shell编程学习笔记10:expr命令 和 算术运算

Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、字符串、文件测试等多种运算。上节我们研究了 Linux shell编程 中的 字符串运算,今天我们研究 Linux shell编程的算术运算 ,为了方便举例,我们同时对expr命令进行…