【问题标题】:Graph Shortest Paths w/Dynamic Weights (Repeated Dijkstra? Distance Vector Routing Algorithm?) in R / Python / MatlabR / Python / Matlab中带有动态权重的图最短路径(重复Dijkstra?距离矢量路由算法?)
【发布时间】:2014-05-02 22:10:08
【问题描述】:

我有一张道路网络图,其中包含 avg。全天变化的交通速度测量值。节点是道路上的位置,边连接同一道路上的不同位置或两条道路之间的交叉点。我需要一种算法来解决给定开始时间的任意两个节点之间的最短行程时间路径。

显然,该图具有动态权重,因为边的行驶时间i 是该边的交通速度的函数,这取决于您的路径到达边所需的时间我。

我已经实现了 Dijkstra 算法 边权重 = (edge_distance / edge_speed_at_start_time) 但这忽略了边缘速度随时间的变化。

我的问题是:

  1. 有没有一种启发式的方法来使用对 Dijkstra 算法的重复调用来逼近真正的解决方案?

  2. 我相信“距离矢量路由算法”是解决此类问题的正确方法。有没有办法使用 Igraph 库或 R、Python 或 Matlab 中的其他库来实现这个算法?

编辑 我目前在 R 中使用 Igraph。该图是一个 igraph 对象。 igraph 对象是使用 igraph 命令 graph.data.frame(Edges) 创建的,其中 Edges 看起来像这样(但有更多行):

我还有一个每个边的速度矩阵(以 MPH 为单位),看起来像这样(除了更多的行和列):

因为我想找到最短的行程时间路径,所以给定边缘的权重是 edge_distance / edge_speed。但是 edge_speed 会根据时间而变化(即您已经在这条路上行驶了多长时间)。 该图有 7048 个节点和 7572 条边(因此非常稀疏)。

【问题讨论】:

    标签: r matlab graph igraph shortest-path


    【解决方案1】:

    有一个精确的算法可以解决这个问题!它被称为时间相关 Dijkstra (TDD),运行速度与 Dijkstra 本身一样快。

    不幸的是,据我所知,igraph 和 NetworkX 都没有实现这个算法,所以你必须自己做一些编码。

    幸运的是,您可以自己实现它!您需要在一个地方调整 Dijkstra。 在正常的 Dijkstra 中,您按如下方式分配权重: dist 您当前的距离矩阵,u 您正在考虑的节点和v 它的邻居。

    alt = dist[u] + travel_time(u, v)
    

    在时间相关的 Dijkstra 中,我们得到以下结果:

    current_time = start_time + dist[u]
    cost = weight(u, v, current_time)
    alt = dist[u] + cost
    

    Stuart E. Dreyfus 描述了 TDD Dijkstra。一些最短路径的评估 算法。运筹学,17(3):395–412, 1969

    目前,已经在使用更快的启发式算法。可以通过搜索词找到它们:“时间相关路由”。

    【讨论】:

      【解决方案2】:

      R 中的 igraph 包怎么样?您可以尝试 get.shortest.paths 或 get.all.shortest.paths 功能。

      library(igraph)
      ?get.all.shortest.paths
      get.shortest.paths()
      get.all.shortest.paths()# if weights are NULL then it will use Dijkstra.
      

      【讨论】:

      • 我目前正在使用您的建议。然而,这个解决方案假设权重是静态的(即从 A 地和 B 地开车总是需要 17 分钟)。我需要一种使用 动态 权重的方法(即,在没有交通的情况下,凌晨 3 点从 A 地到 B 地需要 5 分钟,但在下午 6 点的高峰时间需要 20 分钟)。问题是,如何用动态权重解决 shortest.paths?
      • @user3580621 你的体重是什么格式的?作为时间相关的数据框?作为时间的函数?您的数据结构将为您的方法提供参考。
      • 如果您的动态时间是预定义的,并且您已经在准备图表时使用了它们,那么如果您为权重分配 NULL,shortest.path 函数将使用它们。因此,在搜索最短路径之前,您应该生成一个加权图。这取决于您的数据。如果您可以准备一个样本并上传它,最好讨论一下。
      • @Gary Weissman & user3079143 -- 我刚刚上传了数据结构的截图(似乎是最简单的方法,因为这里没有乳胶兼容性)。如果您更喜欢实际的示例数据文件,请告诉我。
      • 我认为你应该在一个独立的图表中考虑一天中的每个时间。然后,如果您在一天中有 5 个不同时间的数据,那么您可以有 5 个独立的图表
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 2018-05-23
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      相关资源
      最近更新 更多