【发布时间】:2017-08-19 06:58:55
【问题描述】:
我正在使用NetworkX 解决具有多个源和接收器的最大流量问题。我发现了一个在 NetworkX 中运行良好的函数,名为max_cost_flow,但是我遇到的问题是它要求净需求为零,换句话说,任何接收器都不应低于它的需要,否则会引发错误。
我可以使用什么(或如何修改此算法)来允许它计算出可能的最佳流量,但不一定满足所有条件?
根据 kraskevich 的建议:
import networkx as nx
def convert(graph):
allNodes = graph.nodes()
newSource = len(allNodes) + 1
newSink = len(allNodes) + 2
graph.add_node(newSource)
graph.add_node(newSink)
for currentNode in allNodes:
demand = graph.node[currentNode]['demand']
if demand < 0 :
graph.add_edge(newSource, currentNode, weight=0, capacity=demand)
if demand > 0:
graph.add_edge(newSink, currentNode, weight=0, capacity=demand)
return graph
g = nx.DiGraph()
g.add_node(1, demand = 1)
g.add_node(2, demand = -2)
g.add_node(3, demand = 2)
g.add_node(4, demand = -4)
g.add_edge(1, 2, weight=4, capacity=100)
g.add_edge(1, 4, weight=3, capacity=100)
g.add_edge(3, 2, weight=5, capacity=100)
g.add_edge(3, 4, weight=2, capacity=100)
g.add_edge(3, 1, weight=1)
newGraph = convert(g)
print(nx.max_flow_min_cost(g, newGraph.nodes()[-2],newGraph.nodes()[-1]))
【问题讨论】:
-
您的代码中有一些错误。我在答案中添加了一个工作示例。
标签: algorithm networkx directed-graph max-flow weighted-graph