仅通过公共交通找到最佳路线的策略?

时间:2009-01-27 14:01:00

标签: algorithm optimization data-structures

查找汽车的路线非常简单:存储所有道路的加权图表,您可以使用Djikstra's algorithm [1]。公交路线不太明显。有了公共汽车,你必须代表诸如“等待下一班车10分钟”或“走一个街区到另一个公共汽车站”之类的东西,然后将它们输入你的寻路算法。

对于汽车而言,它甚至都不简单。在一些城市,一些道路在早上单向进入城市,而在晚上仅单向进入城市。一些先进的GPS知道如何在高峰时段避开繁忙的路线。

您如何有效地表示这种与时间有关的图并找到路线?不需要可证明的最佳解决方案;如果旅行者想要准时,他们会买车。 ; - )

[1]一个很好的算法在一个例子中提到,因为每个人都听说过它,虽然A *是这个应用程序的一个更有可能的选择。

14 个答案:

答案 0 :(得分:52)

我参与了瑞典斯德哥尔摩公共交通的一个journy计划系统的开发。它基于Djikstra的算法,但在系统中访问每个节点之前终止。今天,当每个站点都有可靠的坐标时,我猜A *算法就是选择。

有关即将到来的交通的数据是定期从几个数据库中提取出来的,并编译成加载到我们搜索服务器集群内存中的大表。

成功算法的一个关键是使用路径成本函数,该函数基于行程和等待时间乘以不同的权重。在瑞典语中称为“kresu” - 这些加权时间反映了这样一个事实:例如,一分钟的等待时间通常相当于“不便”到两分钟的旅行时间。

KRESU体重表

  • x1 - 旅行时间
  • x2 - 在站点之间行走
  • x2 - 等待停止 在旅途中。停在屋顶下, 与商店等可以得到一点点 较低的重量和拥挤的车站a 更高调整算法。
  • 第一站等候时间的重量是交通强度的函数,可以在0.5到3之间。

数据结构

<强>区域 您旅行的命名区域可以开始或结束。巴士站可能是一个有两个站点的区域。具有多个平台的较大站可以是一个区域,每个平台具有一个停靠点。 数据:名称,区域停止

<强>停止 所有巴士站,火车站和地铁站的阵列。请注意,您通常需要两个停靠点,每个方向一个停靠点,因为穿过街道或步行到另一个平台需要一些时间。 数据:名称,链接,节点

<强>链接 从此站步行可以到达的其他站点列表。 数据:其他停止,步行到其他停止的时间

<强>管路/旅游 你在公共汽车和目的地有一个号码。巴士在一站开始,经过几站到达目的地。 数据:编号,名称,目的地

<强>节点 通常你有一个时间表,它的最短时间应该是巡回赛的第一站和最后一站。每次公共汽车/火车通过停靠时,您都会向阵列添加新节点。该表每天可以有数百万个值。 数据:线路/巡视,停止,到达时间,出发时间,误差范围,巡回中的下一个节点

搜索 与Nodes数组大小相同的数组,用于存储您到达目的地的路径成本。 数据:与上一节点的反向链接(如果未访问节点则未设置),路径成本(未访问的无限制)

答案 1 :(得分:13)

