J'essaie de comprendre pourquoi l'algorithme de Dijkstra ne fonctionne pas avec des poids négatifs. En lisant un exemple sur Les chemins les plus courts J'essaie de comprendre le scénario suivant :
2
A-------B
\ /
3 \ / -2
\ /
C
Extrait du site web :
En supposant que les arêtes sont toutes dirigées de gauche à droite. avec A, l'algorithme de Dijkstra choisira l'arête (A,x) minimisant d(A,A)+longueur(bord), à savoir (A,B). Il définit ensuite d(A,B)=2 et choisit un autre bord (y,C) minimisant d(A,y)+d(y,C) ; le seul choix est (A,C). et il fixe d(A,C)=3. Mais elle ne trouve jamais le plus court chemin de A à B, via C, avec une longueur totale de 1.
Je ne comprends pas pourquoi, en utilisant l'implémentation suivante de Dijkstra, d[B] ne sera pas mis à jour en 1
(Lorsque l'algorithme atteint le sommet C, il exécute un relax sur B, voit que le d[B] est égal à 2
et donc de mettre à jour sa valeur à 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)
}
Gracias,
Meir
0 votes
La recherche de chemin en général avec des poids de bord négatifs est extrêmement difficile. Quel que soit le chemin que vous trouvez, il y a toujours la possibilité d'un chemin arbitrairement long avec un poids négatif arbitrairement grand quelque part le long du chemin. Je ne serais pas surpris qu'il s'agisse d'un NP complet.
4 votes
Pour tous ceux qui ont ce doute, vous pouvez trouver le chemin le plus court dans un graphe DONNÉ qu'il n'a pas de cycles de poids négatifs. L'algorithme ci-dessus fonctionnerait si la fonction Relax renvoyait une valeur "true" lorsque la relaxation est effectivement réussie, auquel cas, le sommet adjacent "v" serait mis en file d'attente dans la file prioritaire s'il n'est pas présent, ou mis à jour s'il est déjà présent. Cela signifie que les nœuds visités peuvent à nouveau être ajoutés à la file d'attente prioritaire au fur et à mesure qu'ils sont relaxés.