Python的快速最大流最小割库

Python的快速最大流最小割库,python,graph,graph-theory,mathematical-optimization,max-flow,Python,Graph,Graph Theory,Mathematical Optimization,Max Flow,是否有一个可靠且有良好文档记录的Python库,其中包含一个快速实现的算法,该算法可以在有向图中找到最大流和最小割 from解决了这个问题,但速度非常慢:在一个有向图中找到最大流和最小割,大约有4000个节点和11000条边,需要>1分钟。我在寻找至少快一个数量级的东西 赏金:我就这个问题提供赏金,看看自提出这个问题以来,情况是否发生了变化。如果您有您推荐的图书馆的个人经验,则可获得额外积分 我不知道是否更快,您需要检查一下,但您试过了吗? 似乎它提供了您正在寻找的功能,根据我的经验,它是一个非

是否有一个可靠且有良好文档记录的Python库,其中包含一个快速实现的算法,该算法可以在有向图中找到最大流和最小割

from解决了这个问题,但速度非常慢:在一个有向图中找到最大流和最小割,大约有4000个节点和11000条边,需要>1分钟。我在寻找至少快一个数量级的东西


赏金:我就这个问题提供赏金,看看自提出这个问题以来,情况是否发生了变化。如果您有您推荐的图书馆的个人经验,则可获得额外积分

我不知道是否更快,您需要检查一下,但您试过了吗? 似乎它提供了您正在寻找的功能,根据我的经验,它是一个非常易于使用的图形处理库。

我曾用于类似的任务

Graph tool是一个高效的python模块,用于图形(也称为网络)的操作和统计分析。他们甚至有极好的文档

当前图形工具支持给定的算法:

  • Edmonds Karp-使用Edmonds Karp算法计算图形上的最大流量
  • Push-relabel-使用Push-relabel算法计算图形上的最大流量
  • Boykov-Kolmogorov-使用Boykov-Kolmogorov算法计算图上的最大流量
来自文档的示例::

我使用随机有向图(节点=4000,顶点=23964)执行了这个示例,所有过程只需11秒

备选图书馆:

  • -主要用C实现,但有Python和R接口
  • 链接主题
  • 或中的其他选定图形工具

要获得真正好的性能,您可以尝试将问题重新格式化为整数线性规划,任何标准ILP工具都应该提供足够的性能

Wikipedia包含了一个很好的商业和开放源码列表,其中许多似乎都有python绑定。其中最著名的是和

在过去几年中,我个人大量使用了lp_solve,并且发现只需将输入写入lp_solve as并使用shell调用lp_solve就足够了。回想起来,我可能应该投入更多的精力来让lp_solve的官方python绑定正常工作

从1.4.0开始,在
scipy.sparse.csgraph.maximum_flow
中也有一个实现,该实现可能更易于作为构建链的一部分使用(因为该包可通过pip/conda获得)

它通过操作稀疏矩阵(因此<代码> SCIPY,稀疏< /代码>)来表示图的邻接矩阵,因此,底层数据结构接近于金属,并且算法本身在Cython中实现,性能应该与例如图形工具一致。 不同的实现在性能方面的比较将始终取决于您感兴趣的最大流的图的结构,但是作为一个简单的基准,我尝试通过NetworkX、graph tool和SciPy运行具有不同稀疏度的随机图。所有这些方法都适用于NumPy数组,因此为了确保公平竞争,让我们创建一些方法,以便每个方法都将形状(密度*1000*1000,3)的NumPy数组作为输入,其行为边,列为与给定边关联的两个顶点,以及边的容量

将numpy导入为np
从scipy.sparse导入rand
def make_数据(密度):
m=(rand(10001000,density=density,format='coo',random_state=42)*100)
返回np.vstack([m.row,m.col,m.data]).T
data01=制造数据(0.1)
数据03=制造数据(0.3)
数据05=制造数据(0.5)
通过这种方式,各种框架可以计算最大流量的值,如下所示:

