将加权直接循环图转换为等效非循环图

时间:2013-05-22 07:27:20

标签: algorithm graph-algorithm

我有一个循环加权有向图,目标是去除路径中存在的循环。

例如:路径如下,

from | to | weight
------------------
a    -> b | 0.5
a    -> c | 0.5
c    -> e | 1
b    -> d | 1
d    -> a | 0.25
d    -> f | 0.75

图中的循环由路径d - >引入。一个。任何人都可以建议一个算法去除周期d - > a通过调整其他节点的权重。得到的非循环图在将权重传递给末端节点e,f。

方面是等效的

谢谢, 的Vivek

2 个答案:

答案 0 :(得分:4)

Sleator-Tarjan将此称为非循环流问题,并在first paper on dynamic trees的第389页描述O(m log n)-time解决方案。如果您不需要最快的算法,请重复使用深度优先搜索来查找一个流程周期,然后反向发送取消一个或多个弧的最小流量。

在你的图表上:

a    -> b | 0.5
a    -> c | 0.5
c    -> e | 1
b    -> d | 1
d    -> a | 0.25
d    -> f | 0.75

DFS找到一个周期a -0.5> b -1> d -0.25> a。在同一周期发送-0.25

a    -> b | 0.5 - 0.25 = 0.25
a    -> c | 0.5
c    -> e | 1
b    -> d | 1 - 0.25 = 0.75
d    -> f | 0.75

我们删除

d    -> a | 0.25 - 0.25 = 0

流量是非循环的,所以我们停止了。

答案 1 :(得分:2)

从你的评论到大卫的答案以及图表的权重,我认为权重是从一个节点移动到另一个节点的概率(或从一个节点移动到另一个节点的单位的百分比,无论哪种方式数学是一样的)。如果是这样,可以将其建模为Markov chain,更具体地说,建模为absorbing Markov chain。但首先,我们需要添加两条路径来适应形式定义:

e -> e | 1.0
f -> f | 1.0

我不确定您是否需要与此类似的多个图形的通用算法,否则这是您需要解决的唯一图形。我将概述这个特定图形所涉及的数学,并希望您可以在需要时将其推广到算法中。

算法非常麻烦,请按照absorbing Markov chain链接进行操作。

首先,在处理马尔可夫链时,我们需要邻接矩阵,通常称为状态转移矩阵

  |  a     b     c     d  |  e     f
--+-----------------------+------------
a |  0     0.5   0.5   0  |  0     0
b |  0     0     0     1  |  0     0
c |  0     0     0     0  |  1     0
d |  0.25  0     0     0  |  0     0.75
--+-----------------------+------------
e |  0     0     0     0  |  1     0
f |  0     0     0     0  |  0     1

矩阵的左上部分是瞬态(非结束)状态之间的转换(由 Q 表示),右下角是吸收状态。右上角将由 R 表示。

基本矩阵,计算为 N =( I - Q -1 。而吸收概率(即给定无限时间,将在每个吸收状态中结束的百分比)给出为 B = NR 。使用我最好的ASCII矩阵,该图的数字是:

         +-          -+             +-    -+  
         | 8  4  4  4 |             | 4  3 |
         | 2  8  1  8 |             | 1  6 |
N = (1/7)| 0  0  7  0 |    B = (1/7)| 7  0 |
         | 2  1  1  8 |             | 1  6 |
         +-          -+             +-    -+ 

读取 B 矩阵的顶行,从状态a开始,有一个4/7(约0.5714)结束状态e的机会,和3/7(约0.4286)结束状态f的机会。您可以忽略其他三行,因为这些是在状态b,c和d中启动时的概率。

因此,如果你想要一个等效图,其中结束状态e和f的最终机会是相同的,但没有循环,你可以删除d - >路径,并使用以下权重:

a -> b | 0.4286
a -> c | 0.5714