基于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…...
阅读效率低下,读后即忘,还怎么写文献综述?
对于每一位研究生来说,开题报告的文献综述环节堪称“第一道难关”。面对领域内成百上千篇中英文文献,熬了几个通宵精读,合上文献却记不清核心观点;好不容易整理出一堆笔记,拼凑起来的综述却逻辑混乱、重点模糊…...
UG后处理TCL编程实战:手把手教你定制刀具信息输出格式(含完整代码)
UG后处理TCL编程实战:手把手教你定制刀具信息输出格式(含完整代码) 在数控加工领域,UG后处理的灵活定制能力直接决定了最终加工程序的可用性和效率。刀具信息作为程序中最关键的参数之一,其输出格式的合理设计不仅能减…...
STC15单片机超声波测距保姆级教程:从原理到代码,手把手搞定蓝桥杯CT107D平台
STC15单片机超声波测距实战指南:从硬件连接到代码调试全解析 第一次接触超声波测距时,我盯着那堆代码和电路图发呆了半小时——为什么发送端要接P1.0?那个神秘的delay12us()到底怎么算出来的?如果你也曾在蓝桥杯CT107D开发板前感到…...
Windows 11 LTSC 24H2 微软商店一键安装终极指南:3分钟解决应用商店缺失问题
Windows 11 LTSC 24H2 微软商店一键安装终极指南:3分钟解决应用商店缺失问题 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore 你是否在使用…...
革命性PCB缺陷检测数据集:DeepPCB如何重塑电子制造业质量标准
革命性PCB缺陷检测数据集:DeepPCB如何重塑电子制造业质量标准 【免费下载链接】DeepPCB A PCB defect dataset. 项目地址: https://gitcode.com/gh_mirrors/de/DeepPCB 在电子制造业的精密世界中,PCB(印刷电路板)的微小缺陷…...
VMware ovftool隐藏玩法:从格式互转、代理设置到对接vCenter的完整避坑手册
VMware ovftool高阶实战:从格式转换到企业级部署的深度解析 引言 在虚拟化环境管理中,OVF(Open Virtualization Format)作为行业标准格式,已经成为跨平台虚拟机迁移的重要载体。而VMware ovftool作为官方提供的命令行工…...
Qwen3.5-9B-GGUF实操手册:service.log日志分析与排错技巧
Qwen3.5-9B-GGUF实操手册:service.log日志分析与排错技巧 1. 项目概述 Qwen3.5-9B-GGUF是基于阿里云开源的Qwen3.5-9B模型,经过GGUF格式量化后的推理服务项目。这个项目使用llama-cpp-python作为推理引擎,配合Gradio构建了简单易用的Web界面…...
Bioicons:生物科研工作者的免费矢量图标库
Bioicons:生物科研工作者的免费矢量图标库 【免费下载链接】bioicons A library of free open source icons for science illustrations in biology and chemistry 项目地址: https://gitcode.com/gh_mirrors/bi/bioicons 在生物科学研究中,高质量…...
城通网盘限速破解终极指南:3分钟学会10倍下载加速
城通网盘限速破解终极指南:3分钟学会10倍下载加速 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否曾因城通网盘的非会员限速而抓狂?下载一个1GB文件需要等待数小时&#x…...
保姆级教程:手把手教你用C++实现格雷码+相移的三维重建(附完整代码与补码处理)
从零实现结构光三维重建:格雷码与相移的C实战指南 开篇:为什么选择格雷码相移方案? 在工业检测、逆向工程和医疗成像领域,结构光三维重建技术因其非接触、高精度的特性成为首选方案。而格雷码结合相移的方法,尤其适合需…...
