繁体   English   中英

Dijkstra的算法和贪婪策略

[英]Dijkstra's Algorithm and the greedy strategy

在理解贪心策略的工作原理以及Dijkstra的算法如何跟踪最短路径时,我似乎有些麻烦。 供参考,这是Dijkstra算法的伪代码

DijkstrasAlgorithm(G, w, s)
    InitalizeSingleSource(G, s)
    S = 0
    Q = G.V
    while Q != 0
        u = ExtractMin(Q)
        S = S∪{u}
        for each vertex v ∈ G.Adj[u]
            Relax(u, v, w)

请考虑以下重量方向图。

有5个顶点:s,t,x,y,z有10个边:

s->t = 3
s->y = 5
t->y = 2
t->x = 6
y->t = 1
y->x = 4
y->z = 6
x->z = 2
z->x = 7
z->s = 3

我们的目标是找到从s到x的最短路径。 我的答案是s-> t-> y-> x,长度为9,我假设伪代码中的“ S”是最短路径,并且将minQ中的每个ExtractMin添加到了路径上。

但是我的老师告诉我,这是错误的。 正确答案是长度为9的s-> t-> x。我们答案的区别在于是否包含y。 我的老师说,由于s-> t-> x是“先找到”的,因此不会更新为等长的s-> t-> y-> x。

这使我感到困惑。 Dijkstra的算法使用贪婪策略,我认为贪婪策略总是选择当时可用的最短路径。 当选择在t-> y和t-> x之间时,t-> y较短,因此应该选择。

我的问题是:

1)在什么情况下,贪婪策略不会选择最终结果的最短路径?

2)如果在minQ上使用ExtractMin不是我们如何跟踪从s到x的整体路径,那么我们如何跟踪完整的路径?

您老师的回答假设我们按“最短优先,先中断先发现”的顺序探索路径。

首先我们探讨s->t我们把x成本9从s->t->x上的事情的清单,探讨“有一天”。 但是我们首先探索s->t->y因为它更短。 到那时,我们看到s->t->y->x是一个选项,也是成本9。但是,由于这不是改进,因此我们放弃了它。

因此,一旦到达长度为9的路径,我们就会发现s->t->x ,因为它首先进入了队列。

如果您修改了“ Relax以保存可能的路径,且其效果优于或等于迄今为止找到的最佳路径,那么您将得到答案。 这将得到正确的答案。

至于从末端提取路径的方式,每个节点都知道如何到达路径。 因此,从头开始,并按照Cookie跟踪向后查找反向路径,然后将其反向以获得实际路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM