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


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。