具有时间表和不同缺失边的Dijkstra算法

时间:2018-02-28 14:30:47

标签: python python-3.x algorithm dijkstra

我知道Dijkstra的算法是最短路径的流行解决方案"问题,但是在实施时间表时似乎是适得其反。

假设我的图表具有以下权重(从一个点到另一个点的时间):

A-----C     A->C: 10
\--B--/     A->B: 5
            B->C: 5

如果你将它扔进Dijkstra,它将返回路线A-> C。在你提到说明路线A-> C的时间表只存在于某个时间范围内之前,这很好。如果请求的时间范围超出使用该边缘的范围,则可以轻松移除A-> C边缘。但显然我正在使用的数据集还有很多其他方法可以从A-> C获得更高的成本。更不用说如果你想从Z-> Y获得什么,这需要从中间的A-> C开始。它似乎不是一个理想的解决方案。

除了Dijkstra之外,还有更好的方法来创建一条最短的路径,同时还要考虑时间表吗?或者是否应该修改算法以在找到最佳路径时考虑两个权重?

如果重要,我使用python。

[编辑]

时间表是一张基本表格,表示火车(在我的情况下)从A点离开(比方说)12:00,然后从B站12点05分离开,然后在12点10分从C出发。当它没有停在B时,它的列是空的,A将是08:00而C将是08:10

A       B        C
800            8:10
12:00  12:05  12:10 

1 个答案:

答案 0 :(得分:0)

一种方法是创建一组树,表示给定节点之间的所有简单路径,只选择那些不包含不推荐边缘的最短路径。您可以通过调整Dijkstra的算法或其他算法(如DFS或BFS)来查找所有路径。同时查找两个节点之间的所有路径都被认为是一个难题,但根据您的需要和您正在处理的图形类型,您可以创建所需的图形。你也可以阅读这篇关于此事的帖子。 - > Find all paths between two graph nodes。即你可以拥有一组有限的路径(如果使用Dijkstra前N个最短路径)。

现在优化此步骤,以便找出是否弃用了边缘我建议将所有边缘ID或名称的字典作为键,将其弃用时间戳作为值,然后通过将值与{{进行比较来过滤字典1}}并在每次查找之后只删除字典中的项目。另请注意,在开始过滤之前,应检查边缘是否存在于字典中(为了防止算法对重复边缘多次运行过滤)。

代码应该如下:

now().timestamp()

路径验证如下:

def filter_edge(u_id):
    if edge in deprecation:
        time_stamp = deprecation[u_id]
        if time_stamp > datetime.now().timestamp():
            return True
    return False