基于C++实现了最小反馈弧集问题的三种近似算法(GreedyFAS、SortFAS、PageRankFAS)
该项目是一个基于链式前向星存图、boost(boost::hash、asio线程池)以及emhash7/8的非官方实现,实现了最小反馈弧集问题的三种近似算法。该问题是在有向图中找到最小的反馈弧集,其中反馈弧集是指一组弧,使得从这些反馈弧的尾部到头部的路径构成一个环。
算法实现
该项目基于C++实现了三种近似算法:
- GreedyFAS
这是一种基于贪心策略的算法,用贪心法生成一个线性排列,将该线性排列中的后向边集作为结果返回。
- 贪心策略
- 查找源头点,若查到源头点则排到序列s1末尾并移除该点,重复直到没有源头点
- 查找汇集点,若查到汇集点则排到序列s2头部并移除该点,重复直到没有汇集点
- 若既没有源头点,也没有汇集点,则定义delta值(出度-入度),将delta最大的点排到s1末尾。
- 计算剩余点的delta,将delta值最大的点排在s1末尾并移除该点。
- 返回{s1,s2} -> 最小线性排列

- SortFAS
该算法根据序号的自然顺序生成初始最小线性排列问题(LA),不断调整LA使后向边的数量尽可能少。

-
PageRankFAS
该算法是一种启发式算法,来自于论文[1] Geladaris V , Lionakis P , Tollis I G . Computing a Feedback Arc Set Using PageRank[J]. 2022,用于计算有向图中的最小反馈弧集 (FAS)。该算法的工作原理如下:检测图是否有环,如果存在环,执行以下循环:
- 识别有向图中的强连接分量si, i=0,1,…
- 遍历强连通分量si,对于每个强连通分量si,执行:
- 如果si的大小为1,跳过该强连通分量的处理
- 选择si中的一个随机节点v,从v开始遍历创建si的线图L(si)
- 计算L(si)的PageRank
- 选择L(si)中PageRank值最大的节点,找到si中对应的边e,添加到最小反馈弧集。
- 在si中删除边e
- 如果仍有环,重复执行1和2,直到图不存在环为止。



PageRankFAS 算法的输入是一个有向图 G,由顶点 V 和边 E 组成。输出是 G 的反馈弧集。
该算法可以用于可用于计算有向图中的最小反馈弧集(FAS),这是一个与可视化分层结构相关的具有挑战性的问题。它比现有的启发式方法更好,并将FAS大小平均减少了50%以上。尽管由于生成的折线图的大小,对于较大的网图,它的执行时间可能会增加,但即使对于在多达 4,000 个节点的图形绘制应用程序中使用的大型图形,它的运行速度也非常快。因此,这种方法对于研究需要计算 FAS 或涉及有向图(例如排名算法或网络流量分析等)的类似优化任务的研究人员可能很有用。
本项目的实现是基于C++语言,可以直接下载源代码并编译运行。详细的使用方法请参考项目中的 README 文件。
运行项目
如果您想尝试这些算法,需要克隆该项目,然后先安装Boost和gtest库,再使用cmake编译运行该项目
-
打开终端并输入以下命令来更新软件包列表:
sudo apt-get update -
输入以下命令来安装Boost库和gtest库:
sudo apt-get install libboost-all-dev libgtest-dev -
输入以下命令编译项目
cmake -B build && cmake --build build -
输入以下命令运行项目
./build/FASSolver [path/to/graph] [alorigthm (greedy | sort | pagerank)]
数据集
简单图
-
graphs/simple.txt
0,1 1,2 2,3 3,0 3,1 4,5 5,6 6,4
大型图
- graphs/wordassociation-2011.txt: 10,617 个顶点和 72,172 条有向边
- graphs/enron.txt: 69,244 个顶点和 276,143 条有向边
运行结果
简单图:
-
graphs/simple.txt
- GreedyFAS
2 2,3 6,4


-
graphs/simple.txt
- SortFAS
2 2,3 5,6


-
graphs/simple.txt
- PageRankFAS
2 1,2 4,5


大型图
- graphs/wordassociation-2011.txt
- GreedyFAS: 13634条反馈弧, 耗时0.701s
- SortFAS: 13510条反馈弧, 耗时0.817s
- PageRankFAS: 12086条反馈弧, 耗时68.856s
- graphs/enron.txt
- GreedyFAS: 38850条反馈弧, 耗时10.989s
- SortFAS: 36548条反馈弧, 耗时14.281s
- PageRankFAS: 33796条反馈弧, 耗时1398.224s


