【发布时间】:2020-01-24 10:44:21
【问题描述】:
让我们考虑以下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的权重(这使我无需在地铁或步行之间进行选择即可获得所需时间更少的路径)。李>
我现在想在节点A 和F 之间获取nx.shortest_path(G, 'A', 'F', weight='time'),路径上有一个条件:我希望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 的东西,以及更短的可能有更多选择的东西。
但是,我不知道该怎么做。
【问题讨论】:
-
你能通过将时间乘以 10 来惩罚你的步行边缘吗?计算最短路径?
-
我试过了,还是不行。我得到的路径仍然等同于我使用常规
walk边缘的路径,但是从source到target需要更长的时间,同时在其中保留大量walk边缘。
标签: python networkx shortest-path