【问题标题】:Adjusting Dijkstra for transit routing — minimize route changes为公交路线调整 Dijkstra — 最大限度地减少路线变更
【发布时间】:2018-05-06 21:46:57
【问题描述】:

我正在从事一个小型项目,该项目涉及在公交系统上寻找最佳路线。我构建了一个图,其中停靠点是顶点,边缘根据停靠点之间的时间加权。

虽然我会尝试使用 Dijkstra 的变体来找到最佳路线。在寻找下一个要考虑的边时,该算法只查看出发时间在行程中当前时间之后的边。图中有几个部分,其中公共汽车同时到达和离开同一系列的站点。为了防止不必要地切换总线,我在选择最佳边缘时增加了路线更改的成本。这出奇的好,而且速度非常快。

我遇到的困难是选择第一辆公共汽车。考虑以下场景:

Dijkstra 将倾向于乘坐巴士 A,因为它首先到达 2 站。如果你要停止 2 那就太好了。但是,如果您要停 3,巴士 B 是更好的选择,而且两者的总费用是相同的。我认为我无法避免 Dijkstra 的贪婪本性,但它对其他一切都非常有效,如果我不需要,我不想丢弃它。

有没有人知道一个好的解决方案可以解决正确选择第一站的问题(或者可能在事后调整它?)。或者,人们是否有更好的算法来解决这类问题?

【问题讨论】:

    标签: algorithm dijkstra


    【解决方案1】:

    听起来您需要将传输成本添加到图表中。

    我想到的第一件事,可能不是最好的解决方案是在您的停靠点周围添加额外的节点。因此,您将拥有而不是 StopB

    Stop-B 下 Bus-A 停止-B Stop-B 上 Bus-B

    你必须在每一站的所有公交车上都这样做。

    可能有更好的选择。这是我能在 2 分钟内想到的第一件事。

    【讨论】:

    • 我同意弗拉德的观点。但不要添加节点,而是将成本函数修改为上下文。
    • @Vincent 如果节点不存储关于乘坐哪条总线到达那里的信息,则成本函数不能是上下文的。
    • 啊..对。那时似乎不可避免地要构建另一个带有表示上下文的节点的图。
    • @Vincent。您可能会逃脱相同数量的节点,但更多的边缘。正如您指出的那样,函数不能是上下文的,所以它归结为您要存储该上下文的位置。
    【解决方案2】:

    您可以在如下构造的较大图形上使用普通 Dijkstra:

    • 节点由三元组(L, T, B) 描述。每次在 T 时间有一辆公共汽车 B 到达或离开位置 L 时,创建一个节点 (L, T, B)
    • 为每个公交路线段创建有向边。也就是说,如果公共汽车B 在时间T1 从位置L1 出发并在时间T2 到达位置L2,则添加边(L1, T1, B) -> (L2, T2, B),成本为T2 - T1(或任何其他合理的成本) ,可能取决于票价)。
    • 添加对应于“在车站停留在公共汽车上”的边。如果公共汽车B 在时间T1 到达位置L,然后在时间T2 从同一位置出发,则添加边(L, T1, B) -> (L, T2, B),成本为T2 - T1
    • 添加与“交换总线”对应的边。如果满足以下条件,则添加从N1 = (L, T1, B1)N2 = (L, T2, B2) 的有向边,成本为T2 - T1 + epsilon
      • N1 是一个“到达”节点(总线 B1 在时间 L 到达 T1
      • N2 是一个“出发”节点(总线 B2L 在时间 T2 出发)
      • T1 < T2B1 != B2

    在此图中,路径的成本是总时间加上c * epsilon,其中c 是总线更改次数。 epsilon 代表切换总线的“成本”。例如,如果有人同样喜欢“留在公交车上”和“换车但节省 2 分钟”,那么 epsilon 应该是 2 分钟。

    您还可以通过将不等式 T1 < T2 修改为 T1 + S < T2 来添加“最小切换时间”S。这将排除 T1T2 如此接近以至于无法及时切换总线的边缘。

    【讨论】:

      【解决方案3】:

      另一个提议

      而不是添加节点。你可以只是更多的边缘。而不是代表公交路线(A -> B -> C),如下所示:

      A -> B

      A -> C

      B -> C

      对于每条边,您都会增加上车和下车的成本时间。

      【讨论】:

        【解决方案4】:

        答案真的很有帮助。我最终做了一些不同的事情,但受到了这里的想法的启发。基本上每个站点都有分配给每个公交路线的“出口”,其边缘从站点引出。为了让巴士A 到达第 3 站,它需要进入第 2 站,然后在“B”出口下。进入车站的边缘会产生额外费用。如果路线匹配,公共汽车可以免费绕过车站。所以巴士'B'永远不需要进入Stop 2才能去Stop 3,但巴士A却需要。

        这使得任何一辆巴士都可以成为前往第 2 站的最短路线,并允许两辆巴士都到达第 3 站。但如果您要从第 1 站前往第 3 站,那么从巴士 B 出发将是最便宜的路线,因为它不会无需经过车站,需额外付费。

        【讨论】:

          猜你喜欢
          • 2021-02-18
          • 1970-01-01
          • 2018-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多