基于C++实现了最小反馈弧集问题的三种近似算法(GreedyFAS、SortFAS、PageRankFAS)

news2025/1/14 18:35:24

该项目是一个基于链式前向星存图、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)。该算法的工作原理如下:

    检测图是否有环,如果存在环,执行以下循环:

    1. 识别有向图中的强连接分量si, i=0,1,…
    2. 遍历强连通分量si,对于每个强连通分量si,执行:
      1. 如果si的大小为1,跳过该强连通分量的处理
      2. 选择si中的一个随机节点v,从v开始遍历创建si的线图L(si)
      3. 计算L(si)的PageRank
      4. 选择L(si)中PageRank值最大的节点,找到si中对应的边e,添加到最小反馈弧集。
      5. 在si中删除边e
    3. 如果仍有环,重复执行1和2,直到图不存在环为止。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

PageRankFAS 算法的输入是一个有向图 G,由顶点 V 和边 E 组成。输出是 G 的反馈弧集。

该算法可以用于可用于计算有向图中的最小反馈弧集(FAS),这是一个与可视化分层结构相关的具有挑战性的问题。它比现有的启发式方法更好,并将FAS大小平均减少了50%以上。尽管由于生成的折线图的大小,对于较大的网图,它的执行时间可能会增加,但即使对于在多达 4,000 个节点的图形绘制应用程序中使用的大型图形,它的运行速度也非常快。因此,这种方法对于研究需要计算 FAS 或涉及有向图(例如排名算法或网络流量分析等)的类似优化任务的研究人员可能很有用。

本项目的实现是基于C++语言,可以直接下载源代码并编译运行。详细的使用方法请参考项目中的 README 文件。

运行项目

如果您想尝试这些算法,需要克隆该项目,然后先安装Boost和gtest库,再使用cmake编译运行该项目

  1. 打开终端并输入以下命令来更新软件包列表:

    sudo apt-get update
    
  2. 输入以下命令来安装Boost库和gtest库:

    sudo apt-get install libboost-all-dev libgtest-dev
    
  3. 输入以下命令编译项目

    cmake -B build && cmake --build build
    
  4. 输入以下命令运行项目

    ./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

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

环境与分支的详细介绍及其关联(开发、测试、预发布、生产)

文章目录 前言一、开发环境(dev)二、测试环境(test)三、预发布环境(pre)四、生产环境(pro)五、环境与分支的关系总结 前言 在现代软件开发中,前端项目的开发和部署往往需…

【wiki】电竞助手掉落提醒 EsportsHelper「Webhook」「钉钉」「饭碗警告」「企业微信」「Discord」

介绍 本项目链接 Github电竞助手链接 github上项目电竞助手(EsportsHelper)的掉落提醒配置教程,当有掉宝的时候会发送你信息提示. 至于这个脚本是怎么使用的简单说一下,就是通过自动观看英雄联盟直播 从而获取奖励(仅限直营服),有兴趣的可以去github上看readme,非常详细,支持…

广联达 Linkworks办公OA SQL注入+后台文件上传漏洞复现(HW0day)

0x01 产品简介 广联达Linkworks办公OA(Office Automation)是一款综合办公自动化解决方案,旨在提高组织内部的工作效率和协作能力。它提供了一系列功能和工具,帮助企业管理和处理日常办公任务、流程和文档。 0x02 漏洞概述 由于 广…

hackNos靶机

靶机训练1 - hackNos: Os-hackNos 靶机平台 Vulnhub 是一个提供各种漏洞环境的靶场平台,供安全爱好者学习使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行。每个镜像会有破解的目…

【CSS学习笔记】

学习内容 1.css是什么 2.CSS怎么用(快速入门) 3.CSS选择器(重点 难点) 4.美化页面(文字、阴影、超链接、列表、渐变…) 5.盒子模型 6.浮动 7.定位 8.网页动画(特效) 1.什么是CSS C…

Reinforcement Learning with Code 【Chapter 10. Actor Critic】

Reinforcement Learning with Code 【Chapter 10. Actor Critic】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of …

Blazor简单教程(2):布局

文章目录 前言布局自定义布局默认布局 前言 我们现在主流的页面都是单页面Layout布局,即一个页面有侧边栏,抬头,下边栏,中间主题。 BootstrapBlazor UI, Blazor Server 模式配置 布局 自定义布局 注入LayoutCompon…

