我正在开展一个涉及在公交系统上寻找最佳路线的小项目。我构建了一个图形,其中止点是顶点,边缘用停止之间的时间加权。
虽然我会尝试使用Dijkstra的变体来找到最佳路线。当找到要考虑的下一个边缘时,该算法仅查看其出发时间在行程的当前时间之后的边缘。图中有几个部分,其中公共汽车同时到达和离开同一系列的停靠点。为了防止不必要地切换总线,我在选择最佳边缘时添加了路由更改的成本。这种方法效果非常好而且速度非常快。
我遇到的障碍是选择第一辆公共汽车。请考虑以下情形:
Dijkstra倾向于乘坐巴士A,因为它首先到达第2站。如果你要停止2那就太好了。但是如果你要停3,B巴是更好的选择,两者的总成本是相同的。我不认为我可以避免Dijkstra的贪婪本性,但它对其他一切都运作良好,如果我不需要,我不想丢弃它。
有没有人知道一个好的解决方案,可以解决正确选择第一站的问题(或者可能在事后调整它?)。或者,是否存在人们用于此类问题的更好的算法?
答案 0 :(得分:4)
听起来您需要将转移费用添加到图表中。
我想到的第一件事,可能不是最好的解决方案是在你的站点周围添加额外的节点。所以不是StopB,而是
Stop-B从Bus-A下车 停止-B Stop-B上Bus-B
你必须为每一站的所有公共汽车都这样做。
可能有更好的选择。这是我能在2分钟内拿出来的第一件事。
答案 1 :(得分:2)
您可以在如下构造的较大图表上使用普通Dijkstra:
(L, T, B)
描述。每当公共汽车B
在L
时间到达或离开位置T
时,请创建一个节点(L, T, B)
。B
在时间L1
离开地点T1
并在时间L2
到达地点T2
,则添加边(L1, T1, B) -> (L2, T2, B)
,费用T2 - T1
(或任何其他合理的费用,可能取决于票价)。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 < T2
和B1 != B2
在此图表中,路径的成本是总时间加c * epsilon
,其中c
是总线更改的数量。 epsilon
代表&#34;费用&#34;切换总线。例如,如果有人同样喜欢&#34;留在公共汽车上&#34;和&#34;切换公共汽车,但保存2分钟&#34;,然后epsilon
应该是2分钟。
您还可以添加&#34;最小切换时间&#34;通过将不等式S
修改为T1 < T2
来T1 + S < T2
。这将排除T1
和T2
非常接近的边缘,以至于有人无法及时合理地切换公交车。
答案 2 :(得分:1)
另一项提案
而不是添加节点。你可以更多的边缘。而不是代表公交路线(A - > B - > C),如下所示:
A - &gt;乙
A - &gt; ç
B - &gt; ç
对于每个边缘,您需要增加上车和下车所需的成本时间。
答案 3 :(得分:1)