相关文章:
基于C++实现了最小反馈弧集问题的三种近似算法(GreedyFAS、SortFAS、PageRankFAS)
该项目是一个基于链式前向星存图、boost(boost::hash、asio线程池)以及emhash7/8的非官方实现,实现了最小反馈弧集问题的三种近似算法。该问题是在有向图中找到最小的反馈弧集,其中反馈弧集是指一组弧,使得从这些反馈弧…...
奶牛用餐 优先队列 java
👨🏫 奶牛用餐 约翰的农场有 n n n 头奶牛,编号 1 s i m n 1 \\sim n 1simn。 每天奶牛们都要去食堂用餐。 食堂一共有 k k k 个座位,也就是说同一时间最多可以容纳 k k k 头奶牛同时用餐。 已知,第 i i i …...
包管理机制pip3
pip3 安装pip3 安装pip3 apt install python3-pip yum install python3-pip从仓库出发的命令 查询仓库信息 // 获取默认pip3源 pip3 config get global.index-url查询所有软件包 查询已经安装的所有软件包 pip3 list从软件包出发的命令 从软件包名出发查询其他信息 查询…...
liunx在线安装tomcat
1、在线安装 https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.91/bin/apache-tomcat-8.5.91.tar.gz 执行:wget --no-check-certificate https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.91/bin/apache-tomcat-8.5.91.tar.gz ps:或者直接把tar.gz扔服务器 2、 编…...
导入示例工程出现error: failed to start ability. Error while Launching activity错误的解决办法
导入华为健康生活应用(ArkTS),使用DevEco Studio打开,运行报错: error: failed to start ability. Error while Launching activity解决办法:修改module.json5里面exported的值,由false改为tr…...
【深入了解PyTorch】PyTorch分布式训练:多GPU、数据并行与模型并行
【深入了解PyTorch】PyTorch分布式训练:多GPU、数据并行与模型并行 PyTorch分布式训练:多GPU、数据并行与模型并行1. 分布式训练简介2. 多GPU训练3. 数据并行4. 模型并行5. 总结PyTorch分布式训练:多GPU、数据并行与模型并行 在深度学习领域,模型的复杂性和数据集的巨大规…...
linux 下 网卡命名改名
Linux 操作系统的网卡设备的传统命名方式是 eth0、eth1、eth2等,而 CentOS7 提供了不同的命名规则,默认是网卡命名会根据网卡的硬件信息,插槽位置等有关;来分配。这样做的优点是命名全自动的、可预知的,缺点是比 eth0、…...
6.2.0在线编辑:GrapeCity Documents for Word (GcWord) Crack
GrapeCity Word 文档 (GcWord) 支持 Office Math 函数以及转换为 MathML GcWord 现在支持在 Word 文档中创建和编辑 Office Math 内容。GcWord 中的 OMath 支持包括完整的 API,可处理科学、数学和通用 Word 文档中广泛使用的数学符号、公式和方程。以下是通过 OMa…...
为什么需要智能指针?
为什么需要智能指针? 解决忘记释放内存导致内存泄漏的问题。解决异常安全问题。 #include<iostream> using namespace std;int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");return a / b; } void Func(…...
《华为认证》L2TP VPN配置
配置接口ip地址,并且将防火墙的接口加入对应的安全区域 。 LNS的G1/0/0 IP为202.1.1.1 1、配置LNS的缺省路由: ip route-static 0.0.0.0 0.0.0.0 202.1.1.2 2、通过WEB 界面配置防火墙的 L2TP VPN 浏览器输入: https://202.1.1.1:8443/def…...
【JVM】JVM垃圾收集器
文章目录 什么是JVM垃圾收集器四种垃圾收集器(按类型分)1.串行垃圾收集器(效率低)2.并行垃圾收集器(JDK8默认使用此垃圾回收器)3.CMS(并发)垃圾收集器(只针对老年代垃圾回收的) 什么是JVM垃圾收…...
StarGANv2: Diverse Image Synthesis for Multiple Domains论文解读及实现(一)
StarGAN v2: Diverse Image Synthesis for Multiple Domainsp github:https://github.com/clovaai/stargan-v2 1 模型架构 模型主要架构由四部分组成 ①Generator、②Mapping network、③Style encoder、④Discriminator Generator:G网络 生成模型G将输入图片x转换…...
Go Gin 中使用 JWT
一、JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。 二、为什么要用在你的Gin中使用JWT 传统的Cookie-Sesson模式占用服务器内存, 拓展性…...
AWS中Lambda集成SNS
1.创建Lambda 在Lambda中,创建名为AWSSNSDemo的函数 use strict console.log(loading function); var aws require(aws-sdk); var docClient new aws.DynamoDB.DocumentClient(); aws.config.regionap-southeast-1;exports.handler function(event,context,cal…...
Mac下⬇️Git如何下载/上传远程仓库
使用终端检查电脑是否安装Git git --version 通过此文章安装Git ➡️ 传送门🌐 方式1⃣️使用终端操作 1.下载——克隆远程仓库到本地 git clone [远程地址] 例:git clone https://gitee.com/lcannal/movie.git 2.编…...
linux 命令--常用关机命令
1.使用shutdown命令 shutdown命令是Linux系统下最常用的关机命令之一。它可以让系统在指定时间内进行关机或者重启操作。例如,下面的命令可以让系统在5分钟后进行关机操作: sudo shutdown -h5其中,“-h”表示关机,“5”表示5分钟…...
ttf-dejavu fontconfig字体
ttf-dejavu fontconfig是验证码,pdf,excel时需要用到的字体 编辑dockerfile,先切换国内镜像源,默认alpinelinux是国外源,下载包会很慢 vim Dockerfile FROM alpine:latest RUN sed -i s/dl-cdn.alpinelinux.org/mirr…...
Open3D点云数据处理(十九):最小二乘直线拟合(矩阵方程法)
文章目录 1 最小二乘直线拟合原理(矩阵方程角度)2 相关知识2.1 超定线性方程组2.2 正规方程2.3 奇异值分解3 最小二乘直线拟合代码实现4 点云最小二乘直线拟合5 相关链接专栏目录:Open3D点云数据处理(Python) 1 最小二乘直线拟合原理(矩阵方程角度) 最小二乘直线拟合是…...
数据库事务ACID介绍
一、ACID简介 ACID,是指数据库管理系统(DBMS)在增删改数据的的过程中,为保证事务(transaction)的准确性,可靠性等,所必须具备的四个特性:原子性(atomicity&a…...
SM8650 qcxserver.c STRM_Initialize
STRM_Initialize streammanager 初始化流程 目录 STRM_Initialize Gptp::Init Config::Init SensorManager::Init SensorPlatform::SensorPlatformInit SensorManager::LoadSensorLib SensorManager::OpenSensorLib SensorManager::DetectAll SensorManager::DetectHandlerT…...
揭秘ComfyUI-SUPIR核心技术:从架构设计到实战调优的深度解析
揭秘ComfyUI-SUPIR核心技术:从架构设计到实战调优的深度解析 【免费下载链接】ComfyUI-SUPIR SUPIR upscaling wrapper for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-SUPIR ComfyUI-SUPIR作为ComfyUI生态中专业的图像超分辨率插件&…...
d2dx:重塑经典暗黑2的现代游戏体验革新
d2dx:重塑经典暗黑2的现代游戏体验革新 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 在数字游戏遗产的复兴浪潮…...
Mac Mouse Fix终极实战指南:从普通鼠标到专业级触控板体验
Mac Mouse Fix终极实战指南:从普通鼠标到专业级触控板体验 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix Mac Mouse Fix是一款革命…...
Bioicons:如何在10分钟内为科研论文找到完美的免费矢量图标?
Bioicons:如何在10分钟内为科研论文找到完美的免费矢量图标? 【免费下载链接】bioicons A library of free open source icons for science illustrations in biology and chemistry 项目地址: https://gitcode.com/gh_mirrors/bi/bioicons Bioic…...
API 网关怎么设计?一次讲清鉴权、路由、限流、灰度、日志与统一治理
API 网关怎么设计?一次讲清鉴权、路由、限流、灰度、日志与统一治理 大家好,我是一名有 4 年工作经验的 Java 后端开发。 微服务项目里,API 网关几乎是最容易被说成“就转发一下请求”的组件。 但真正做起来你会发现,很多稳定性、…...
为什么90%的团队不敢在金融核心系统启用Java 25虚拟线程?揭开3大未公开的JVM安全缺陷(含CVE-2024-XXXX临时缓解补丁)
第一章:Java 25虚拟线程在金融核心系统中的安全准入边界金融核心系统对一致性、可审计性与故障隔离能力具有严苛要求,Java 25引入的虚拟线程虽显著提升高并发I/O吞吐,但其轻量调度模型与传统平台线程存在本质差异,必须建立明确的安…...
正交信号原理与应用:从复数基础到通信系统实现
1. 正交信号基础:从复数到实际应用 在数字信号处理领域,正交信号(Quadrature Signals)构成了现代通信系统的数学基础。这种基于复数表示的方法,虽然初看起来有些抽象,但一旦理解其本质,就能打开…...
CCMusic可复现性保障:Dockerfile+requirements.txt+config.yaml三件套详解
CCMusic可复现性保障:Dockerfilerequirements.txtconfig.yaml三件套详解 1. 项目概述 CCMusic Audio Genre Classification Dashboard是一个基于Streamlit和PyTorch构建的高级音频分析平台。这个项目的独特之处在于它不采用传统的音频特征提取方法,而是…...
国产ZYNQ四核ARM实战:手把手教你用SGI中断实现CPU0与CPU1的核间通信
国产ZYNQ四核ARM实战:SGI中断实现CPU核间通信全解析 在嵌入式系统开发中,多核处理器间的协同工作一直是提升性能的关键。国产ZYNQ平台搭载的四核ARM Cortex-A9处理器,为高性能嵌入式应用提供了强大支持。本文将深入探讨如何利用SGI࿰…...
Windows Cleaner深度解析:彻底解决C盘爆红问题的开源利器
Windows Cleaner深度解析:彻底解决C盘爆红问题的开源利器 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否曾经遇到过这样的窘境?正在…...
