當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python NetworkX preflow_push用法及代碼示例


本文簡要介紹 networkx.algorithms.flow.preflow_push 的用法。

用法:

preflow_push(G, s, t, capacity='capacity', residual=None, global_relabel_freq=1, value_only=False)

使用 highest-label preflow-push 算法找到最大 single-commodity 流。

該函數返回計算最大流量後產生的殘差網絡。有關 NetworkX 用於定義殘差網絡的約定的詳細信息,請參見下文。

該算法對於 節點和 邊的運行時間為

參數

GNetworkX 圖

圖表的邊應該有一個名為‘capacity’ 的屬性。如果此屬性不存在,則認為邊具有無限容量。

s節點

流的源節點。

t節點

流的匯節點。

capacitystring

圖 G 的邊應該有一個屬性容量,表示邊可以支持多少流量。如果此屬性不存在,則認為邊具有無限容量。默認值:‘capacity’。

residualNetworkX 圖

執行算法的殘差網絡。如果沒有,則創建一個新的殘差網絡。默認值:無。

global_relabel_freq整數,浮點數

應用全局重新標記啟發式加速算法的相對頻率。如果為 None,則禁用啟發式。默認值:1。

value_onlybool

如果為 False,則計算最大流量;否則,計算足以計算最大流量值的最大預流量。默認值:假。

返回

RNetworkX 有向圖

計算最大流量後的殘差網絡。

拋出

NetworkXError

該算法不支持MultiGraph和MultiDiGraph。如果輸入圖是這兩個類之一的實例,則會引發NetworkXError。

NetworkXUnbounded

如果圖具有無限容量的路徑,則圖上可行流的值在上麵是無界的,並且該函數會引發 NetworkXUnbounded。

注意

來自輸入圖 G 的殘差網絡 RG 具有相同的節點。 R 是包含一對邊的 DiGraph (u, v)(v, u) iff (u, v) 不是自環,並且在 G 中至少存在 (u, v)(v, u) 之一。對於 R 中的每個節點 uR.nodes[u]['excess'] 表示流入 u 和流出 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 切割。

例子

>>> from networkx.algorithms.flow import preflow_push

實現流算法並輸出殘差網絡的函數,例如這個,不會導入到基礎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 = preflow_push(G, "x", "y")
>>> flow_value = nx.maximum_flow_value(G, "x", "y")
>>> flow_value == R.graph["flow_value"]
True
>>> # preflow_push also stores the maximum flow value
>>> # in the excess attribute of the sink node t
>>> flow_value == R.nodes["y"]["excess"]
True
>>> # For some problems, you might only want to compute a
>>> # maximum preflow.
>>> R = preflow_push(G, "x", "y", value_only=True)
>>> flow_value == R.graph["flow_value"]
True
>>> flow_value == R.nodes["y"]["excess"]
True

相關用法


注:本文由純淨天空篩選整理自networkx.org大神的英文原創作品 networkx.algorithms.flow.preflow_push。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。