使用Dijkstra算法实现时间表

时间:2012-02-22 11:44:04

标签: c# asp.net-mvc entity-framework-4 dijkstra

我正在尝试实施一个阅读教练时间表来计划旅程的系统。

这是我的情景:
我想输入一个旅行日期,一个起始站和一个终点站,但要从A到B,可能会有3到4个连接旅程,我想返回几个选项,按总数排序所需时间。我的数据库设置有一个车站表,一个旅程表和一个旅程实例表(即包含旅程的包含日期)。

我在Dijkstra算法的c#中得到了很好的实现,但是我发现它有限,因为我无法弄清楚如何在公交车站等待连接旅程的时间,以及许多旅程可以来自的事实在不同的时间,一个站到另一个站增加了混乱。我还必须考虑到旅程需要一天甚至两天才能完成,这已经证明很麻烦。 Dijkstra在这里值得坚持,还是有人知道其他可能更合适的东西?

我正在使用asp.net MVC3,C#和EF4,但这并不是我在这之后的代码 - 更多只是在我最好使用的过程的正确方向上的一点,因为这很好超越我以前做过的任何事情。 (当我自愿参加这个项目的时候,我可能会有点咀嚼!)如果有人可以提供一些建议,或者链接到一些可以帮助解决这种情况的文档,那将会有很大帮助。感谢

2 个答案:

答案 0 :(得分:2)

首先:对于一个雄心勃勃的项目志愿服务,你很擅长。其次:这可能有点挑战性,并从下面链接的另一个StackOverflow帖子判断: NP-Complete

Dijkstra算法在静态图上找到单源最短路径,但这不是你在这个问题上所做的。由于这样的图中的顶点可能存在于重叠的时空中,因此从 1 2 的最快总线可能会在中午12:00离开,但最快的总线从 2 3 可能会在当天上午1​​1:59离开。那是一个非首发。

显然,你已经考虑过这个,但是一个看待问题的抽象方式是你不是试图在图中找到最短路径,而是试图找到最短的路径。有效的三维空间(时间作为第三维)。假设您根据时间在拓扑上对节点进行排序,那么蛮力方法(对于小图表来说仍然很好)可以实现为广度优先搜索。

相关链接在这里:Bus public transport algorithm

关于这个主题的一些阅读:

愿部队与你同在。

答案 1 :(得分:0)

确实可以修改Dijkstra以找到从车站A到车站B的最快路线,同时还要考虑出发时间和在中间车站等待的时间。 正如其他答案所说的那样,它不是NP完全的。在下面,我将假设公交时刻表是周期性的(即无限期地重复),但实际上就足够了,对于一天中的每个时间,每个公共汽车站以及前往该公共汽车站的每条线路(旅程),都迅速找到下一个出发点(旅程实例)。

我们将问题建模为有向多重图:公交车站是我的图的顶点,而图中的边是通过某个公交线路从一个巴士站到另一个巴士站的行程。边缘在形式上是元组(u_a, u_b, id, f, w, r),其中

  • u是源顶点
  • v是目标顶点
  • id是旅程ID(需要检索实际解决方案-留作练习)
  • f是第一个出发时间
  • w是旅行时间
  • r是重复间隔(我们假设f

对于每个顶点,我们将像正常的Dijkstra一样,至少维护两个值:首先,我们将记住是否已经处理了该顶点。其次,我们将维持该位置目前已知的最早到达时间,包括有关哪个边缘是用于获取此潜在到达时间的最后一条边缘的信息。对于起点,最早的到达时间最初是期望的出发时间,对于所有其他顶点,初始到达时间是无穷大。

然后,Dijkstra可以照常进行:贪婪地选择到达时间最早的未处理顶点,例如说到达时间u的顶点t。然后处理此顶点:对于每个边缘,计算可能到达目标顶点v的最早时间:t' = t + ((r + f - (t % r)) % r) + w(考虑一下;如果f >= (t % r),则{ {1}}是等待时间。如果f - (t % r)小于或等于t'已知的到达时间,请将v的到达时间设置为v并将此边沿添加到可能的源集合中边缘以获得此到达时间(如果严格缩短,请先删除所有其他时间)。

在此处进行实践尝试:https://open.kattis.com/problems/shortestpath2