【问题标题】:Calculating shortest path between 2 nodes with mandatory points in the middle计算两个节点之间的最短路径,中间有强制点
【发布时间】:2019-04-20 19:23:08
【问题描述】:

我正在尝试解决代表 Metro Service 的 双向加权 图中的问题,该图中有大约 300 个节点和 700 条边。

节点由地铁站定义,边是字符串,其中包含它们所属线路的信息以及在该边上行驶所需的时间(即边的权重)。

我必须确定 2 个站点之间的最快路径,给定一个 无序 列表(如果它们是有序的,那么所有站点之间最短路径的排列就足够了)强制性站点,它可以还要经过其他车站

在我搜索了这个问题之后,我看到了一些创建子图 + 应用 DFS 的建议。所以我创建了一个以起点站 + 强制站 + 终点站作为新顶点的图,边上有每个站之间的最短路径信息 + 行驶时间。

我现在遇到的问题如下:如何在这个新的子图上应用 DFS,使最后访问的站点强制成为我作为目的地的站点?

抱歉问题太长了!

【问题讨论】:

  • 图会包含循环吗?
  • 不,否则会是 tsp,但我只想从 a 到 b,经过一些中间需要的车站

标签: java algorithm search shortest-path dijkstra


【解决方案1】:

您需要首先针对您的问题定义一些内容:强制站点是唯一个您需要访问以到达目的地的站点吗?或者之间是否有其他未知站点不是强制性的,但在最短路径中可能需要?

假设此图包含循环:

如果强制站点列表是您到达目的地所需的所有站点,您可以在所有强制节点的子图上使用 Dijkstra 算法解决此问题。

在另一种情况下,它会更复杂(实际上是 NP-hard)查看这个答案以获得更深入的解决方案:Shortest path that traverses a list of required edges

【讨论】:

  • 它可能有更多非强制性的站点(也就是说,如果其中一个强制性站点没有直接连接,那么到达那里所需的站点也需要包括在内)。但是,子图上的每条边都有它们之间的路径信息(元素是站点的链表)+ 作为边权重的成本
【解决方案2】:

我有另一个想法。由于图是无环图,我们可以将强制节点(源节点和目的节点除外)分成两个节点(AAstartAend)并在它们之间设置一条边并将权重设置为-infinity。强制节点 A 的所有传入边将连接到 Astart 并且强制节点 A 的所有传出边将从Aend出来。最后,我们将为源节点到目标节点运行 dijkstra 算法。由于我们在强制节点中设置了 -infinite 权重,dijkstra 必然会通过它们以最小化成本。另外由于图是无环图,所以不用担心负循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2023-04-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    相关资源
    最近更新 更多