你所谈论的内容比数学模型更复杂,这些数学模型可以用简单的数据结构(如图形)和“简单”算法(如Djikstra's)来描述。您要求的是一个更复杂的问题,例如在自动化物流管理领域遇到的问题。

考虑它的一种方法是你问一个多维问题,你需要能够计算:

  1. 距离优化
  2. 时间优化
  3. 路线优化
  4. “时间范围”优化(如果它是5:25且公共汽车仅在7:00出现,则选择另一条路线。)
  5. 鉴于所有这些情况,您可以尝试使用复杂的多层数据结构进行确定性建模。例如,您仍然可以使用加权的二维图来表示现有的潜在路线,其中每个节点还包含一个有限状态自动机,它根据时间值向路径添加权重偏差(因此通过在5:25跨越一个节点)如果您的模拟在7:00越过它,则会获得不同的值。)

    然而,我认为在这一点上你会发现自己的模拟越来越复杂,当建议转移到现实世界时,很可能无法提供最佳路线的“很好”近似。事实证明,当遇到真实世界的混沌行为和动态时,软件和数学建模与仿真充其量只是一个弱工具。

    我的建议是使用替代策略。我会尝试使用遗传算法,其中个人的DNA计算出潜在的路线,然后我会创建一个适应度函数,以更“易于维护”的查找表方式编码成本和权重。然后我会让遗传算法试图收敛于公共交通路线查找器的近似最优解。在现代计算机上,诸如此类的GA可能会表现得相当不错,并且它应该至少相对于现实世界的活力而言相当强大。

    我认为大多数做这类事情的系统采取“简单的方法”,只是做一些像A *搜索算法,或类似于贪婪的成本加权有向图行走的东西。需要记住的是,公共交通工具的用户自己不知道的最佳路线是什么,因此90%的最优解决方案对于普通情况来说仍然是一个很好的解决方案。

答案 2 :(得分:9)

从公共交通领域了解一些数据点:

  1. 每次转会都会导致10分钟的罚球(除非是定时转会)。也就是说,从精神上来说,涉及单车的行程需要40分钟,大致相当于需要转机的30分钟行程。
  2. 大多数人愿意步行到公交车站的最大距离是1/4英里。火车站/轻轨约1/2英里。
  3. 距离与公共交通车手无关。 (只有时间很重要)
  4. 频率很重要(如果错过连接到下一个总线多长时间)。如果替代方案被搁置一小时以进行下一次快递,骑手将更喜欢更频繁的服务选择。
  5. 铁路比公交车有更高的偏好(更有信心火车将会来到正确的方向)
  6. 不得不支付新票价是一个很大的打击。 (加上约15-20分钟的罚款)
  7. 总行程时间也很重要(以上罚款)
  8. 连接的无缝程度如何?骑车人是否必须在火车站穿过繁忙的街道?或者它只是走下火车,步行4步到公交车?
  9. 穿越繁忙的街道 - 转机的另一个重大损失 - 可能会错过连接,因为无法快速穿过街道。

答案 3 :(得分:4)

  

寻找汽车的路线很漂亮   easy:你存储一个加权图   所有的道路,你可以使用   Djikstra的算法。巴士路线   不太明显。

它可能不那么明显,但事实是它只是汽车问题的另一个维度,增加了无限的成本计算。

例如,您将时间过去的公交车标记为具有无限成本 - 然后它们不包括在计算中。

然后你决定如何衡量每个方面。

过境时间可能会加1 等待时间可能会加1 转移可能会加权0.5(因为我宁愿早点到达并有额外的转移)

然后使用任何常规成本算法计算图表中的所有路线,并增加无限成本:

每次沿着边缘移动时,您必须跟踪“当前”时间(累计传输时间),如果到达矢量,则必须为当前时间之前的任何总线分配无限成本。当前时间增加了该向量的等待时间,直到下一个总线离开,然后你可以自由地沿着另一条边移动并找到新的成本。

换句话说,有一个新约束,“当前时间”是第一辆公交车开始的时间,与公交车和停靠站的所有公交和等候时间相加。

它使算法复杂化一点点,但算法仍然相同。您可以看到大多数算法都可以应用于此,有些可能需要多次传递,而有些算法无法工作,因为您无法添加时间 - >无限成本计算内联。但大多数人应该工作得很好。

您可以通过简单地假设公交车按计划进行进一步简化,并且总是有另一辆公交车,但它会增加等待时间。该算法只会增加运输成本,然后再次通过树并根据下一班车何时到来增加等待成本。它有时会导致效率较低的版本,但即使是大城市的总图实际上也很小,所以这不是一个真正的问题。在大多数情况下,一两条路线将是明显的赢家。

