Python 当组合权重小于节点权重时,放入队列的原因是什么?

Python 当组合权重小于节点权重时,放入队列的原因是什么?,python,algorithm,dijkstra,Python,Algorithm,Dijkstra,正如您看到的代码,首先,在检查边缘顶点是否未被访问但它是错误的之后,我将边缘顶点堆入队列。 为了得到正确的答案,如果组合值小于顶点权重,我必须在检查值后进行叠加。 为什么呢 for edge in current.edge_list: if edge.to_vertex.is_not_visited(): ## I first appended the to_vertex to the queue, but it does not work

正如您看到的代码,首先,在检查边缘顶点是否未被访问但它是错误的之后,我将边缘顶点堆入队列。 为了得到正确的答案,如果组合值小于顶点权重,我必须在检查值后进行叠加。 为什么呢

 for edge in current.edge_list:
            if edge.to_vertex.is_not_visited():
         ## I first appended the to_vertex to the queue, but it does not work
                total_weight = current_weight + edge.weight
                if total_weight < edge.to_vertex.key:
                    heapq.heappush(queue, edge.to_vertex)
                    edge.to_vertex.key = total_weight
                    edge.to_vertex.parent = current
                    current.visited = True

我假设您已经在顶点类中定义了_ult_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。将距离信息存储为属性可能会在更改顶点的关键点属性值时破坏最小堆不变量。在你的代码片段中,我没有看到任何重建不变量的东西

说明:虽然to_顶点在min堆中的位置与之前相同,但您可能已将其关键点更改为小于其父项或大于其任何子项。当您将检查“总权重 建议:改为使用最小元组堆

以下内容还可能有助于修复代码中的其他一些问题:

当heapq.heappopqueue返回current时,首先必须检查它是否已被访问。如果未访问,则将其标记为已访问,即current.visited=True,然后迭代输出边,即current.edge_列表中的边:。。。。我们检查current是否已被访问,因为队列中可能有多个该顶点的条目

每当总重量 考虑代码中语句heapq.heappushqueue、edge.to_vertex和edge.to_vertex.key=总权重的顺序。在更新其权重之前,您正在将to_顶点推入队列。如上所述,如果使用最小元组堆,这个问题就会消失


也许这意味着你找到了较短的路由,以后检查这个路由是很好的。不确定我是否理解正确,你最初在注释的某个位置有heappush,除了heappush ofc之外的其他代码都是完全相同的?它现在还能工作吗?当您找到任何成本低于初始成本的路径时,您会将节点标记为已访问。我猜您会将其设置为INF,因此基本上,每次您找到任何路径时,都会发生这种情况,不一定是最短的路径。只有当从堆中获取节点时,才应该标记该节点,这样才能确保找到最短路径。代码的其余部分还可以,heappush的位置应该没有任何区别,除了使用的内存。该代码工作异常,并通过一些在线判断。我只是想知道我不确定的事情。谢谢你们。