具有时间限制的图上的寻路(路由、旅行计划……)算法

Posted

技术标签:

【中文标题】具有时间限制的图上的寻路(路由、旅行计划……)算法【英文标题】:Pathfinding (routing, trip planning, ...) algorithms on graphs with time restrictions 【发布时间】:2011-11-06 22:23:12 【问题描述】:

我有一个公共汽车/火车/...站点的数据库以及每个日期的到达/离开时间等等。我正在寻找一种方法来搜索两个位置之间的最快(最短/最便宜/最少的转换)行程。我希望将来有任意位置,使用 OpenStreetMap 数据在停靠点之间和从停靠点到开始/结束之间行走,但是目前我只想在数据库中找到两个停靠点之间的路径。

问题是我似乎找不到关于这个主题的太多信息,例如this Wikipedia page 有很多文本,其中绝对没有有用的信息。

我发现的是GTFS 格式,用于Google Transit。虽然我的城市不提供公共数据馈送(甚至不提供私人数据馈送),但我已经拥有 GTFS 包含的所有重要信息,因此进行转换将是微不足道的。

有一些基于 GTFS 的软件,例如 OpenTripPlanner,也可以使用 OpenStreetMap 进行行人/汽车/自行车路线。

然而,路由代码没有很好的文档记录(至少从我发现的),我不需要整个东西。

我正在寻找的只是对我可以使用的算法、它们的性能,也许是一些伪代码的一些很好的概述。

所以,问题是,给定站点、路线和到达/出发/旅行时间的列表,我怎样才能轻松找到从站点 A 到站点 B 的最快路径?

【问题讨论】:

【参考方案1】:
    将您的问题建模为graph。每个站都是一个顶点,并且 每辆公共汽车/火车都是一个边缘。 创建一个函数w:Edges->R,表示每条边的时间/金钱/...。 现在,您有一个典型的最小路径问题,可以通过以下方式解决 Dijkstra algorithm,从给定源找到所有顶点的最小路径。

(*) 对于“最少转换”,每个边的权重实际上为 1,因此您甚至可以通过运行 BFS 甚至 bi-directional BFS 而不是 dijkstra 来优化它,正如我在 @987654325 中解释的那样@【解释为社交距离,其实是同一个算法】。


编辑 作为对您在 cmets 上提到的图表 [时间] 的非静态性质的编辑 [关于价格和转换次数,我上面提到的仍然适用,因为这些图表是静态的],您可以使用distance vector routing algorithm,实际上是用于动态图,是Bellman Ford algorithm 的分布式变体。 算法思路:

周期性地,每个顶点发送它的“距离向量”到它的 邻居 [向量表示从发送顶点到其他顶点的“成本”。 它的邻居尝试更新他们的路由表 [通过哪条边最好移动到每个目标] 对于您的情况,每个节点都知道到达其邻居的最快方式是什么,[行程时间 + 等待时间],并且它 [顶点/站点] 将此数字添加到距离向量中的每个主条目,以便知道如何以及需要多少时间才能到达目的地。当一辆公共汽车离开时,应该重新计算所有节点的行程时间[来自这个来源],并且应该将新向量发送给它的邻居

【讨论】:

是的,你不会比 Dijkstra 的算法 m 更快,除非你保留了允许进一步优化的约束。对于时间以外的指标,您需要制定一个“权重”,它是时间、成本和麻烦的组合。您可能还必须将其留给用户来确定这些权重是什么并即时重新计算,或者有几个预先确定的场景(100% 时间、100% 便宜、50/50/0、40/40/20、等)并保留 Dijkstra 查找表的缓存版本。 除非我遗漏了什么,否则这是行不通的。 Dijkstra 非常适合仅具有空间域的“静态”图,但这具有时域。例如,如果您乘坐公共汽车到达一个节点需要 1 分钟,那么那里的边缘将与您花费 5 分钟的情况不同。您可能会错过公共汽车,因此重量会变大,因为您必须等待。此外,如果您以某种方式到达某个节点(错过了当天的最后一班车),某些边缘可能会消失,但如果您以另一种方式到达那里,就会出现在那里。 AFAIK,Dijkstra 不允许这样做,但如果我错了,请纠正我。 @albwq:Dijkstra 的算法不能处理顶点中的“等待”下一班车,你是对的。但是,它适用于您要求的其他两个标准:成本和转换次数。 [参见我关于均匀优化转换次数的最后一节]。 @albwq:我编辑了我的答案,并添加了关于用于处理动态网络的算法的简短描述 [和链接] 对丢失访客的僵尸回答:几乎所有传统算法在时间相关图上都失败了,尤其是等待时间。一个真正有效的快速灵活的解决方案是RAPTOR

以上是关于具有时间限制的图上的寻路(路由、旅行计划……)算法的主要内容,如果未能解决你的问题,请参考以下文章

游戏的寻路算法

基于深度优先搜索的寻路算法及其进一步的探究

5 X 5 方阵引出的寻路算法 之 路径遍历(完结)

A*算法研究

Unity A星(A Star/A*)寻路算法

Unity专题_简单的寻路导航