![](/img/trans.png)
[英]networkx MultiDiGraph access keys of edges making the shortest path
[英]Networkx shortest path with condition on edges - python
让我们考虑以下Graph
:
G = nx.Graph()
G.add_nodes_from(['A', 'B', 'C', 'D', 'E', 'F'])
G.add_edges_from([('A', 'B', {'walk': 3, 'time': 3}), ('A', 'C', {'metro': 4, 'time': 4}), ('A', 'D', {'walk': 3, 'time': 3}),
('C', 'E', {'walk': 3, 'time': 3}), ('D', 'E', {'walk': 3, 'time': 3}), ('B', 'F', {'walk': 3, 'time': 3}),
('D', 'F', {'metro': 4, 'time': 4}), ('E', 'F', {'walk': 3, 'time': 3})])
nx.draw(G, with_labels=True, font_color='white')
可以看到边的三个属性:
walk
是从一站走到另一站所花费的时间(如果可能)。metro
是乘坐地铁从一个站点到另一个站点所需的时间。time
等于walk
或metro
并且是我用于nx.shortest_path
的权重(这使我不必在地铁或步行之间进行选择,从而获得花费更少时间的路径)。 我现在想获得nx.shortest_path(G, 'A', 'F', weight='time')
节点之间A
和F
与道路上的一个条件:我希望有shortest_path
与少walk
边缘尽可能。
在这种情况下,唯一shortest_path
视为好是A -> D -> F
由于只有1 walk
边缘,而其他至少有两个(即使总time
对于一些边缘更短)。
有没有办法做到这一点?
编辑:我尝试使用nx.all_shortest_paths()
来获得几个shortest_paths
,然后选择一个适合我的要求,但它不工作。 nx.all_shortest_paths()
确实为我提供了更多可能在source
和target
之间的短路径,但是所有这些路径中都已经有太多的walk edges
。 一种解决方案是获得被认为是shortest of shortest paths
以及shortest of shortest paths
,以便可能有更多选择。 但是,我不知道我应该如何处理这个问题。
使用您的示例:
原网少“走罚”:
G = nx.Graph()
G.add_nodes_from(['A', 'B', 'C', 'D', 'E', 'F'])
G.add_edges_from([('A', 'B', {'walk': 3, 'time': 3}), ('A', 'C', {'metro': 4, 'time': 4}), ('A', 'D', {'walk': 3, 'time': 3}),
('C', 'E', {'walk': 3, 'time': 3}), ('D', 'E', {'walk': 3, 'time': 3}), ('B', 'F', {'walk': 3, 'time': 3}),
('D', 'F', {'metro': 4, 'time': 4}), ('E', 'F', {'walk': 3, 'time': 3})])
#nx.draw(G, with_labels=True, font_color='white')
nx.shortest_path(G, 'A', 'F', weight='time')
输出:
['A', 'B', 'F']
现在,让我们通过乘以 10 倍来惩罚步行边缘时间:
G = nx.Graph()
G.add_nodes_from(['A', 'B', 'C', 'D', 'E', 'F'])
G.add_edges_from([('A', 'B', {'walk': 3, 'time': 30}), ('A', 'C', {'metro': 4, 'time': 4}), ('A', 'D', {'walk': 3, 'time': 30}),
('C', 'E', {'walk': 3, 'time': 30}), ('D', 'E', {'walk': 3, 'time': 30}), ('B', 'F', {'walk': 3, 'time': 30}),
('D', 'F', {'metro': 4, 'time': 4}), ('E', 'F', {'walk': 3, 'time': 30})])
#nx.draw(G, with_labels=True, font_color='white')
nx.shortest_path(G, 'A', 'F', weight='time')
输出:
['A', 'D', 'F']
如果你足够惩罚你的“行走”边缘,你能提供一个不起作用的例子吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.