一尘不染

具有时间限制的图上的寻路(路由,行程计划等)算法

algorithm

我有一个巴士/火车/
…,每个日期的到达/离开时间等数据库。我正在寻找一种方法来搜索两个位置之间最快(最短/最便宜/最少的过渡)行程。我希望将来能有任意位置,使用OpenStreetMap数据在站点之间以及从站点到起点/终点之间进行步行,但是暂时我只想在数据库中找到两个站点之间的路径。

问题是我似乎找不到有关此主题的太多信息,例如,该Wikipedia页面上有很多文本,其中绝对没有有用的信息。

我发现的是GoogleTransit中使用的GTFS格式。尽管我的城市没有提供公共数据馈送(甚至没有私有数据馈送),但我已经拥有了GTFS包含的所有重要信息,并且进行转换将是微不足道的。

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

但是 ,路由代码没有得到很好的记录(至少从我发现的情况来看),我不需要整个东西。

我要寻找的只是对可以使用的算法,其性能以及一些伪代码的良好概述。

因此, 问题是 ,给定一个停靠点,路线以及到达/离开/旅行时间的列表,我如何轻松地找到从停靠点A到停靠点B的最快路径?


阅读 259

收藏
2020-07-28

共1个答案

一尘不染

  1. 将您的问题建模为图表。每个站点将是一个顶点,而每个总线/火车将是一个边缘。
  2. 创建一个函数w:Edges->R,指示每个边的时间/金钱/…。
  3. 现在,您有一个典型的最小路径问题,可以通过Dijkstra算法解决 ,该算法从给定源中查找到所有顶点的最小路径。

(*)对于“最小过渡”,您的权重实际上是每个边的1,因此您甚至可以通过运行BFS双向
BFS而不是dijkstra来优化此权重,如我在这篇文章中所解释的。距离,但实际上是相同的算法]。


编辑
作为对图表的非静态性质的编辑(对于时间),您在注释中提到的时间(关于价格和过渡数量,我上面提到的内容仍然适用,因为这些图表是静态的),您可以使用距离向量路由算法,它实际上适用于动态图,是Bellman
Ford算法
的分布式变体。
算法思路:

  • 周期性地,每个顶点将其“距离矢量”发送给它的邻居[该矢量指示从发送顶点到另一个顶点行进的“成本”是多少。
  • 它的邻居试图更新其路由表[最好通过哪个边缘移动到每个目标]
  • 对于您的情况,每个节点[到达时间+等待时间]知道到达邻居的最快方法是什么,并且[顶点/站]将此数字加到距离向量中的每个对象中,以便知道如何以及到达目的地所需的时间。公交车离开时,应重新计算[从此来源]所有节点的旅行时间,并将新矢量发送给它的邻居
2020-07-28