繁体   English   中英

边缘条件下的 Networkx 最短路径 - python

[英]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等于walkmetro并且是我用于nx.shortest_path的权重(这使我不必在地铁或步行之间进行选择,从而获得花费更少时间的路径)。

我现在想获得nx.shortest_path(G, 'A', 'F', weight='time')节点之间AF与道路上的一个条件:我希望有shortest_path与少walk边缘尽可能。

在这种情况下,唯一shortest_path视为好是A -> D -> F由于只有1 walk边缘,而其他至少有两个(即使总time对于一些边缘更短)。

有没有办法做到这一点?


编辑:我尝试使用nx.all_shortest_paths()来获得几个shortest_paths ,然后选择一个适合我的要求,但它不工作。 nx.all_shortest_paths()确实为我提供了更多可能在sourcetarget之间的短路径,但是所有这些路径中都已经有太多的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.

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