枚举有向图节点

时间:2015-02-12 16:27:03

标签: graph-theory heuristics

假设我有一个边缘相对较少的有向图(例如N = 1000个节点,M = 3000个边缘)。我需要枚举从1到N的节点,以便尽可能少的边从较低编号的节点指向较高编号的节点。

例如,这是一个很好的优势:

44 o----------->o 12

这个很糟糕:

 3 o------------> 117

我怎么能解决这个问题?我想这些任务有现有算法,但不知道要搜索什么。此外,我不需要找到绝对最好的解决方案,只需要在实践中足够接近。例如。如果全局最佳是5个坏边缘,那么10个坏边缘的解决方案对我的目的来说也足够了(但是200不是)。

2 个答案:

答案 0 :(得分:1)

特别是因为你只想要一个好的解决方案,而不一定是最好的,这听起来像马尔可夫链蒙特卡罗方法应该适合你。

  1. 从节点的随机枚举E_0开始计算得分S(E_0)

  2. 许多步骤

    • 每次执行步骤j,通过更改两个节点的数量,从当前E_j获取新的枚举候选E *。
    • 计算得分S(E *)。 (不要完全计算它是新的,而是从S(E_j)只考虑你改变的两个节点及它们所涉及的边缘)
    • 如果S(E *)< = S(E_j),则将E_j改变为E *。
    • 如果S(E *)> S(E_j)仍然将E_j改为E_ *且为正 概率,f.e。 (S(E_j)/ S(E _ *))^ k其中k影响方式 强烈希望你的算法能够惩罚糟糕的选择。
  3. 运行此算法时,请跟踪获得的最低分数和实现该分数的枚举。

答案 1 :(得分:1)

你必须有来自周期的边缘,所以你首先想要将问题分解为strongly connected components

请注意,强连接组件的图形是非循环的,这意味着可以轻松比较来自不同组件的两个节点。

然后,您可以尝试在每个循环中搜索循环并“标记坏”一个边缘,这将自己将组件转换为DAG(您可以尝试删除许多循环中常见的边缘,这应该有帮助)。

我不得不承认我不知道这会如何处理坏边缘,但我认为这将是一个很好的方法。