C++ 我应该使用什么算法来寻找有向图上的最小流,其中有下界但没有上界?

C++ 我应该使用什么算法来寻找有向图上的最小流,其中有下界但没有上界?,c++,graph-algorithm,linear-programming,network-flow,C++,Graph Algorithm,Linear Programming,Network Flow,我应该使用什么算法来寻找有向图上的最小流,其中有下界,但没有上界?比如这个简单的例子: “> 在文献中,这是一个最小成本流问题。然而,在我的例子中,成本与每条边上所需的流的非零下界相同,因此我将问题的措辞如上所述。在文献中,问题是:寻找单源/单汇有向无环图I的最小成本流的最佳算法是什么n,其中每条边具有无限容量,流的非零下界,且成本等于流的下界 从我的研究看来,人们处理任何类型网络的任何类型的最小成本的主要方式是将问题设置为一个函数并以这种方式解决。然而,我的直觉是,没有流量的上界,即具有无限容

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

“>

在文献中,这是一个最小成本流问题。然而,在我的例子中,成本与每条边上所需的流的非零下界相同,因此我将问题的措辞如上所述。在文献中,问题是:寻找单源/单汇有向无环图I的最小成本流的最佳算法是什么n,其中每条边具有无限容量,流的非零下界,且成本等于流的下界

从我的研究看来,人们处理任何类型网络的任何类型的最小成本的主要方式是将问题设置为一个函数并以这种方式解决。然而,我的直觉是,没有流量的上界,即具有无限容量的边,使问题变得更容易,因此我想知道是否有一种特定的算法与单纯形法等相比,lly采用了更多的“图形”技术来针对这种情况

我的意思是,如果所有的成本和下限都是1,就像上面所说的那样……那么我们正在寻找一个覆盖所有边缘的流,遵守流规则,并且不会在从s到t的任何路径上推动太多的流。这让我觉得它不应该需要LP解算器,事实上维基百科关于最小成本流的文章指出”如果取消容量限制,问题将简化为最短路径问题”,但我认为他们讨论的是下限均为零的情况

此外,是否有适用于最小成本流的开源C/C++代码?通过谷歌搜索,我发现我可以自己将问题设置为LP问题并使用开源LP解算器解决,或者我可以使用LEMON,它提供了用于最小成本流的多个算法。boost graph库不包括实现据我所知

还有别的吗?

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

对于汇
t
中拓扑顺序(即沿边)的每个节点
n
,如果在边中的内容的总和
S-
大于流出内容的总和
S+
,则在
S
t
之间最短路径的所有边上添加流
S+-S-
(为提高效率,创建最短路径列表)

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

然后,该问题在同一图形结构上简化为多流问题:

  • 来源相同
  • 没有容量限制
  • S+-S-
    严格为正的每个节点都将成为具有所需流的接收器
    S+-S-
  • 如果
    F-S-
    为非负,则初始接收器(具有所需的流
    F
    )将成为具有流
    F-S-
    的接收器(否则任何解决方案都将满足初始约束)
编辑:对于您的问题,图表如下所示

     x1 -- x2
   /   \     \
 s      \     t
   \     \   /
     x3 -- x4
每个边缘的最小容量为1,并且我假设水槽
t
不需要最小流量

首先为每条边指定1

每个节点的差异
S+-S-
(当然,
S
t
除外)是:

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


现在,
S+-S-
对于每个节点都是非负的,并且只有
x1
是正的;这个问题简化为一个多流问题(在这种情况下,它是一个简单的流问题),其中请求的流在
x1
处是
1
,而源仍然是
S
编写一个解算器是非常重要的

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

有关LEMON的信息,请参阅


有关最小成本网络流的详细信息,请参阅。

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

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

  • 通过解决最大流问题,将可行流转化为最小流。您需要在图上找到容量等于流(e)-下限(e)的最大流,其中流(e)表示可行流中的流。从可行流中减去的最大流将是最小流


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

    因此f是流量分配,其中每个边上的流量恰好等于下界?f这不是一个合法的流,这意味着对于给定的节点,传入流将不等于传出流。因此,仅仅沿着从s到t的最短路径增加f是不必要的
    x1: 1
    x2: 0
    x3: 0
    x4: -1