python - 如何使 Dijkstra 算法报告最短路线的完整最终距离

标签 python python-3.x

我对 python 比较陌生,一直在互联网上阅读有关实现 Dijkstra 算法的方法,并且我遇到了本页 here 下面提供的代码。 .

该代码是 Dijkstra 算法的实现,并且运行得非常好。参见下面的代码:

from collections import namedtuple, deque
from pprint import pprint as pp


inf = float('inf')
Edge = namedtuple('Edge', ['start', 'end', 'cost'])

class Graph():
    def __init__(self, edges):
        self.edges = [Edge(*edge) for edge in edges]
        # print(dir(self.edges[0]))
        self.vertices = {e.start for e in self.edges} | {e.end for e in self.edges}

    def dijkstra(self, source, dest):
        assert source in self.vertices
        dist = {vertex: inf for vertex in self.vertices}
        previous = {vertex: None for vertex in self.vertices}
        dist[source] = 0
        q = self.vertices.copy()
        neighbours = {vertex: set() for vertex in self.vertices}
        for start, end, cost in self.edges:
        neighbours[start].add((end, cost))
        #pp(neighbours)

        while q:
            # pp(q)
            u = min(q, key=lambda vertex: dist[vertex])
            q.remove(u)
            if dist[u] == inf or u == dest:
                break
            for v, cost in neighbours[u]:
                alt = dist[u] + cost
                if alt < dist[v]:                                  # Relax (u,v,a)
                dist[v] = alt
                previous[v] = u
        #pp(previous)
        s, u = deque(), dest
        while previous[u]:
            s.appendleft(u)
            u = previous[u]
        s.appendleft(u)
        return s

这是提供的测试数据:

graph = Graph([("a", "b", 7),  ("a", "c", 9),  ("a", "f", 14), ("b", "c", 10),
           ("b", "d", 15), ("c", "d", 11), ("c", "f", 2),  ("d", "e", 6),
           ("e", "f", 9)])

要针对特定​​的两个点运行它,请说“a”到“e”:

pp(graph.dijkstra("a", "e"))

输出如下:

deque(['a', 'c', 'd', 'e'])

我的问题是,如何让该算法报告该最短路线的完整最终距离。即期望的输出看起来像这样:

deque(['FullDistance', 'a', 'c', 'd', 'e'])

我一直在尝试将“dist”添加到函数“Dijkstra”末尾的附加中,但似乎不起作用,我没有得到任何不同的结果:

s.appendleft(dist)

这可能是一些简单的需要调整的地方,但我似乎无法弄清楚,非常感谢任何帮助。

谢谢。

最佳答案

我认为你需要添加 alt 而不是 dist。

在函数末尾尝试这个

s.appendleft(alt)

关于python - 如何使 Dijkstra 算法报告最短路线的完整最终距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58486279/

相关文章:

python - Tensorflow:我的准确性出现问题

python - 如何找到Python程序的开头文件?

python - yield 与返回的不同结果

python - OpenCV Python中的手势

regex - 如何使用python脚本在linux中压缩多个文件?

python - 列上的十分位数 Pandas DataFrame

python - 使用 netcdf 创建向量到数组中

python - Numpy 优化 reshape : 2D array to 3D

python-3.x - 关于 lambda 函数的 Sagemaker SDK

python - 为变量分配范围