我正在开发一个可以找到公交路线的离线C#应用程序。 我可以提取时间表/公交车/路线数据。我正在寻找可以使用基本数据的最简单的解决方案。
可以使用什么算法来查找从公交车站“A”到公交车站“B”的路线?是否有针对C#/ Java的开源解决方案? 数据库的谷歌GTFS格式是否适用于简单的解决方案? http://code.google.com/transit/spec/transit_feed_specification.html
感谢您的帮助。我坚持这个。我不知道从哪里开始 - 如何存储数据以及如何查找路径。 我知道Dijkstra / A *,但我只在不依赖时间的图表上使用它们......
答案 0 :(得分:10)
您正在处理的问题不是一项微不足道的任务。这么多,有一个名称:混合整数非线性规划问题(MINLP)。用一位作者的话来说(Deb 1998):
“当用数学方法制定时, 时间安排问题变成了 混合整数非线性规划 问题(MINLP)有很多 资源和服务相关的 限制。尽管有尝试 过去曾找过一个 简化模型的最佳时间表 使用经典优化 技术(Bookbinder& DCsilets, 1992; Kikuchi& Parameswaran,1993), 据观察,这是一个 即使对于一个非常困难的任务 小型运输网络。困难 主要是因为大 变量和约束的数量, 变量的离散性,和 涉及的非线性 目标函数和 约束“。
在Deb的论文中,他提出了一种遗传算法。
您的另一个选择是使用模拟。只是为了扔东西你可以马上尝试 - 从你的起源选择成千上万的随机路线,并剔除那些在到达目的地时工作得相当好的路线。
想象这样的算法:您正试图找到从A站到B站的最快路线,从某个时间开始。你雇佣了1000个人并用四分之一的武器来翻转。你告诉他们每次有机会上下车时都要翻硬币。下车,下车(或上车,如果已经下车)。尾巴,保持(或等待,如果关闭)。他们每个人都有一张索引卡,可以记下他们所做的选择。你去B点等待第一个人出现并拿走他的卡片。
答案 1 :(得分:6)
请阅读:
多模态路线规划。 硕士论文,UniversitätKarlsruhe(TH),FakultätfürInformatik,2009。 可在http://i11www.ira.uka.de/extra/publications/p-mmrp-09.pdf
在线获取铁路路线部分也适用于公交路线。
它的要点:将空间和时间扩展到单个图形的天真方法对大型网络不起作用。有更智能的解决方案。
答案 2 :(得分:4)
有很多关于公共传输路由算法的出版物(30多个),这些出版物已经由开源(Java)OpenTripPlanner project的贡献者随时编译:
https://github.com/opentripplanner/OpenTripPlanner/wiki/RoutingBibliography
OpenTripPlanner是一种多模式路由引擎,还包括自行车和步行 - 来自上面的链接:
这是一篇文章,论文和书籍的列表,它们启发并通知了现有的OTP路由引擎和一些正在进行的实验。目前,OpenTripPlanner使用单个时间相关(而不是时间扩展)图,其中包含街道和传输网络。通常使用具有欧几里德启发式或收缩层级的A *算法来计划仅行走和仅自行车行程。 Walk + Transit或Bike + Transit旅行计划使用MOA *算法的变体,其中epsilon-dominance用于路径修剪,而Tung-Chew启发式(提供聚合权重下限的图表)用于队列排序。
上面的路由参考书目包括以下类别的算法和相关工作的参考:
如果您发现列表中没有新内容,请随时将其添加到维基!
就其他开源公共交通路线图书馆而言,Bliksem Labs还有RRRR项目:
https://github.com/bliksemlabs/rrrr
从以上链接:
RRRR(通常发音为R4)是RAPTOR公共交通路由算法的C语言实现。它是Bliksem旅程规划和乘客信息系统的核心路由组件。该项目的目标是在大的地理区域(例如BeNeLux或整个欧洲)生成一组帕累托最优路线,从而改善现有更灵活的替代方案的资源消耗和复杂性。该系统最终应支持旅行计划中反映的实时车辆/旅行更新,并且能够直接在没有互联网连接的移动设备上运行。
OpenTripPlanner和RRRR都使用GTFS数据。
答案 3 :(得分:3)
只想分享我对这个问题的最终方法。这是大学项目的一部分,因此它可能不完全适合现实世界的使用。在Windows Mobile设备上运行它必须相当快。
我最终使用了4个表(SQLite)。一个表保留总线列表,第二个表保留一个站列表。另一张表保留了这些组合 - 公交车在特定车站停靠的位置以及从该车站到达的位置以及需要多长时间(分钟)。必须存储所有组合。最后一张表是一个简单的时间表。对于每个站点,它列出了停在那里的每个总线和时间(我将时间存储为整数值 - 14:34是1434,以便更快地进行比较)。
我使用了双向广度优先搜索算法。为起始站和目的站检索相邻站(可直接访问)。如果这两个“图形”在一个站点上重叠,则存在从站A到站X的路径。例如,从A站可以到达站B,C,D,E(通过使用特定的总线)。从目的地站X,您可以直接到达N,C,Z。这两个图在站C上重叠。因此路径A - > C - > X存在。如果在第一次迭代中没有找到路径,则算法继续并再次展开图形(BFS)。
第一步没有考虑时间 - 这足以让它足够快。您只能获得一个可能的路径列表,其中包含您必须用来获取这些路径的总线列表。 在最后一步评估时间,您浏览可能路径列表并检查公交车是否在特定时间内行驶(增加每次停车的时间)。
在一个拥有250个车站和100多辆公共汽车/铁路的小城市,这些方法最多可以进行3次更改(您必须在旅途中更换公交车)。计算只需几秒钟。但是我不得不将整个数据库加载到内存(Dictionary)中以加快查询速度,这些查询花费的时间太长了。
我认为这不适用于大型网络。但它适用于单个中小城市的公共交通工具。
答案 4 :(得分:1)
从概念上讲,您使用相同的基本算法来评估A和B之间的距离,但是您应该评估时间而不是距离。如果你给它适当的输入,Dijkstra可以做到这两点。
您已经习惯将地图视为距离的衡量标准。但是,同一张地图也可以作为时间的衡量标准;您只需要添加有关平均速度的数据,覆盖特定道路特定距离所需的时间就会自动消失。您甚至可以根据时间可视化地图;需要更长时间的路线会更长。 Dijkstra并不关心它正在评估哪个,真的;它只关心找到数量最少的连续路线,这个数字代表长度或时间是无关紧要的。
为了结合速度,天真的算法只需使用白天的速度限制,并假设从A到B时你永远不必停下来;更高级的算法可以包含有关一天中的时间和交通模式的信息(这将影响您当时在该道路上行驶的平均速度),以及道路是高速公路还是水面街道(从而对停止停留的时间做出有根据的猜测在十字路口)。您使用的内容取决于您可以使用的内容,但基本的4或5层时间维度应该足以满足除绝对时间最关键的应用程序之外的所有应用程序。对于地图中每条道路的每个方向,您需要在早上高峰,白天,晚上高峰和晚上的平均速度,也可能是午餐时间的数字。一旦你有了这个,这是一个相对基本的改变Dijkstra算法在一天中的时间传递并让它根据时间评估路线。
答案 5 :(得分:0)
如果您对时间信息感兴趣,那么为什么不使用时间信息而不是它们彼此的物理距离来标记图形边缘上的距离值。这样您将搜索最快的路线,而不是最短的路线。然后,您可以使用Dijkstra / A *来计算结果。
我对你依赖时间的意思有点不清楚。如果你的意思是你需要回答“早上10点之前从x到y”的形式的查询,那么你可以计算在上午10点之前到达的公共汽车路线,看起来像是对数据的简单过滤。然后将Dijkstra / A *应用于数据。
答案 6 :(得分:0)
尝试将此作为您的数据模型。
总线1进入A,B和C站。总线2进入B,D和E站。
我会根据总线和停靠点存储一个唯一的节点,节点的距离基于时间。我们将有节点A1,B1,C1,B2,D2和E2。在传输的特殊情况下,应用等待下一个总线作为节点之间的距离。例如,如果1路巴士在巴士2前30分钟到达B站,则从B1到B2的行程时间为30分钟。
你应该能够应用Dijkstra的算法。