Negatif ağırlıkları'In Dijkstra Algoritması kullanarak
Dijkstra'nın algoritması negatif ağırlıkları ile çalışmaz neden anlamaya çalışıyorum. Shortest Paths, ben bir örnek okuma aşağıdaki senaryoyu anlamaya çalışıyorum:
2
A-------B
\ /
3 \ / -2
\ /
C
Web sitesi: gelen
Kenarları varsayarsak Eğer başlarsak sağdan sola doğru yönlendirilmiş, Bir ile, dijkstra'nın algoritması kenar (A,x) minimize seçecek (A,A) d uzunluğu(edge), yani (A,B). O zaman d(A,B) ayarlar=2 ve seçer başka bir kenar (C y) (A,y) d(C y); sadece seçim minimize (A,C) ve d(A,C)=3 ayarlar. Ama hiç Bir yerden en kısa yolu bulur Toplam uzunluğu 1 ile B, C),.
Ben anlamıyorum neden kullanarak aşağıdaki uygulama Dijkstra, d[B] olmayacak güncelleme için 1
(algoritma ulaştığı tepe noktası C, çalıştırılacak bir dinlenebilir B, d[B] eşittir 2
ve bu yüzden güncelleme değerine 1
).
Dijkstra(G, w, s) {
Initialize-Single-Source(G, s)
S ← Ø
Q ← V[G]//priority queue by d[v]
while Q ≠ Ø do
u ← Extract-Min(Q)
S ← S U {u}
for each vertex v in Adj[u] do
Relax(u, v)
}
Initialize-Single-Source(G, s) {
for each vertex v V(G)
d[v] ← ∞
π[v] ← NIL
d[s] ← 0
}
Relax(u, v) {
//update only if we found a strictly shortest path
if d[v] > d[u] w(u,v)
d[v] ← d[u] w(u,v)
π[v] ← u
Update(Q, v)
}
Teşekkürler
Meir
CEVAP
Aradığınız algoritma gerçekten bu grafikte en kısa yolu bulur, ama genel olarak tüm grafikler. Örneğin, bu grafik göz önünde bulundurun:
Kenarları için örnek bir sağ yönetti sanacak
Algoritma aşağıdaki gibi çalışır
- İlk,
zero
infinity
diğer mesafeler içind(A)
ayarlayın. - Sonra düğüm
A
, 12*,* 13 **d(B)
ayarı99
** 14d(D)
genişletin. - Sonra, hiçbir net değişiklik
C
, genişletin. - O zaman seni etkilemez
B
genişletin. - Son olarak, genişletmek
-201
20 *değiştirenD
,.
d(C)
0
, Bu sonunda o yine de dikkat edinC
için en kısa yol olsa da uzunluğu -200
vardır.Senin algoritma böylece doğru bazı durumlarda mesafeleri hesaplamak için başarısız olur. Ayrıca, öyle olsan bile saklamak için geri işaretçiler diyerek nasıl her düğüme başlangıç düğümü A
... son alarak yanlış yol geri C
A
.
Rastgele ve OrderBy kullanarak iyi bir...
Nasıl en yakın komşu algoritması kulla...
Negatif eşleme kullanarak grep (içerme...
Neden Dijkstra'In algoritması kul...
Kullanmak neden'in eğer Genişlik ...