调整Dijkstra的运输路线 -​​ 最小化路线变化

时间:2018-05-06 21:46:57

标签: algorithm dijkstra

我正在开展一个涉及在公交系统上寻找最佳路线的小项目。我构建了一个图形,其中止点是顶点,边缘用停止之间的时间加权。

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

我遇到的障碍是选择第一辆公共汽车。请考虑以下情形:

enter image description here

Dijkstra倾向于乘坐巴士A,因为它首先到达第2站。如果你要停止2那就太好了。但是如果你要停3,B巴是更好的选择,两者的总成本是相同的。我不认为我可以避免Dijkstra的贪婪本性,但它对其他一切都运作良好,如果我不需要,我不想丢弃它。

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

4 个答案:

答案 0 :(得分:4)

听起来您需要将转移费用添加到图表中。

我想到的第一件事,可能不是最好的解决方案是在你的站点周围添加额外的节点。所以不是StopB,而是

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

你必须为每一站的所有公共汽车都这样做。

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

答案 1 :(得分:2)

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

  • 节点由三元组(L, T, B)描述。每当公共汽车BL时间到达或离开位置T时,请创建一个节点(L, T, B)
  • 为每个公交路线段创建一个有向边。也就是说,如果巴士B在时间L1离开地点T1并在时间L2到达地点T2,则添加边(L1, T1, B) -> (L2, T2, B) ,费用T2 - T1(或任何其他合理的费用,可能取决于票价)。
  • 添加对应于&#34的边缘;停在公交车上#34;。如果巴士B在时间L到达某个地点T1,然后在T2时间离开同一位置,请添加(L, T1, B) -> (L, T2, B)T2 - T1 1}}。
  • 添加对应于"切换总线"的边缘。如果满足以下条件,请将N1 = (L, T1, B1)的有向边添加到N2 = (L, T2, B2),费用为T2 - T1 + epsilon
    • N1是"到达"节点(总线B1在时间L
    • 时到达T1
    • N2是"出发"节点(总线B2在时间L){/ 1>离开T2
    • T1 < T2B1 != B2

在此图表中,路径的成本是总时间加c * epsilon,其中c是总线更改的数量。 epsilon代表&#34;费用&#34;切换总线。例如,如果有人同样喜欢&#34;留在公共汽车上&#34;和&#34;切换公共汽车,但保存2分钟&#34;,然后epsilon应该是2分钟。

您还可以添加&#34;最小切换时间&#34;通过将不等式S修改为T1 < T2T1 + S < T2。这将排除T1T2非常接近的边缘,以至于有人无法及时合理地切换公交车。

答案 2 :(得分:1)

另一项提案

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

A - &gt;乙

A - &gt; ç

B - &gt; ç

对于每个边缘,您需要增加上车和下车所需的成本时间。

答案 3 :(得分:1)

答案非常有帮助。我最终做了一些不同的事情,但受到了这里的想法的启发。基本上每个站点都有退出&#39;分配到每条公交线路,边缘通向站点。为了让公共汽车A到达第3站,它需要进入第2站,然后进入“B&#39;出口。进入车站的边缘会产生额外费用。如果路线匹配,公共汽车可以免费绕过火车站。巴士&#39; B&#39;永远不需要进入停止2去停止3,但是公共汽车A会这样做。

这允许任何一辆公共汽车成为停靠2的最短路线,并且允许两辆公共汽车到达第3站。但是如果你要从第1站停止3,从公共汽车B开始将是最便宜的路线,因为它没有&# 39;需要经过车站并承担额外费用。

enter image description here