繁体   English   中英

永远运行的Python NetworkX max_flow_min_cost函数

[英]Python NetworkX max_flow_min_cost function running forever

我正在尝试在某些图表上使用max_flow_min_cost,但似乎有时算法会永远运行(或至少需要很长时间),而且我不明白为什么会这样。 这是一张导致它运行那么长时间的图表。 它们都有相同的节点

nodes = [
    ('1in', {'y': -1, 'x': -1, 'type': 'passenger in', 'number': 1}), 
    ('2out', {'y': 1, 'x': -1, 'type': 'passenger out', 'number': 2}),
    ('destination', {'y': 0, 'x': 0, 'type': 'destination'}), 
    ('2in', {'y': 1, 'x': -1, 'type': 'passenger in', 'number': 2}),
    ('source', {'type': 'meta'}), 
    ('4in', {'y': -1, 'x': 1, 'type': 'passenger in', 'number': 4}),
    ('1out', {'y': -1, 'x': -1, 'type': 'passenger out', 'number': 1}),
    ('4out', {'y': -1, 'x': 1, 'type': 'passenger out', 'number': 4}),
    ('sink', {'type': 'meta'}), 
    ('3in', {'y': 1, 'x': 1, 'type': 'passenger in', 'number': 3}),
    ('3out', {'y': 1, 'x': 1, 'type': 'passenger out', 'number': 3})
]

edges = [
    ('1in', '1out', {'cost': 0, 'capacity': 1}), 
    ('2out', '4in', {'cost': -9.48, 'capacity': 1}), 
    ('2out', 'destination', {'cost': -10.9, 'capacity': 1}), 
    ('2out', '3in', {'cost': -10.31, 'capacity': 1}), 
    ('destination', 'sink', {'cost': 0, 'capacity': 1}), 
    ('2in', '2out', {'cost': 0, 'capacity': 1}), 
    ('source', '2in', {'cost': 0, 'capacity': 1}), 
    ('source', '4in', {'cost': 0, 'capacity': 1}), 
    ('source', '1in', {'cost': 0, 'capacity': 1}), 
    ('source', '3in', {'cost': 0, 'capacity': 1}), 
    ('4in', '4out', {'cost': 0, 'capacity': 1}), 
    ('1out', '2in', {'cost': -10.31, 'capacity': 1}), 
    ('1out', '4in', {'cost': -10.31, 'capacity': 1}), 
    ('1out', 'destination', {'cost':-10.9, 'capacity': 1}), 
    ('1out', '3in', {'cost': -9.48, 'capacity': 1}), 
    ('4out', 'destination', {'cost': -10.9, 'capacity': 1}), 
    ('3in', '3out', {'cost': 0, 'capacity': 1}), 
    ('3out', '4in', {'cost': -10.31, 'capacity': 1}), 
    ('3out', 'destination', {'cost': -10.9, 'capacity': 1})
]

如果我修改了上面的图表,但使目标到接收器2或3的容量不变,它也将永远运行。 如果我使容量等于4,则算法运行良好。 这是确切的调用:

nx.max_flow_min_cost(G,'source','sink',weight='cost')

谢谢! 任何帮助将不胜感激。 值得一提的是G是有向图(DiGraph)

编辑:我在NetworkX项目上打开了一个问题 ,以防他们的代码有问题。

这对我来说可以:

>>> G = nx.Graph()
>>> G.add_edges_from([
    ('1in', '1out', {'cost': 0, 'capacity': 1}), 
    ('2out', '4in', {'cost': -9.48, 'capacity': 1}), 
    ('2out', 'destination', {'cost': -10.9, 'capacity': 1}), 
    ('2out', '3in', {'cost': -10.31, 'capacity': 1}), 
    ('destination', 'sink', {'cost': 0, 'capacity': 1}), 
    ('2in', '2out', {'cost': 0, 'capacity': 1}), 
    ('source', '2in', {'cost': 0, 'capacity': 1}), 
    ('source', '4in', {'cost': 0, 'capacity': 1}), 
    ('source', '1in', {'cost': 0, 'capacity': 1}), 
    ('source', '3in', {'cost': 0, 'capacity': 1}), 
    ('4in', '4out', {'cost': 0, 'capacity': 1}), 
    ('1out', '2in', {'cost': -10.31, 'capacity': 1}), 
    ('1out', '4in', {'cost': -10.31, 'capacity': 1}), 
    ('1out', 'destination', {'cost':-10.9, 'capacity': 1}), 
    ('1out', '3in', {'cost': -9.48, 'capacity': 1}), 
    ('4out', 'destination', {'cost': -10.9, 'capacity': 1}), 
    ('3in', '3out', {'cost': 0, 'capacity': 1}), 
    ('3out', '4in', {'cost': -10.31, 'capacity': 1}), 
    ('3out', 'destination', {'cost': -10.9, 'capacity': 1})
])

>>> nx.max_flow_min_cost(G, 'source', 'sink', weight='cost')
{'1in': {'1out': 0, 'source': 0},
 '1out': {'1in': 0, '2in': 1, '3in': 1, '4in': 1, 'destination': 1},
 '2in': {'1out': 1, '2out': 1, 'source': 0},
 '2out': {'2in': 0, '3in': 1, '4in': 1, 'destination': 1},
 '3in': {'1out': 1, '2out': 1, '3out': 0, 'source': 0},
 '3out': {'3in': 0, '4in': 1, 'destination': 1},
 '4in': {'1out': 1, '2out': 1, '3out': 1, '4out': 0, 'source': 0},
 '4out': {'4in': 0, 'destination': 1},
 'destination': {'1out': 1, '2out': 0, '3out': 1, '4out': 1, 'sink': 1},
 'sink': {'destination': 0},
 'source': {'1in': 0, '2in': 1, '3in': 0, '4in': 0}}

如果权重是浮点数,则不能保证networkx.max_flow_min_cost的算法networkx.max_flow_min_cost 在此处查看networkx网站上回答的原始作者问题

https://github.com/networkx/networkx/issues/2076#issuecomment-210200259

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM