【问题标题】:What algorithm should I use to find the minimum flow on a digraph where there are lower bounds but not upper bounds on flow?我应该使用什么算法来找到有向图中的最小流量,其中流量有下限但没有上限?
【发布时间】:2013-09-03 17:43:50
【问题描述】:

我应该使用什么算法来找到有向图上有下限但没有流量上限的最小流量?比如这个简单的例子:

在文献中,这是一个最小成本流问题。然而,在我的情况下,成本与每个边缘所需的流量的非零下限相同,因此我将问题表述为上述问题。在文献中,问题是:找到单源/单汇有向无环图的最小成本流的最佳算法是什么,其中每条边具有无限容量,流的非零下限,以及成本等于流量的下限。

从我的研究看来,人们处理任何类型网络的任何类型的最低成本的主要方式是将问题设置为LP-type problem 并以这种方式解决。然而,我的直觉是流量没有上限,即具有无限容量的边缘使问题更容易,所以我想知道是否有一种算法专门针对这种情况,使用比单纯形法等更多的“图形”技术。人。

我的意思是,如果所有成本和下限都为 1,如上...然后我们正在寻找一个覆盖所有边缘的流,遵守流规则,并且不会通过任何路径从s 到 t。对我来说,这只是感觉它不应该需要 LP 求解器,事实上,维基百科关于最小成本流的文章指出“如果消除容量限制,问题就会简化为最短路径问题”,但我认为他们正在谈论下界全为零的情况。

还有开源 C/C++ 代码可以在任何地方实现最低成本吗?通过谷歌搜索可用的内容,我发现我可以自己将问题设置为 LP 问题并使用开源 LP 求解器进行求解,或者我可以使用 LEMON,它为最小成本流提供了几种算法。据我所知,boost 图形库不包含实现。

还有别的吗?

【问题讨论】:

  • 标题上的星星不错,哈哈
  • 我真的不知道那颗星星是从哪里来的……

标签: c++ graph-algorithm linear-programming network-flow


【解决方案1】:

在没有上限的情况下,找到图的最小流的最简单方法(最容易实现、理解并且相当有效)如下:

  1. 找到一个可行流,即满足流规则和流下限但不一定是最小流的流。这可以通过对图进行深度优先遍历来实现,在我们遍历时跟踪当前路径,并在访问先前发现的节点或目标节点 t 时,将当前路径上的流量增加为最大下限- 将当前路径上不满足的边的边界一直到 t。

  2. 通过解决最大流问题将可行流变成最小流。您需要在图上找到容量等于 flow(e) - lower-bound(e) 的最大流量,其中 flow(e) 表示来自可行流量的流量。从可行流量中减去的最大流量将是最小流量。

在图也有流量上限的情况下,也可以执行上述的一个版本。在这种情况下,步骤 1. 会更复杂,但可以通过在特殊构造的图上执行初始最大流量计算来解决。

【讨论】:

  • 这种方法似乎有效。有人可以解释为什么它认为 minimum_flow =可行_flow - max_flow,如上述答案中所述?我不知道为什么这是真的
  • 如果您从可行的流程中尽可能多地减少流量,那么根据最小流量的定义,您剩下的必须是最小流量。如果你能带走更多的流量,它不会是最小的,但你不能,因为你带走了尽可能多的流量。
【解决方案2】:

编写求解器并非易事。

查看 LEMON 库(COIN-OR 的一部分)。它有许多针对最小成本流问题的高度优化算法。您可以选择最适合您的数据的算法。

有关 LEMON 的信息,请参阅 http://lemon.cs.elte.hu/trac/lemon

有关最低成本网络流量的详细信息,请参阅http://lemon.cs.elte.hu/pub/doc/1.3/a00607.html

【讨论】:

    【解决方案3】:

    在每条边上添加流的所有“下限”:无论如何,任何可行的解决方案都需要它。

    对于每个节点n 从接收器t 的拓扑顺序(即沿着边缘),如果边缘的总和S- 大于输出的总和S+ ,然后在st 之间的最短路径的所有边上添加流S+ - S-(在这样做的同时构建最短路径列表以提高效率)。

    然后,您有一个“最小”分配(在每个可行解决方案中都需要它的意义上),例如 S+ - S- 在每个节点上都是非负的,并且在每个边上都满足最小容量。

    然后问题归结为同一图结构上的多流问题:

    • 来源相同;
    • 没有容量限制;
    • S+ - S- 严格为正的每个节点都将成为具有所需流量 S+ - S- 的接收器。
    • 如果F-S- 为非负值,则初始接收器(具有所需的流F)将变为具有流F - S- 的接收器(否则任何解决方案都将满足初始约束)。

    编辑:对于您的问题,图表如下所示

         x1 -- x2
       /   \     \
     s      \     t
       \     \   /
         x3 -- x4
    

    每个边的最小容量为 1,我想接收器 t 不需要最小流量。

    先给每条边赋值1。

    每个节点S+ - S- 的区别(当然,st 除外)是:

    x1: 1
    x2: 0
    x3: 0
    x4: -1
    

    唯一的负面影响是x4;我们将1 添加到从x4t 的最短路径上的每条边,在这种情况下添加到边(x4, t)

    现在S+ - S- 对每个节点都是非负数,而仅对x1 是正数;问题归结为多流问题(在这种情况下,它是一个简单的流问题),其中请求的流是x1 处的1,而源仍然是s

    【讨论】:

    • 所以 f 是流过每条边的流量刚好等于下限的流量分配?
    • f 将不是合法流,这意味着对于给定节点,传入流将不等于传出流。因此,仅仅沿着从 s 到 t 的最短路径增加 f 并不一定会导致合法流动。例如,不满足流守恒且不在最短路径上的 f 的节点呢?
    • 是的,你是对的。我现在尝试调整解决方案,如果可行,我将编辑答案。
    • 我没有关注,抱歉......对于我发布的示例问题,最小分配是什么样的以及它会产生什么样的多流问题?您能否发布您提出的算法步骤的图表 - 我可以从中弄清楚。
    • 我添加了您的问题示例(我假设在最初的问题中水槽处没有所需的流量)。
    猜你喜欢
    • 2015-05-29
    • 2011-05-27
    • 1970-01-01
    • 2014-05-27
    • 2021-08-30
    • 2010-11-03
    • 2021-11-16
    • 1970-01-01
    • 2012-08-31
    相关资源
    最近更新 更多