import graph\u tool.all as gt
从scipy.sparse导入coo_矩阵,csr_矩阵
从scipy.sparse.csgraph导入最大流量
将networkx导入为nx
def网络X_最大流量(数据,原语):
m=coo_矩阵((数据[:,2],(数据[:,0],数据[:,1]))
G=nx.from_numpy_数组(m.toarray(),使用=nx.DiGraph()创建_)
返回nx.最大流量值(G,0,999,capacity='weight',flow\u func=primitive)
def图形工具最大流量(数据、原语):
g=gt.Graph()
cap=g.新的边属性('int')
eprops=[上限]
g、 添加边缘列表(数据,eprops=eprops)
src,tgt=g.vertex(0),g.vertex(999)
res=原语(g、src、tgt、cap)
res.a=第a章-res.a
返回和(在tgt.in_edges()中e的res[e]
def scipy_最大流量(数据):
m=csr_矩阵((数据[:,2],(数据[:,0],数据[:,1]))
返回最大流量(m,0,999)。流量值
有了这一点,IPython基准测试的例子就变得越来越多

%timeit networkx\u max\u流(data01,nx.algorithms.flow.shortest\u augmenting\u路径)
%timeit图形工具最大流量(数据03,gt.推送重新标记最大流量)
%timeit scipy_最大流量(数据05)
然后我看到以下结果:

+----------------------------------------------+----------------+----------------+---------------+
|                  Algorithm                   |  Density: 0.1  |  Density: 0.3  |  Density: 0.5 |
+----------------------------------------------+----------------+----------------+---------------+
| nx.algorithms.flow.edmonds_karp              |  1.07s         |  3.2s          |  6.39s        |
| nx.algorithms.flow.preflow_push              |  1.07s         |  3.27s         |  6.18s        |
| nx.algorithms.flow.shortest_augmenting_path  |  1.08s         |  3.25s         |  6.23s        |
| gt.edmonds_karp_max_flow                     |  274ms         |  2.84s         |  10s          |
| gt.push_relabel_max_flow                     |  71ms          |  466ms         |  1.42s        |
| gt.boykov_kolmogorov_max_flow                |  79ms          |  463ms         |  895ms        |
| scipy.sparse.csgraph.maximum_flow            |  64ms          |  234ms         |  580ms        |
+----------------------------------------------+----------------+----------------+---------------+

再次,结果将取决于图形结构,但这至少表明SciPy应该为您提供与图形工具相媲美的性能。

您尝试使用PyCo()吗?这里的maximum_flow代码都是用纯Python编写的,因此Psyco可以大大提高速度。链接断开如果networkx太慢,您可以尝试获得它,因为它看起来几乎是这样。不需要整数线性程序(ILP),maximum flow可以表示为一个简单的线性程序()。最大流量可以在多项式时间内求解,同样也可以用线性规划公式求解。然而,ILP是一个NP难问题,Python包链接被破坏了。
+----------------------------------------------+----------------+----------------+---------------+
|                  Algorithm                   |  Density: 0.1  |  Density: 0.3  |  Density: 0.5 |
+----------------------------------------------+----------------+----------------+---------------+
| nx.algorithms.flow.edmonds_karp              |  1.07s         |  3.2s          |  6.39s        |
| nx.algorithms.flow.preflow_push              |  1.07s         |  3.27s         |  6.18s        |
| nx.algorithms.flow.shortest_augmenting_path  |  1.08s         |  3.25s         |  6.23s        |
| gt.edmonds_karp_max_flow                     |  274ms         |  2.84s         |  10s          |
| gt.push_relabel_max_flow                     |  71ms          |  466ms         |  1.42s        |
| gt.boykov_kolmogorov_max_flow                |  79ms          |  463ms         |  895ms        |
| scipy.sparse.csgraph.maximum_flow            |  64ms          |  234ms         |  580ms        |
+----------------------------------------------+----------------+----------------+---------------+