如何解决修改了 Dijkstra 的算法 - 在边上迭代?
我一直在考虑修改 Dijkstra 算法,以消除松弛步骤的需要。我可以得到人们的意见或为什么这行不通的原因吗?我的实现以边缘优先队列而不是节点为中心。这是我的实现的描述:
我们有一个带有 Graph
和 Node
子类的定向 Edge
类。
Edges
有一个“权重”、一个“开始”节点和一个“结束”节点。
Nodes
有一个“dist”值(更新为到达它们的最佳距离),
以及“bestPath”值(更新为到达它们的最佳路径),
最后是“边”列表。
Dikstra (Node origin,Node goal):
Set settledNodes = {}
origin.dist = 0
settledNodes.add(origin)
Comparator<Edge,Edge> comparator = (edge1,edge2) ->
compareDoubles(edge1.weight + edge1.start.dist,edge2.weight + edge2.start.dist)
PriorityQueue<Edge> queue = new PriorityQueue<>(comparator)
queue.addAll(origin.edges)
while (!queue.Empty || settledNodes.size < Graph.size):
currEdge = queue.pop()
if (!settledNodes.contains(currEdge.end)):
currEdge.end.bestPath = currEdge
if (currEdge.end == goal):
return
currEdge.end.dist = currEdge.weight + currEdge.start.dist
queue.add(currEdge.end.edges)
settledNodes.add(currEdge.end)
算法完成后,每个节点都将填充其“bestPath”字段,其中包含到达该节点的最佳边。可以回溯这些边以重新创建整个路径。
我意识到我的伪代码是 python 和 java 的邪恶合并 - 抱歉。
这里的方法围绕迭代边缘的优先级队列而不是节点的列表/优先级队列。人们怎么看?据我所知它仍然是最佳的,在我看来这个算法在某些方面更好。例如,它不一定遍历它遇到的节点的所有边(与 Dijkstra 不同)。它通过将长边扔到优先级队列的底部来忽略长边,并且它可能会在不处理此类节点的情况下找到最佳路线,从而节省一些(或许多!)迭代。
我对这个算法感到非常兴奋,但我在网上的任何地方都找不到这样的东西,这让我觉得我忽略了一些深刻的缺陷。我很想听听人们的反馈。
解决方法
您建议在 line graph 上运行 Dijkstra。我相信这会奏效;但是请注意,Dijkstra 的渐近运行时间为 O((|E| + |V|) log|V|)。通过使用折线图,您实际上是在那里交换了 E 和 V,从而使运行时间变得更糟。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。