微服务06-分布式事务解决方案Seata

1、Seata 概述 Seata事务管理中有三个重要的角色: TC (Transaction Coordinator) - **事务协调者:**维护全局和分支事务的状态,协调全局事务提交或回滚。 TM (Transaction Manager) - **事务管理器:**定义全局事务的范围、开始全局事务、提交或回滚全局事务。 RM (Resourc…

软考笔记 信息管理师 高级

文章目录 介绍考试内容与时间教材 预习课程一些例子课本结构考试内容 1 信息与信息化1.1 信息与信息化1.1.1 信息1.1.2 信息系统1.1.3 信息化 1.2 现代化基础设施1.2.1 新型基础建设1.2.2 工业互联网1.2.3 车联网: 1.3 现代化创新发展1.3.1 农业农村现代化1.3.2 两化…

常见的路由协议之RIP协议与OSPF协议

目录 RIP OSPF 洪泛和广播的区别 路由协议是用于在网络中确定最佳路径的一组规则。它们主要用于在路由器之间交换路由信息,以便找到从源到目标的最佳路径。 常见的路由协议: RIP (Routing Information Protocol):RIP 是一种基于距离向量算…

cookie是什么?

cookie是什么? Cookie实际上是一小段的文本信息。 http协议本身是无状态的。无状态是指Web浏览器与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(Response)&…

用友移动管理系统 任意文件上传漏洞复现(HW0day)

0x01 产品简介 用友移动系统管理是用友公司推出的一款移动办公解决方案,旨在帮助企业实现移动办公、提高管理效率和员工工作灵活性。它提供了一系列功能和工具,方便用户在移动设备上管理和处理企业的系统和业务。 0x02 漏洞概述 用友移动管理系统 uploa…

Kubesphere中DevOps流水线无法部署/部署失败

摘要 总算能让devops运行以后,流水线却卡在了deploy这一步。碰到了两个比较大的问题,一个是无法使用k8sp自带的kubeconfig认证去部署;一个是部署好了以后但是没有办法解析镜像名。 版本信息 k8s:v1.21.5 k8sp:v3.3.…

GO学习之 微框架(Gin)

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…

kafka高吞吐量分享

消息队列kafka基本介绍基本概念整体架构 高吞吐量实现分区分段顺序写磁盘零拷贝技术DMA(Direct Memory Access)传统传输零拷贝传输 批量发送 消息队列 解耦合 耦合的状态表示当你实现某个功能的时候,是直接接入当前接口,而利用消…

20230812在WIN10下使用python3将SRT格式的字幕转换为SSA格式

20230812在WIN10下使用python3将SRT格式的字幕转换为SSA格式 2023/8/12 20:58 本文的SSA格式以【Batch Subtitles Converter(批量字幕转换) v1.23】的格式为准! 1、 缘起:网上找到的各种各样的字幕转换软件/小工具都不是让自己完全满意! 【都…

2023年中国智慧公安行业发展现况及发展趋势分析:数据化建设的覆盖范围不断扩大[图]

智慧公安基于互联网、物联网、云计算、智能引擎、视频技术、数据挖掘、知识管理为技术支撑,公安信息化为核心,通过互联互通、物联化、智能方式促进公安系统各功能模块的高度集成、协同作战实现警务信息化“强度整合、高度共享、深度应用”警察发展的新概…

goland插件推荐Rider UI Theme Pack

推荐一个goland配色插件Rider UI Theme Pack,里面自带visual assist配色,配色截图如下: 直接在plugins里面进行搜索或者在插件home page下载后进行安装均可。 总算找到一统vscode 和goland二者优势的插件了。

由于找不到d3dx9_42.dll,无法继续执行代码。重新安装程序可能会解决此问题

d3dx9_42.dll是一个动态链接库文件,它是Microsoft DirectX 9的一部分。这个文件包含了DirectX 9的一些函数和资源,用于支持计算机上运行基于DirectX 9的应用程序和游戏。它通常用于提供图形、音频和输入设备的支持,以及其他与图形和游戏相关的…

【分布式系统】聊聊高性能设计

每个程序员都应该知道的数字 高性能 对于以上的数字,其实每个程序员都应该了解,因为只有了解这些基本的数字,才能知道对于CPU、内存、磁盘、网络之间数据读写的时间。1000ms 1S。毫秒->微秒->纳秒-秒->分钟 为什么高性能如此重要的…