簡體   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