web-dev-qa-db-fra.com

Pourquoi l'algorithme de Dijkstra ne fonctionne-t-il pas pour les fronts de poids négatifs?

Quelqu'un peut-il me dire pourquoi l'algorithme de Dijkstra pour le chemin le plus court à source unique suppose que les bords doivent être non négatifs. 

Je parle seulement des bords, pas des cycles de poids négatifs.

97
Madu

Rappelez-vous que dans l'algorithme de Dijkstra, une fois qu'un sommet est marqué comme "fermé" (et sortant de l'ensemble ouvert) - l'algorithme a trouvé le chemin le plus court, et ne devra plus jamais développer ce nœud - il suppose chemin développé à ce chemin est le plus court.

Mais avec des poids négatifs - cela pourrait ne pas être vrai. Par exemple:

       A
      / \
     /   \
    /     \
   5       2
  /         \
  B--(-10)-->C

V={A,B,C} ; E = {(A,C,2), (A,B,5), (B,C,-10)}

Dijkstra de A développera d'abord C et ne trouvera pas plus tard A->B->C


ÉDITER une explication un peu plus profonde:

Notez que cela est important, car à chaque étape de relaxation, l'algorithme suppose que le "coût" pour les nœuds "fermés" est en effet minimal, et que le nœud qui sera ensuite sélectionné est également minimal.

L'idée est la suivante: si nous avons un sommet ouvert dont le coût est minime - en ajoutant n'importe quel nombre positif} à un sommet - la minimalité ne changera jamais .
Sans la contrainte sur les nombres positifs - l'hypothèse ci-dessus n'est pas vraie.

Puisque nous "connaissons" chaque sommet qui était "fermé", il est minime - nous pouvons effectuer l'étape de relaxation en toute sécurité - sans "regarder en arrière". Si nous avons besoin de "regarder en arrière" - Bellman-Ford propose une solution de type récursif (DP).

139
amit

L'algorithme de Dijkstra suppose que les chemins peuvent seulement devenir "plus lourds". Ainsi, si vous avez un chemin de A à B avec un poids de 3 et un chemin de A à C avec un poids de 3, vous ne pouvez pas ajouter un aller de A à B à C avec un poids inférieur à 3.

Cette hypothèse rend l'algorithme plus rapide que les algorithmes qui doivent prendre en compte les poids négatifs.

18
zmbq

Correction de l'algorithme de Dijkstra:

Nous avons 2 ensembles de sommets à chaque étape de l'algorithme. L'ensemble A comprend les sommets auxquels nous avons calculé les chemins les plus courts. L'ensemble B comprend les sommets restants.

Hypothèse inductive : À chaque étape, nous supposerons que toutes les itérations précédentes sont correctes.

Pas inductif : Lorsque nous ajoutons un sommet V à l'ensemble A et que nous définissons la distance à dist [V], nous devons prouver que cette distance est optimale. Si cela n’est pas optimal, il doit exister un autre chemin plus court vers le sommet V.

Supposons qu'un autre chemin passe par un sommet X.

Maintenant, puisque dist [V] <= dist [X], tout autre chemin menant à V aura au moins une longueur dist [V], sauf si le graphique a des longueurs d'arête négatives. 

Ainsi, pour que l'algorithme de dijkstra fonctionne, les pondérations Edge doivent être non négatives.

5
Nikunj Banka

Essayez l'algorithme de Dijkstra sur le graphique suivant, en supposant que A est le noeud source, pour voir ce qui se passe:

Graph

3
tb-

Rappelez-vous que dans l'algorithme de Dijkstra, une fois qu'un sommet est marqué comme "fermé" (et hors de l'ensemble ouvert) - il suppose que tout nœud qui en résulte conduira à une plus grande distance donc, l'algorithme a trouvé le chemin le plus court et ne devra plus jamais développer ce nœud, mais cela n’est pas vrai en cas de pondération négative.

1
vineet