C# 公交算法

C# 公交算法,c#,java,public,dijkstra,gtfs,C#,Java,Public,Dijkstra,Gtfs,我正在开发一个离线C#应用程序,它可以查找公交线路。 我可以提取时刻表/公交车/路线数据。我正在寻找最简单的解决方案,将与基本数据 可以使用什么算法来查找从公交车站“a”到公交车站“B”的路线?是否有一个针对C#/Java的开源解决方案? GoogleGTFS数据库格式是否适用于简单的解决方案 谢谢你的帮助。我被这件事缠住了。我不知道从哪里开始——如何存储数据以及如何查找路线。 我知道Dijkstra/A*但我只在不依赖于时间的图上使用过它们…从概念上讲,你采用相同的基本算法来计算A和B之间的距

我正在开发一个离线C#应用程序,它可以查找公交线路。 我可以提取时刻表/公交车/路线数据。我正在寻找最简单的解决方案,将与基本数据

可以使用什么算法来查找从公交车站“a”到公交车站“B”的路线?是否有一个针对C#/Java的开源解决方案? GoogleGTFS数据库格式是否适用于简单的解决方案

谢谢你的帮助。我被这件事缠住了。我不知道从哪里开始——如何存储数据以及如何查找路线。
我知道Dijkstra/A*但我只在不依赖于时间的图上使用过它们…

从概念上讲,你采用相同的基本算法来计算A和B之间的距离,但不是距离,你应该计算时间。如果你给它适当的输入,Dijkstra可以同时做这两件事

你习惯于用地图来衡量距离。然而,同一张地图也可以用来衡量时间;您所需要的只是添加关于平均速度的数据,而覆盖特定道路的特定距离所需的时间将自动消失。你甚至可以用时间来可视化地图;需要更长时间的路线会更长。Dijkstra不在乎它在评估哪一个,真的;它只关心找到数量最少的连续路线,而这个数字代表的是长度还是时间并不重要


为了结合速度,天真的算法只需使用白天的速度限制,并假设你从A到B从不需要停车;更先进的算法可以结合关于一天中的时间和交通模式(这将影响您当时在该道路上行驶的平均速度)的信息,以及道路是高速公路还是地面街道(从而对在十字路口停车的时间进行有根据的猜测)。您使用的内容取决于可用的内容,但基本的4层或5层时间维度应该足以满足除绝对时间最关键的应用程序之外的所有应用程序。对于地图中每条道路的每个方向,您需要早高峰、白天、傍晚高峰和夜间的平均速度,可能还需要午餐时间的数字。一旦你有了这些,Dijkstra算法的一个相对基本的改变就是传入一天中的某个时间,并让它根据时间来评估路线。

如果你对时间信息感兴趣,那么为什么不使用时间信息而不是它们之间的物理距离来标记图形边缘上的距离值呢。这样,您将搜索最快的路线,而不是最短的路线。然后,您可以使用Dijkstra/A*来计算您的结果


我有点不明白你所说的时间依赖性是什么意思。如果你的意思是你需要回答“上午10点前从x到y”的查询,那么你可以计算上午10点前到达的公交线路,这似乎是对数据的简单过滤。然后将Dijkstra/A*应用于数据。

您正在处理的问题不是一个简单的任务。因此,它有一个名字:混合整数非线性规划问题(MINLP)。用一位作者的话说(Deb 1998):

“当用数学公式表述时 时间调度问题成为一个重要的问题 混合整数非线性规划 具有大量数据的问题(MINLP) 与资源和服务相关的 限制。虽然尝试了 在过去,我们一直在寻找一个 简化模型的最优调度 使用经典优化 技术(活页夹和纸片), 1992年;菊口和帕拉米斯瓦兰,1993年), 据观察,这是一个错误 即使对于一个年轻人来说,这也是一项极其艰巨的任务 小型公交网络。难点 主要是因为大的 变量和约束的数量, 变量的离散性,以及 涉及到的非线性 目标函数及其应用 限制。”

在Deb的论文中,他提出了一种遗传算法

您的另一个选择是使用模拟。你可以马上尝试,从你的起点随机选择数千条路线,然后找出那些在到达目的地时效果相当好的路线


将算法想象成这样:您正试图找到从站点A到站点B的最快路线,从特定时间开始。你雇了1000人,给他们准备了一个硬币。你告诉他们每次有机会上下车时都要掷硬币。头,下车(或上车,如果已经下车)。尾部,保持打开(或保持等待,如果关闭)。他们每个人都有一张索引卡,写下他们在前进中所做的选择。你到B点,等待第一个人出现并拿走他的卡。

试试这个作为你的数据模型

1路公共汽车开往A站、B站和C站。2路公共汽车开往B站、D站和E站

我将基于公共汽车和车站存储一个唯一的节点,节点的距离基于时间。节点A1、B1、C1、B2、D2和E2。在传输的特殊情况下,应用等待下一条总线作为节点之间的距离。例如,如果1路公交车比2路公交车早30分钟到达B站,从B1到B2的行驶时间为30分钟

您应该能够应用Dijkstra算法。

阅读以下内容:

多模式路径规划。 硕士论文,卡尔斯鲁厄大学(TH),Fakultät für Informatik,2009年。 网上可于

关于铁路路线的章节也适用于公共汽车路线


其要点是:将空间和时间扩展为单个图形的天真方法不适用于大型网络。有更聪明的解决方案。

只是想分享我对这个问题的最终方法。这是一个大学项目的一部分,所以它可能不完全适合实际应用。它必须相当快才能在Windows Mobile设备上运行

我最终使用了4个表(SQLite)。一个表保存公共汽车列表,第二个表保存车站列表。另一个表保存了这些组合-哪辆公共汽车在特定的s站停车