首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在有向图上有下界但没有上界的情况下,我应该使用什么算法来求最小流?

在有向图上有下界但没有上界的情况下,我应该使用什么算法来求最小流?
EN

Stack Overflow用户
提问于 2013-09-03 17:43:50
回答 3查看 8.5K关注 0票数 11

在有向图上有下界而没有上界的情况下,我应该使用什么算法来求最小流?例如这个简单的例子:

在文献中,这是一个最小成本流问题。然而,在我的情况下,成本与每个边上所需的流的非零下界相同,所以我用上面的方法来解释这个问题。在文献中,问题是:寻找单源/单汇有向无圈图的最小成本流的最佳算法是什么,其中每个边都有无限的容量,流上的非零下界,以及与流的下界相等的成本。

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

我的意思是,如果所有的成本和下限都是1,如上面所示.然后,我们正在寻找一种流,它覆盖所有边界,遵守流规则,并且不会在从s到t的任何路径中推动过多的流。这感觉就好像不需要对我使用LP求解器,而且维基百科关于最小成本流的文章确实指出,“如果能力约束被删除,问题就会减少到最短路径问题”,但我认为他们在谈论的是下界为零的情况。

还有任何地方都有开源C/C++代码来实现最小成本流吗?通过搜索可用的内容,我发现我可以自己将问题设置为LP问题并使用开源LP解决程序解决,也可以使用LEMON,它为最小成本流提供了几种算法。据我所知,boost图形库不包括实现。

还有别的事吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-13 20:16:10

在没有上界的情况下,最简单的方法--最简单的实现、理解和合理有效的方法--求图的最小流如下:

  1. 寻找一个可行的流,即满足流规则和流的下界但不一定是最小流的流。这可以通过对图进行深度第一次遍历,在我们遍历时跟踪当前路径,并在访问先前发现的节点(目标节点)时,通过当前路径上不满足的边的最大下限来增强当前路径上的流量,直到t。
  2. 通过求解最大流问题,将可行流转化为最小流。您需要在具有等于flow(e) -下限(E)的图形上找到最大流,其中flow(e)是指来自可行流的流。从可行流中减去的最大流量将是最小流。

在图也具有流上界的情况下,还可以执行上述版本的操作。在这种情况下,步骤1更复杂,但可以通过在特殊构造的图上执行初始最大流计算来求解。

票数 9
EN

Stack Overflow用户

发布于 2013-10-28 20:48:05

写一个解决者是不平凡的。

看柠檬库(硬币的一部分-或)。对于最小成本流问题,它有许多优化算法。您可以选择哪种算法对您的数据最有效。

有关柠檬的信息,请参见http://lemon.cs.elte.hu/trac/lemon

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

票数 3
EN

Stack Overflow用户

发布于 2013-09-06 09:07:13

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

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

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

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

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

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

代码语言:javascript
复制
     x1 -- x2
   /   \     \
 s      \     t
   \     \   /
     x3 -- x4

对于每个边都有最小的容量1,并且我认为在接收器t上不需要最小的流。

首先给每个边分配一个。

每个节点(当然,st除外)的差异是:

代码语言:javascript
复制
x1: 1
x2: 0
x3: 0
x4: -1

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18598399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档