【问题标题】:Finding the cycle of smallest average weight in a directed graph在有向图中找到最小平均权重的循环
【发布时间】:2013-10-18 04:37:42
【问题描述】:

我正在寻找一种算法,它采用有向加权图(具有正整数权重)并在图中找到具有最小平均权重(而不是总权重)的循环。

基于类似的问题(但对于总重量),我考虑应用 Floyd-Warshall 算法的修改,但它会依赖于以下属性,不成立(谢谢 Ron Teller 提供了一个反例来说明这一点):“对于顶点 U、V、W,如果有从 U 到 V 的路径 p1、p2 和从 V 到 W 的路径 p3、p4,那么这些路径的最优组合得到从 U 到 W 是 p1,p2 更好的,其次是 p3,p4 更好的。”

我可能会考虑哪些其他算法不依赖此属性?

编辑:将以下不再相关的段落移到问题下方。

虽然这个属性看起来很直观,但它似乎不适用于两条同样可取的路径。例如,如果 p1 的总重量为 2 和长度为 2,而 p2 的总重量为 3 和长度为 3,则没有一个比另一个更好。但是,如果 p3 和 p4 的总权重大于长度,则 p2 比 p1 更可取。在我想要的应用程序中,每条边的权重都是正整数,所以这个属性是强制的,我想我可以假设,在平局的情况下,更长的路径更好。但是,我仍然无法证明这行得通,因此我无法验证任何依赖它的算法的正确性。

【问题讨论】:

    标签: algorithm average graph-theory cycle


    【解决方案1】:

    “虽然这个属性看起来很直观,但它似乎并不适用于 两条同样可取的路径的情况。”

    实际上,当您考虑 2 个参数(重量、长度)时,它在任何情况下都不成立,这是一个示例,当 P1 本身的平均值小于 P2 时,有时可能更好(示例 1)最终解决方案或更糟(示例 2),取决于 P3 和 P4。

    示例 1:

    L(P1) = 9, W(P1) = 10
    L(P2) = 1, W(P2) = 1
    L(P3) = 1, W(P3) = 1
    L(P4) = 1, W(P4) = 1
    

    示例 2:

    L(P1) = 9, W(P1) = 10
    L(P2) = 1, W(P2) = 1
    L(P3) = 5, W(P3) = 10
    L(P4) = 5, W(P4) = 10
    

    这两个参数对你的目标函数有影响,无法在本地确定,因此任何修改的 Floyd-Warshall 算法都将不起作用。

    由于您只考虑循环,因此您可能需要考虑使用蛮力算法来验证图中每个循环的平均权重。您可以在多项式时间内完成,请参阅: Finding all cycles in graph

    【讨论】:

    • 你说得对——但是,在我的应用程序中,我可以为所有 P 添加约束,L(P) >= W(P)。有了这个约束,所需的属性是否成立(在平局的情况下,较长的路径比较短的路径更可取)?
    • @wlritchi 仍然没有。这是另一个例子:(1)L[1]=40 W[1]=30 L[2]=4 W[2]=2 L[3]=1 W[3]=1 L[4]=1 W[4]=1(2)L[1]=40 W[1]=30 L[2]=4 W[2]=2 L[3]=1 W[3]=1 L[4]=100 W[4]=100。在示例中 (1) P2 更好,在 (2) P1 中更好。
    【解决方案2】:

    我可以建议另一种算法。

    让我们修正 C。现在从所有权重中减去 C。答案会如何变化?如果我们从所有权重中减去相同的数字,那么每个周期的平均权重在相同的数字 C 上减少。现在让我们检查是否有负平均权重的周期。平均权重为负的条件等于权重为负的条件。所以检查我们是否有负权重的循环就足够了。我们可以使用Bellman-Ford algorithm 来实现。如果我们有这样一个循环,那么答案就小于 C。

    所以现在我们可以通过二分搜索找到答案。得到的复杂度将是 O(VE log(MaxWeight))

    【讨论】:

    • 我非常喜欢这种方法,但它只能成功检测图中的循环,以便每个顶点都可以从所选源到达。避免这种限制的最简单方法是将每个顶点作为源运行,但这会产生 O(V^2E log(MaxWeight)) 的复杂度。
    • 我认为我们可以通过在开始时将图分解为连通分量来避免这个问题
    • 要找到这些连接的组件,是否足以选择一个源,获取由源可到达的顶点组成的组件,并使用新源重复(到目前为止找到的组件之外),直到所有顶点已包含在至少一个组件中?
    • 不幸的是没有。但相反,我们可以将图分解为强连接的组件。例如,我们可以使用Kosaraju's algorithm 来处理线性时间。而不是独立处理每个组件。我们可以这样做,因为如果图中存在一个循环,它属于其中一个组件,因为所有循环的顶点都可以相互访问。
    • 为什么我提出的方法不起作用(即使它效率低下)?当且仅当此循环中的顶点可从目前选择的源之一到达时,任何循环都将包含在组件中。由于每个顶点都将包含在一个组件中,因此每个循环也将包含在一个(或多个)中。
    【解决方案3】:

    您描述的问题称为最小平均循环问题,可以有效解决。此外,如果您有兴趣,可以查看一些非常好的优化理论(从标准参考 AMO93 开始)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      相关资源
      最近更新 更多