基于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)。该算法的工作原理如下:

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

    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

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mDeepLearning4205

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值