【问题标题】:Routing millions of paths路由数百万条路径
【发布时间】:2020-10-09 07:33:29
【问题描述】:

我有一个包含大约 300 万条路径的 OD 矩阵,我想在 OSM 网络上进行路由。 使用 Dijkstra,我每分钟获得大约 20 条路径,总时间为 2,500 小时。如果最近的节点算法不会错过一个相对较远的最近节点,那将几乎没有问题。使用贝尔曼福特,我似乎没有这个问题,但它慢了 40 倍——而且我没有 10 万小时。 ;} 在我选择的 Ubuntu 或 Windows 机器上,我有一些 24 GB RAM。顺便说一句,公共网络路由服务遇到了无法找到路由的相同问题。我的 OD 位置是湾区人口普查区的质心(一些偏远地区可能距离最近的道路几英里)。我的两个问题是: (1)如何避免路由可以找到问题,以及 (2) 如何加快进程(如果我使用具有 512 GB RAM 的云实例将无济于事)? 我想要改进的功能是 route = networkx.shortest_path(G, start_node, end_node, weight='travel_time') 和这个结合 start_node = osmnx.get_nearest_node(G, start) 及其对应的 end_node

【问题讨论】:

    标签: routes networkx processing-efficiency osmnx


    【解决方案1】:

    我的两个问题是:(1) 我怎样才能避免找不到路线的问题,以及 (2) 我怎样才能加快进程(如果我使用具有 512 GB RAM 的云实例将无济于事) ?

    关于 1,我必须查看一个可重现的最小示例才能了解您的具体情况。但是关于 2,最短路径求解是 CPU 限制而不是内存限制。如果您在云中进行,通过在 100 个内核之间分配要解决的路径,这样整个过程在一天内完成,您会得到更好的服务。

    【讨论】:

    • 感谢您的 (2),杰夫。至于 (1),这里是 Python 代码文件(小)和数据集(16 MB)的链接(在我的 Google Drive 上):drive.google.com/drive/folders/…
    • 我没有访问该 URL 的权限。我建议将完整的最小可重现代码 sn-p 粘贴到您的原始问题中:足以重现您正在经历的内容,而无需下载外部文件。我去看看。
    • 这就够了吗?
    • 这是一个无法路由的 OD 路径 - 即使使用 Bellman-Ford 算法:从:“37.849593,-122.2497462”到:“37.5579748,-121.9669258”,根据谷歌地图来自6389 Florio St, Oakland, CA 94618 to 39200 Brahms Terrace, Fremont, CA 94538. 这是代码 sn-p:start = (37.849593,-122.2497462)end = (37.5579748,-121.9669258)start_node = ox.get_nearest_node(G, start) end_node = ox.get_nearest_node(G, end)route = nx.shortest_path(G, start_node, end_node, weight='travel_time') 这会抛出 KeyError: 5864867474 NetworkXNoPath: No path to 5864867474。
    • 我无法测试它,因为它不可重现:如果您提供完整的代码 sn-p(编辑您的原始问题以添加它),我可以完全从上到下运行,我可以给出你一个答案。这将取决于您在评论中未定义的变量的细节,最重要的是G 本身。
    猜你喜欢
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多