Poids négatifs : ajouter une constante ne sauve rien
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 19 — Parcours de graphes et plus courts chemins
Énoncé
Sur le contre-exemple du chapitre — arcs (2), (5), (), (1) —, on propose d'ajouter à tous les poids pour les rendre positifs, puis d'appliquer Dijkstra. Cela marche-t-il ?
Corrigé
Non, et il faut comprendre pourquoi, car l'idée revient souvent.
Les vraies distances, calculées par un algorithme qui supporte les poids négatifs : . Dijkstra rend — juste partout sauf en , où il rend au lieu de .
Après le décalage , tous les poids sont positifs et Dijkstra est applicable. Il rend . Retranchons le décalage : le chemin retenu vers est , de coût décalé , soit dans le graphe d'origine. Toujours faux.
La raison, et elle est structurelle. Le décalage n'ajoute pas la même chose à tous les chemins : il ajoute par arc. Comparons les deux chemins de à :
| Chemin | arcs | coût réel | coût décalé |
|---|---|---|---|
Le chemin optimal a trois arcs, l'autre en a deux : le décalage pénalise le premier de et le second de . Il inverse donc l'ordre. Le décalage préserve l'ordre des chemins de même longueur en nombre d'arcs, et lui seul — ce qui ne sert à rien, puisque c'est justement entre chemins de longueurs différentes qu'il faut trancher.
Ce qui marche, et ce n'est pas un décalage constant. Il existe un repondérage correct, dû à Johnson : on choisit un potentiel par sommet et l'on remplace par . Les termes se télescopent le long d'un chemin de à : le coût devient , le même décalage pour tous les chemins de à , quelle que soit leur longueur. L'ordre est donc préservé. Il reste à trouver tel que les nouveaux poids soient positifs — et l'on prend distance depuis un sommet fictif relié à tous, calculée par... un algorithme supportant les poids négatifs. Le problème suivant en donne un.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.