Dijkstra的奇怪行为';python中的s alghoritm

Dijkstra的奇怪行为';python中的s alghoritm,python,graph,dijkstra,Python,Graph,Dijkstra,我正在尝试用python实现dijkstra的alghoritm。我想知道从节点“你”到所有其他节点的长度 def Dijkstr(): listOfProcessingNodes = listOfNodes for i in listOfNodes: if i.name == "You": i.lastNode = None i.length = 0 i.resolved = True

我正在尝试用python实现dijkstra的alghoritm。我想知道从节点“你”到所有其他节点的长度

def Dijkstr():
    listOfProcessingNodes = listOfNodes
    for i in listOfNodes:
        if i.name == "You":
            i.lastNode = None
            i.length = 0
            i.resolved = True
            lastProcessNode = i

    listOfProcessingNodes.sort(key=lambda x: x.length, reverse=True)

    while len(listOfProcessingNodes):
        processNode = listOfProcessingNodes.pop()
        for i in processNode.adjencyList:
            for k in listOfEdges:
                if (k.inNode == i.name and k.outNode == processNode.name and i.resolved == False) or (k.inNode == processNode.name and k.outNode == i.name and i.resolved == False):
                    i.length = processNode.length + int(float(k.cost))
                    i.lastNode = processNode
                    i.resolved = True
        listOfProcessingNodes.sort(key=lambda x: x.length, reverse=True)
        lastProcessNode = processNode
        print processNode.name,":", processNode.length
以下是节点和边类的定义:

class Node():
    def __init__(self, name):
        self.name=name
        self.adjencyList=[]
        self.resolved = False
        self.lastNode = None
        self.length = float("inf")

class Edge():
    def __init__(self, inNode, outNode, cost):
        self.inNode=inNode
        self.outNode=outNode
        self.cost=cost
供我输入

You - A: 3
You - B: 2
A - C: 4
A - D: 4
B - D: 1
B - E: 2
C - F: 1
D - F: 2
D - G: 4
E - G: 2
F - G: 2
我得到这个输出

You : 0
B : 2
A : 3
D : 3
E : 4
F : 5
C : 7
G : 7
而不是

You : 0
B : 2
A : 3
D : 3
E : 4
F : 5
C : 6
G : 6

我真的很困惑,如果它对所有节点都不起作用,那么我会出错,但如果它对最后两个节点不起作用呢?感谢您的帮助

看来您对Dijkstra算法的一个关键部分有误解

随着算法的进行,如果算法发现到该节点的路由比以前发现的路由“便宜”,则该节点的“长度”(即来自“您”节点的最小总“成本”)可能会减少。您的代码假设一旦节点被访问一次,其长度就固定了。这是不正确的

您的图表中包含了一种发生这种情况的情况。当访问长度为3的节点D时,则F的长度为5,G的长度为7。但是,当访问长度为4的节点E时,需要将G的长度减少到6,因为E的长度为4,从E到G的边的成本为2

检查
processNode
的长度加上边缘
k
的成本是否小于节点
i
的当前已知长度,而不是筛选出
resolved
设置为
True
的任何节点。如果是这样,您已经为节点
i
找到了一个新的较低长度,因此您应该更新节点
i
及其以前节点的长度


顺便说一句,节点C的长度应该是7,而不是您声称的6。

由于您的代码不完整,恐怕我们很难为您提供帮助。请编辑您的代码以包含节点和边缘类的定义,并添加用于创建示例输入的代码。您好,我添加了类的定义,但创建输入的代码非常复杂,但我确信它工作正常。
listOfNodes
在何处以及如何定义?它可能应该是一个函数参数。