【问题标题】:How to select shortest paths according to selected edges?如何根据选定的边选择最短路径?
【发布时间】:2020-03-10 06:26:18
【问题描述】:

我正在使用 NetowrkX 和 OsmnX Python 包来分析道路网络。 一旦我获得了简化图,我想通过最短路径计算来评估网络的性能。为了获得特定的索引,我需要最短路径的长度,其中包括选定的边缘,这些边缘是通过高速公路边缘的最短路径。

首先我列出了我感兴趣的高速公路边缘(G5 是我的网络的对应图):

MW_edges=[(u,v,k,d) for u,v,k,d in G5.edges(keys=True, data=True) if  d['highway']=='motorway']

我使用以下函数来评估网络中所有节点对的最短路径:

paths=dict(nx.all_pairs_dijkstra_path(G5, cutoff=None, weight='length'))

如何获取/提取所需的最短路径,包括高速公路边缘?

【问题讨论】:

  • 我有类似的要求,并会考虑 a) 拆分路线以包括高速公路的一个节点或一组节点 - 即代替 source->target 获取路线 (source->motorway_node(s) , motorway_node(s)->target) - 取决于能够为每个源-> 目标对识别适当的高速公路节点。或者,创建自定义权重,其中高速公路边缘的权重低于非高速公路边缘(可能是速度限制/长度),因此 shortest_path source->target 会更喜欢这些边缘。然后通过边走边计算真实成本,计算长度。你有什么收获吗?

标签: python networkx shortest-path network-analysis osmnx


【解决方案1】:

我无权访问您的图表或类似的玩具示例,而且我不知道您到底想要什么。主要是:

  • 图表是否加权?你使用 dijkstra 的事实让我认为它是,但是你使用道路网络的事实让我认为它不是。

  • 您的目标是什么?给定两个节点(假设sourcetarget),您是否想要获得构成它们之间最短路径的节点?还是您想要所有节点对的所有最短路径?有不同的功能针对这些事情进行了优化。

我做了一个玩具示例,给定两个节点,算法返回构成它们之间最短路径的节点。找到边缘然后是微不足道的(只需从返回的列表中连续选择节点):

import networkx as nx
import matplotlib.pyplot as plt

nodes = [i for i in range(10)]
edges = [(i, i+1) for i in range(len(nodes)-1)] + [(nodes[0], nodes[-1])] + [(nodes[4], nodes[8])]
G = nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)

source, target = 4, 9
print("Shortest path between nodes {} and {} = {}"
      .format(source, target, nx.bidirectional_shortest_path(G, source, destination)))

nx.draw_networkx(G)

我离开了画线以帮助更好地可视化事物。我还建议您查看文档here,以更好地了解哪种算法更适合您的用例。
如果我理解错了,请纠正我!

【讨论】:

  • 感谢您的回答! 1.正如您假设的那样,由于分配给每条边的属性“长度”,该图是加权的。 2.目的是获得最短路径,在每对节点的所有最短路径中,通过高速公路边缘(具有“高速公路”属性的边缘)。这就是为什么我计算图中所有最短路径考虑每个一对节点,从中我想得到最短的路径,包括高速公路边缘。你认为这可能吗?
  • 我必须考虑一下路径的事情,但如果只有带有属性motorway 的边很重要,你为什么不切换事情的顺序呢?首先找到具有motorway 属性的所有边,仅用这些节点/边构建一个图,然后研究这些节点/边的最短路径。这至少会节省您计算路径的时间。
  • 如果我认为一个图只包含高速公路边,我不会考虑地点之间的所有连接(整个图中的节点)。事实上,两个节点之间的连接通常结合高速公路和其他类型的道路(主要、次要等)。这意味着我没有考虑感兴趣的真实网络中的所有地方
猜你喜欢
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
相关资源
最近更新 更多