Google有此功能,但还包括从一个公交车站步行到另一个公交车站的额外边缘,因此如果您愿意在拥有大型公交系统的城市中行走,您可能会找到更优化的路线。

- 亚当

答案 4 :(得分:4)

如果旅行的每个航段的成本是及时测量的,那么唯一的复杂因素就是考虑时间表 - 这只是将每个节点的成本改变为当前时间t的函数,其中t只是总数到目前为止的旅行时间(假设时间表被标准化为从t = 0开始)。

因此,节点A的成本为10分钟,而f(t)的成本定义为:

  • t1 = nextScheduledStop(t); //在时间t或之后获得下一个停止时间
  • 基础时间腿= 10 //例如,10分钟旅行
  • return(t1-t)+ baseTime
因此,等待时间动态地包含在每条腿的成本中,并且在公共汽车站之间的步行只是具有恒定时间成本的弧线

使用此表示法,您应该能够直接应用A *或Dijkstra算法

答案 5 :(得分:2)

我想到这个问题的方法是,最终你试图优化从起点到结束点的平均速度。特别是,如果不按自己的方式节省时间,你根本不在乎行走的总距离。因此,解决方案空间的一个基本部分需要确定有效的路线,这些路线可以在开始和结束之间以相对较高的速度覆盖总距离的非平凡部分。

就您的原始点而言,GPS导航单元用于驾车旅行的典型汽车路线算法是目标最佳总时间和最佳路线评估的良好界限。换句话说,基于公交车的旅行将非常适合接近基于汽车的解决方案。显然,基于总线路径的系统将比基于汽车的解决方案具有更多的约束,但是将汽车解决方案作为参考(时间和距离)为总线算法提供了针对*进行优化的框架。所以,放松一下,你想要以迭代的方式将汽车解决方案转变为可能的总线解决方案,或者更可能采取可能的总线解决方案,并根据您的汽车解决方案对其进行评分,以了解您是否“做得好”

使这一点更加具体,对于特定的出发时间,在任何合理的时间段内只能使用有限数量的公共汽车,这可以覆盖总距离的很大一部分。基于直接的汽车分析合理的时间段显着的距离百分比可以使用一些温和的主观指标进行量化。当然,在更绝对的意义上,相对于另一种可能性得分变得更容易。

如果您在解决方案中有一组可能的主要段可用作为可能的答案,那么您需要将它们与其他可能的步行和等待路径连接在一起....或者如果相距太远则递归选择其他短途巴士。直觉上,由于 Constraints Paradox (参见下面的脚注),似乎并没有真正存在一组令人望而却步的选择。即使您不能从那里强制执行所有可能的组合,仍应使用simulated annealing(SA)类型算法优化剩余的组合。 Monte Carlo method将是另一种选择。

我们将问题分解到这一点的方式给我们留下了类似于SA算法如何应用于ASIC芯片,FPGA的自动布局和布线以及印刷电路板的布局和布线的方式。在优化这种问题形式方面有很多published work

*注意:我通常将此称为“约束悖论” - 我的用语。虽然人们可以自然地认为更多的约束问题难以解决,但是约束会减少选择,而选择越少意味着更容易暴力。如果你可以蛮力,那么即使是最佳解决方案也是可用的。

答案 6 :(得分:1)

基本上,图表中的节点不仅应该代表一个位置,而且应该是您可以到达那里的最早时间。您可以将其视为(地点,时间)空间中的图形探索。另外,如果你有(place,t1)和(place,t2)t1&lt; t2,丢弃(地点,t2)。

理论上,这将从您的起始节点获得所有可能目的地的最早到达时间。在实践中,您需要一些启发式修剪道路,使您离目的地太远。

你还需要一些启发式思路来考虑那些有前景的路线 - 如果一条路线远离你的目的地,那么它不太可能(但不是完全不可能)好。

答案 7 :(得分:1)

我认为你的问题比你想象的要复杂得多。最近的COST行动侧重于解决这个问题:http://www.cost.esf.org/domains_actions/tud/Actions/TU1004:“模拟智能交通系统时代的公共交通客流”。

