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


Python NetworkX minimum_cut用法及代码示例


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

用法:

minimum_cut(flowG, _s, _t, capacity='capacity', flow_func=None, **kwargs)

计算最小值 (s, t)-cut 的值和节点划分。

使用max-flowmin-cut定理,即最小容量切割的容量等于最大流量的流量值。

参数

flowGNetworkX 图

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

_s节点

流的源节点。

_t节点

流的汇节点。

capacitystring

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

flow_func函数

用于计算容量图中一对节点之间的最大流量的函数。该函数必须接受至少三个参数:Graph 或 Digraph、源节点和目标节点。并返回一个遵循 NetworkX 约定的残差网络(参见注释)。如果 flow_func 为 None,则使用默认的最大流量函数 ( preflow_push() )。有关替代算法,请参见下文。默认函数的选择可能会因版本而异,不应依赖。默认值:无。

kwargs任何其他关键字参数都被传递给函数

计算最大流量。

返回

cut_value整数,浮点数

最小切割值。

partition节点集对

定义最小割的节点分区。

抛出

NetworkXUnbounded

如果图具有无限容量的路径,则所有切割都具有无限容量,并且该函数会引发 NetworkXError。

注意

flow_func 参数中使用的函数必须返回遵循 NetworkX 约定的残差网络:

来自输入图 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'] 中。仅使用边 (u, v)t 的可达性使得 R[u][v]['flow'] < R[u][v]['capacity'] 导致最小的 s - t 切割。

特定算法可能会在 R 中存储额外数据。

该函数应支持可选的布尔参数value_only。当为 True 时,一旦可以确定最大流量值和最小切割,它就可以选择终止算法。

例子

>>> 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)

minimum_cut 计算最小割的值和节点分区:

>>> cut_value, partition = nx.minimum_cut(G, "x", "y")
>>> reachable, non_reachable = partition

‘partition’ 这里是一个元组,其中包含定义最小割的两组节点。您可以计算导致最小切割的边切割集,如下所示:

>>> cutset = set()
>>> for u, nbrs in ((n, G[n]) for n in reachable):
...     cutset.update((u, v) for v in nbrs if v in non_reachable)
>>> print(sorted(cutset))
[('c', 'y'), ('x', 'b')]
>>> cut_value == sum(G.edges[u, v]["capacity"] for (u, v) in cutset)
True

您还可以通过使用flow_func 参数来使用替代算法来计算最小切割。

>>> from networkx.algorithms.flow import shortest_augmenting_path
>>> cut_value == nx.minimum_cut(G, "x", "y", flow_func=shortest_augmenting_path)[0]
True

相关用法


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