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


Python NetworkX capacity_scaling用法及代碼示例


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

用法:

capacity_scaling(G, demand='demand', capacity='capacity', weight='weight', heap=<class 'networkx.utils.heaps.BinaryHeap'>)

在有向圖 G 中找到滿足所有需求的最小成本流。

這是一種容量擴展的連續最短增廣路徑算法。

G 是一個有邊成本和容量的有向圖,其中節點有需求,即它們想要發送或接收一定量的流量。負需求意味著節點想要發送流量,正需求意味著節點想要接收流量。如果流入每個節點的淨流量等於該節點的需求,則有向圖 G 上的流量滿足所有需求。

參數

GNetworkX 圖

DiGraph 或 MultiDiGraph 可以找到滿足所有需求的最小成本流。

demandstring

圖 G 的節點預計具有一個屬性需求,該屬性指示節點想要發送(負需求)或接收(正需求)多少流量。請注意,需求之和應為 0,否則問題不可行。如果此屬性不存在,則認為節點的需求為 0。默認值:‘demand’。

capacitystring

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

weightstring

圖 G 的邊應該有一個屬性權重,該屬性權重指示在該邊上發送一個單位的流量所產生的成本。如果不存在,則認為權重為 0。默認值:‘weight’。

heap

算法中使用的堆類型。它應該是MinHeap 的子類或實現兼容的接口。

如果要使用庫存堆實現,盡管漸近運行時間較慢,但對於沒有優化屬性訪問的 Python 實現(例如 CPython),建議使用 BinaryHeap 而不是 PairingHeap。對於具有優化屬性訪問的 Python 實現(例如 PyPy),PairingHeap 提供更好的性能。默認值:BinaryHeap

返回

flowCost整數

滿足所有需求的最小成本流的成本。

flowDict字典

如果 G 是有向圖,則由節點鍵入的 dict-of-dicts 使得 flowDict[u][v] 是邊 (u, v) 上的流。如果 G 是 MultiDiGraph,則 dict-of-dicts-of-dicts 由節點鍵控,因此 flowDict[u][v][key] 是邊上的流 (u, v, key)。

拋出

NetworkXError

如果輸入圖不是定向的,未連接的,則會引發此異常。

NetworkXUnfeasible

在以下情況下會引發此異常:

  • 需求之和不為零。那麽,就沒有滿足所有需求的流程。

  • 沒有滿足所有需求的流量。

NetworkXUnbounded

如果有向圖 G 具有負成本和無限容量的循環,則會引發此異常。那麽,滿足所有需求的流程的成本在下麵是無界的。

注意

如果邊權重是浮點數,則此算法不起作用。

例子

最小成本流問題的一個簡單示例。

>>> 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': {}}

相關用法


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