从我的观点来看,常规SPS算法不适用于此。你有动态的网络状态,前进的某些选项是不连续的(路线总是“打开”汽车,自行车,pedestrain,而过境连接只在某个停留时间可用)。

我认为这里需要新的多文化(时间,可靠性,成本,舒适度和更多标准)方法。需要实时计算1)在短时间内向最终用户发布信息2)能够实时调整路径(基于实时交通状况 - 来自ITS)。

我将在未来几个月内考虑这个问题(甚至可能在整个博士论文中)。

此致 拉法尔

答案 8 :(得分:0)

我不认为有任何其他特殊数据结构可以满足这些特定需求,但您仍然可以使用常规数据结构(如链接列表),然后根据给定因素进行路由计算 - 您将需要某种类型的在应用程序中输入影响结果的变量,然后根据输入进行相应的计算。

至于等待和东西,这些是与特定节点相关的因素吗?您可以将此因子转换为连接到节点的每个分支的路由节点。例如,您可以对节点X中的每个分支说,如果在节点X上等待了几分钟,则按比例增加分支的权重 [m /某些基础值* 100]%(仅作为示例)。通过这种方式,您可以统一考虑其他因素,但同时保持您想要解决的问题的简单表示。

答案 9 :(得分:0)

如果我正在解决这个问题,我可能会从带注释的图表开始。图表上的每个节点都代表城市中的每个交叉路口,无论公共交通系统是否在那里停靠 - 这有助于解决行走的需要等。在与交通服务的交叉点上,您使用停止标签对其进行注释 - 标签允许您可以查找停止的服务计划。

然后你可以选择。您需要最好的路线,还是仅仅是路线?您是实时显示路线,还是可以计算和缓存解决方案?

如果你需要“实时”计算,你可能想要使用贪婪的算法,我认为A* algorithm可能很适合这个问题域。

如果您需要最佳解决方案,您应该查看图表的dynamic programming解决方案...最佳解决方案可能需要更长的时间来计算,但您只需要找到一次,然后就可以缓存它们。也许您的A *算法可以使用预先计算的最佳路径来通知其关于“相似”路线的决策。

答案 10 :(得分:0)

可能有效的非常低效的方式是在一天中的每一分钟存储城市中每个十字路口的副本。从Elm St.和2nd到Main St.和25th的巴士路线将表示为,例如

elm_st_and_2nd[12][30].edges :
 elm_st_and_1st[12][35] # 5 minute walk to the next intersection
   time = 5 minutes
   transport = foot
 main_st_and_25th[1][15] # 40 minute bus ride
   time = 40 minutes
   transport = bus
 elm_st_and_1st[12][36] # stay in one place for one minute
   time = 1 minute
   transport = stand still

在此图表上运行您最喜欢的寻路算法,并祈祷实现良好的虚拟内存。

答案 11 :(得分:0)

你自己在回答这个问题。使用A *或Dijkstra算法,您需要做的就是确定每条路线的每个部分的成本。

对于公交路线,你暗示你不想要最短但最快的路线。因此,路线各部分的成本必须包括该部分公交车的平均行驶速度,以及公交车站的等待时间。

然后,找到最合适路线的算法仍然与之前相同。使用A *,所有的魔力都发生在成本函数中......

答案 12 :(得分:0)

你需要以不同的方式对腿部进行加重。例如 - 在下雨天,我认为有人可能更喜欢在车里行驶比在雨中行走更长。此外,一个厌恶步行或无法行走的人可能会做出与不介意行走的人不同/更长的旅行。

这些边缘是成本,但我认为你可以扩展成本的概念/概念,它们可以有不同的相对值。

答案 13 :(得分:0)

算法保持不变,您只需根据不同的场景(总线时间表等)增加每个图形边缘的权重。

我把一个地铁路线查找器放在一起作为图形路径的练习:

http://gfilter.net/code/pathfinderDemo.aspx