当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python NetworkX boykov_kolmogorov用法及代码示例


本文简要介绍 networkx.algorithms.flow.boykov_kolmogorov 的用法。

用法:

boykov_kolmogorov(G, s, t, capacity='capacity', residual=None, value_only=False, cutoff=None)

使用Boykov-Kolmogorov 算法找到最大single-commodity 流。

该函数返回计算最大流量后产生的残差网络。有关 NetworkX 用于定义残差网络的约定的详细信息,请参见下文。

对于 节点、 边和 最小切割成本 [1],该算法的情况复杂度更差 。该实现使用[2]中定义的标记启发式,这提高了许多实际问题的运行时间。

参数

GNetworkX 图

图表的边应该有一个名为‘capacity’ 的属性。如果此属性不存在,则认为边具有无限容量。

s节点

流的源节点。

t节点

流的汇节点。

capacitystring

图 G 的边应该有一个属性容量,表示边可以支持多少流量。如果此属性不存在,则认为边具有无限容量。默认值:‘capacity’。

residualNetworkX 图

执行算法的残差网络。如果没有,则创建一个新的残差网络。默认值:无。

value_onlybool

如果 True 仅计算最大流量的值。此参数将被此算法忽略,因为它不适用。

cutoff整数,浮点数

如果指定,算法将在流量值达到或超过截止值时终止。在这种情况下,它可能无法立即确定最小切割。默认值:无。

返回

RNetworkX 有向图

计算最大流量后的残差网络。

抛出

NetworkXError

该算法不支持MultiGraph和MultiDiGraph。如果输入图是这两个类之一的实例,则会引发NetworkXError。

NetworkXUnbounded

如果图具有无限容量的路径,则图上可行流的值在上面是无界的,并且该函数会引发 NetworkXUnbounded。

注意

来自输入图 G 的残差网络 RG 具有相同的节点。 R 是包含一对边的 DiGraph (u, v)(v, u) iff (u, v) 不是自环,并且在 G 中至少存在 (u, v)(v, u) 之一。

对于 R 中的每条边 (u, v) ,如果 G 中存在 R[u][v]['capacity'] ,则 R[u][v]['capacity'] 等于 G 中的 (u, v) 的容量,否则为零。如果容量是无限的,R[u][v]['capacity'] 将有一个不影响问题求解的高任意有限值。该值存储在 R.graph['inf'] 中。对于R中的每条边(u, v)R[u][v]['flow']代表(u, v)的流函数,满足R[u][v]['flow'] == -R[v][u]['flow']

流量值定义为流入 t 的总流量,即接收器,存储在 R.graph['flow_value'] 中。如果未指定 cutoff,则仅使用边 (u, v)t 的可达性使得 R[u][v]['flow'] < R[u][v]['capacity'] 导致最小的 s - t 切割。

参考

1

Boykov, Y., & Kolmogorov, V. (2004). An experimental comparison of min-cut/max-flow algorithms for energy minimization in vision. Pattern Analysis and Machine Intelligence, IEEE Transactions on, 26(9), 1124-1137. https://doi.org/10.1109/TPAMI.2004.60

2

Vladimir Kolmogorov. Graph-based Algorithms for Multi-camera Reconstruction Problem. PhD thesis, Cornell University, CS Department, 2003. pp. 109-114. https://web.archive.org/web/20170809091249/https://pub.ist.ac.at/~vnk/papers/thesis.pdf

例子

>>> from networkx.algorithms.flow import boykov_kolmogorov

实现流算法并输出残差网络的函数,例如这个,不会导入到基础NetworkX 命名空间中,因此您必须从流包中显式导入它们。

>>> G = nx.DiGraph()
>>> G.add_edge("x", "a", capacity=3.0)
>>> G.add_edge("x", "b", capacity=1.0)
>>> G.add_edge("a", "c", capacity=3.0)
>>> G.add_edge("b", "c", capacity=5.0)
>>> G.add_edge("b", "d", capacity=4.0)
>>> G.add_edge("d", "e", capacity=2.0)
>>> G.add_edge("c", "y", capacity=2.0)
>>> G.add_edge("e", "y", capacity=3.0)
>>> R = boykov_kolmogorov(G, "x", "y")
>>> flow_value = nx.maximum_flow_value(G, "x", "y")
>>> flow_value
3.0
>>> flow_value == R.graph["flow_value"]
True

Boykov-Kolmogorov 算法的一个很好的特性是,可以根据算法期间使用的搜索树轻松计算定义最小割的节点分区。这些树存储在残差网络的图属性trees中。

>>> source_tree, target_tree = R.graph["trees"]
>>> partition = (set(source_tree), set(G) - set(source_tree))

或等效地:

>>> partition = (set(G) - set(target_tree), set(target_tree))

相关用法


注:本文由纯净天空筛选整理自networkx.org大神的英文原创作品 networkx.algorithms.flow.boykov_kolmogorov。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。