capacity_scaling#
- capacity_scaling(G, demand='demand', capacity='capacity', weight='weight', heap=<class 'networkx.utils.heaps.BinaryHeap'>)[source]#
找到有向图 G 中满足所有需求的最低成本流。
这是一个容量缩放连续最短增广路径算法。
G 是一个带有边成本和容量以及节点需求的有向图,即节点希望发送或接收一定量的流。负需求表示节点希望发送流,正需求表示节点希望接收流。在有向图 G 上的流满足所有需求,如果每个节点的净流入等于该节点的需求。
- Parameters:
- GNetworkX 图
要在其上找到满足所有需求的最低成本流的有向图或多重有向图。
- demand字符串
图 G 的节点应具有一个表示节点希望发送(负需求)或接收(正需求)多少流的属性。注意,需求的总和应为 0,否则问题不可行。如果此属性不存在,则认为节点有 0 需求。默认值:’demand’。
- capacity字符串
图 G 的边应具有一个表示边可以支持多少流的属性。如果此属性不存在,则认为边具有无限容量。默认值:’capacity’。
- weight字符串
图 G 的边应具有一个表示在该边上发送一个单位流所产生的成本的属性。如果不存在,则认为权重为 0。默认值:’weight’。
- heap类
算法中要使用的堆类型。它应该是
MinHeap
的子类或实现兼容接口。如果要使用标准的堆实现,建议使用
BinaryHeap
而不是PairingHeap
,因为 Python 实现没有优化的属性访问(例如,CPython),尽管运行时间较慢。对于具有优化属性访问的 Python 实现(例如,PyPy),PairingHeap
提供更好的性能。默认值:BinaryHeap
。
- Returns:
- flowCost整数
满足所有需求的最低成本流的成本。
- flowDict字典
如果 G 是有向图,一个以节点为键的字典,使得 flowDict[u][v] 是边 (u, v) 上的流量。 如果 G 是多重有向图,一个以节点为键的字典的字典,使得 flowDict[u][v][key] 是边 (u, v, key) 上的流量。
- Raises:
- NetworkXError
如果输入图不是有向的或不连通,则引发此异常。
- NetworkXUnfeasible
在以下情况下引发此异常:
需求的总和不为零。那么,没有满足所有需求的流。
没有满足所有需求的流。
- NetworkXUnbounded
如果有向图 G 具有负成本和无限容量的循环,则引发此异常。那么,满足所有需求的流的成本是无界的。
See also
Notes
如果边权重是浮点数,此算法不适用。
Examples
一个简单的最低成本流问题示例。
>>> G = nx.DiGraph() >>> G.add_node("a", demand=-5) >>> G.add_node("d", demand=5) >>> G.add_edge("a", "b", weight=3, capacity=4) >>> G.add_edge("a", "c", weight=6, capacity=10) >>> G.add_edge("b", "d", weight=1, capacity=9) >>> G.add_edge("c", "d", weight=2, capacity=5) >>> flowCost, flowDict = nx.capacity_scaling(G) >>> flowCost 24 >>> flowDict {'a': {'b': 4, 'c': 1}, 'd': {}, 'b': {'d': 4}, 'c': {'d': 1}}
可以更改算法使用的属性名称。
>>> G = nx.DiGraph() >>> G.add_node("p", spam=-4) >>> G.add_node("q", spam=2) >>> G.add_node("a", spam=-2) >>> G.add_node("d", spam=-1) >>> G.add_node("t", spam=2) >>> G.add_node("w", spam=3) >>> G.add_edge("p", "q", cost=7, vacancies=5) >>> G.add_edge("p", "a", cost=1, vacancies=4) >>> G.add_edge("q", "d", cost=2, vacancies=3) >>> G.add_edge("t", "q", cost=1, vacancies=2) >>> G.add_edge("a", "t", cost=2, vacancies=4) >>> G.add_edge("d", "w", cost=3, vacancies=4) >>> G.add_edge("t", "w", cost=4, vacancies=1) >>> flowCost, flowDict = nx.capacity_scaling( ... G, demand="spam", capacity="vacancies", weight="cost" ... ) >>> flowCost 37 >>> flowDict {'p': {'q': 2, 'a': 2}, 'q': {'d': 1}, 'a': {'t': 4}, 'd': {'w': 2}, 't': {'q': 1, 'w': 1}, 'w': {}}