2011-11-18 57 views
4

[尚未:E用户正在要求该再次在Development of railway enquiry system, how to model Trains, Stations and Stops?] 我的问题描述:如何制作一个简单的公交路线搜索引擎?

假设我有一个BUS-123在ROUTE-1它将通过A,B,C,d行进, E,F,G,H和ROUTE-2中的BUS-321到D,E,F,X,Y,Z。 如果有人输入B作为源点,F作为目标点,则带有BUS-123的ROUTE-1应显示在结果中。但是,如果有人输入H作为来源,并且A不能显示目的地结果,因为返回的信息可能与旅行的信息不一致。 但是,如果一个人用ROUTE-1BUS-321进入A作为源和Z作为目的地然后BUS-123 ROUTE-2应显示。我的问题是: 如何在数据库中存储该路线信息?如果我存储在RDBMS中,如下所示

BUS_NUMBER ROUTE_NUMBER VIA_ROUTES 
BUS-123  ROUTE-1   A, B, C, D, E, F, G, H 
BUS-321  ROUTE-2   D, E, F, X, Y, Z 

然后我的搜索将如何工作。我的意思是如何在字符串中搜索它。 如果我将所有VIA_ROUTES存储在不同的列中,那么它将如何?请用你自己的技术给我建议。这不是紧急的,但我打算做一个基本的巴士路线搜索,所以你的评论与帮助表示赞赏。

+1

我不认为有一个“简单”的答案。 –

+4

你不应该做你的自己的功课吗? – troelskn

+1

这不是我的功课。 – san

回答

4

我会将它建模为循环图。每个巴士站由顶点表示。两个站点之间的每个直接连接用标有路由号码的边表示;因此,每条路线都是一系列相连的边缘。也指示边缘。并非所有从A站到B站的路线都必须从B站到另一个站的A站。

可能希望用估计的行程时间来填充每条边,该行的方差的度量(或度量) - 周日晚上2点,方差可能很低,但在周五晚上的5点,它可能非常高,以及出发时间的列表。

那么它图的遍历,并找到了“最低成本”路线的问题,但是你选择定义“最低成本” - 你的因素可能要考虑将包括:

  • 总行程时间
  • 等待下一段行程花费的总时间。
  • 等待时间在任何个别站点。
  • 距离?

需要注意的是,太多的等待时间是不好的(在1月份的时候花费40分钟等待一辆公共汽车,当它是-10°F?)。由于它们对当地交通状况的波动具有高度响应性,因为它增加了错过连接的可能性,因此太少也不好,因为公交车的时间表往往具有相当大的变化性。

这就是我会这样做的。

虽然我不相信我会尝试直接在SQL中解决它。

虽然这个模型非常适合SQL。你需要以下实体,然后一些,因为你需要代表时间表等。:

  • 停止。一个巴士站。图的顶点。
  • 路线。公交路线。
  • 。两站之间的直接联系。图的边缘。
  • RouteSegment。表示构成路线的有序段段序列的关联实体。
+0

你比dijkestra更喜欢DFS吗?你是指什么样的图遍历? – Bytemain

+0

感谢您的建议,我已仔细阅读,并会根据当前表格进行调整。你的建议很好,而我只考虑很少的实体。也为你喝彩。 – san

+0

提及旅途费用+1。我宁愿采取一次需要30分钟的旅程,即使两条连接的路线总共需要25分钟,尤其是如果外面很冷的话:) – halfer

0

我认为bus_numbers并不重要,因为您可以稍后查看它们。也许你需要的是用一个大矩阵中的bus_stops创建一个2d矩阵,然后使用像dijkstra这样的图形遍历算法找到从A到B的最短路径。当你得到这个时,你可以很容易地查找bus_numbers和展示给客户。因此我认为你的数据库已经非常好了。

+0

感谢您的快速回复,是的,你的回答很有帮助,我会试着找出一个解决方案,用2d矩阵和dijkstra类的东西。 – san

0

我会有一个route表和route_part表。后者将包含对路线的引用,以及用于排序的序号以及对stop表的引用。因此,您可以存储任何路线。

在搜索方面,如果您想搜索两站之间的路线,您可以在route_part表中查找两站,并查看它们在任何情况下是否出现在同一路线上(记住路线可能存在于一个方向而不是另一个方向)。

+0

寻找相同的路线不像计算最短路径。 – Bytemain

+0

非常感谢您的建议... – san

+0

@ user1054582 - 没有probs。然而,我没有发现你的要求,但是把路线连接在一起,所以根据David的回答,某种网络遍历算法是必要的。 – halfer