Algorithmiqe I Année - A. Benoit, B. Depardon JF. Pinea, C. Reo TD n o - Recherche de pls corts chemins L'algorithme de Bellman-Ford L'algorithme de Bellman-Ford résot le problème des pls corts chemins aec origine niqe dans le cas le pls général où les poids des arcs peent aoir des alers négaties. Étant donné n graphe orienté pondéré G = (V, E), de fonction de poids w, et ne origine s, l'algorithme retorne ne aler booléenne indiqant s'il eiste n circit de poids négatif accessible depis s. S'il n'en eiste pas, l'algorithme donne les pls corts chemins ainsi qe lers poids. Les notations sont les siantes : π[] contient le prédécesser de sr le chemin (NIL s'il n' en a pas), δ(, ) est le poids d pls cort chemin de ers ( s'il n'eiste pas), d[] est ne ariable qi est ne borne spériere d poids d pls cort chemin de s ers (cf. qestion ). On dénit le poids d'n chemin p =,,..., k, est w(p) = k i= w( i, i ). Algorithme Bellman-Ford(G, w, s) : por tot sommet V faire // Initialisation : d[], π[] NIL : d[s] : por i de à V faire : por tot arc (, ) E faire // relâchement de l'arc (, ) : si d[] > d[] + w(, ) alors : d[] d[] + w(, ), π[] : por tot arc (, ) E faire // détection des circits négatifs : si d[] > d[] + w(, ) alors : retorner Fa : retorner Vrai Qestion. On considère le graphe ci-dessos. Faire torner l'algorithme en prenant comme sorce le sommet. Même qestion en changeant le poids de l'arc (, ) à. - - - Soltion : Eemple lorsqe l'algorithme torne en considérant les arcs dans l'ordre siant : (, ), (, ), (, ), (, ), (, ), (, ), (, ), (, ), (, ), (, ) Aec w(, ) = : l'algorithme renoie fa à case d'n circit de poids négatif entre les sommets et.
- - - - - - - - - - - - - - - - Fig. : Bellman-Ford, renoie rai, les pls corts chemins sont en blancs - - - - - - - - - - - - - - - - Fig. : Bellman-Ford, renoie fa à case d'n circit de poids négatif
Qestion. Qelle est la compleité de cet algorithme? Soltion : La phase d'initialisation s'eécte en O(V ), la phase de relâchement en O(V E), et la phase de recherche de circit négatif en O(E). Soit ne compleité totale en O(V E). Qestion. Montrer q'après le relâchement de l'arc (, ), d[] d[] + w(, ). Soltion : Le relâchement se fait ainsi : si d[] > d[] + w(, ) alors d[] d[] + w(, ), π[] Donc on a cas : soit d[] d[] + w(, ), et dans ce cas rien n'est fait, la propriété est donc conserée soit d[] > d[] + w(, ), et dans ce cas on fait d[] d[] + w(, ), donc d[] = d[] + w(, ), la propriété est raie. Qestion. Propriété d majorant : Montrer qe d[] δ(s, ) por tot sommet à tot instant de l'algorithme. Montrer qe lorsqe d[] a atteint sa borne infériere δ(s, ), il n'est pls jamais modié. Soltion : Montrons l'inariant d[] δ(s, ) por tot V en raisonnant par récrrence sr le nombre d'étapes de relâchement. En phase d'initialisation on a bien d[] δ(s, ) pisqe d[] =, V {s}, et d[s] = δ(s, s) (on a δ(s, s) = si s se troe sr n circit de longer strictement négatie, et sinon). Considérons le relâchement d'n arc (, ). L'hpothèse de récrrence impliqe qe d[] δ(s, ) por tot V aant le relâchement. La sele aler d poant changer est d[]. Si elle change, on a d[] = d[] + w(, ) δ(s, ) + w(, ) (d'après l'hpothèse de récrrence) δ(s, ) (d'après l'inégalité trianglaire : (, ), δ(s, ) δ(s, ) + w(, )) et donc l'inariant est conseré. La aler n'est pls modiée par la site ne fois qe d[] = δ(s, ), car après aoir atteint sa borne infériere d[] ne pet pls diminer, et il ne pet pas non pls agmenter pisqe les étapes de relâchement n'agmentent pas les alers de d. Qestion. Propriété de conergence : Considérons n pls cort chemin (s,...,, ) por n sommet donné. Montrer qe si d[] = δ(s, ) à n moment précédent le relâchement de (, ) dans l'algorithme, alors on a tojors d[] = δ(s, ) après l'appel. Soltion : D'après la propriété d majorant, si d[] = δ(s, ) à n moment donné précédant le relâchement de l'arc (, ), alors d[] δ(s, ) est ériée par la site. En particlier, après le relâchement de l'arc (, ), on a
d[] d[] + w(, ) (qestion ) = δ(s, ) + w(, ) = δ(s, ) La dernière égalité proient de la sos-strctre optimale d'n pls cort chemin. Qestion. Montrer qe, si G ne contient acn circit de poids négatif accessible depis s, alors, à la n de l'eéction de l'algorithme, d[] = δ(s, ) por tot sommet accessible depis s. Soltion : On démontre ce lemme en faisant appel à la propriété de relâchement de chemin : si p =,,..., k est n pls cort chemin dans G de s = à k et si les arcs de p sont relâchés dans l'ordre (, ), (, ),..., ( k, k ), alors d[ k ] = δ(s, k ). Cette propriété est raie même si d'atres étapes de relâchement interiennent entre les relâchements des arcs de p. Démonstration : par récrrence, montrons q'après le relâchement d ième arc de p, on a d[ i ] = δ(s, i ). Por i =, on n'a pas encore réalisé de relâchement, et on a donc d[ ] = d[s] = = δ(s, s) (pas de circit de poids négatif). Indction : on sppose qe d[ i ] = δ(s, i ). D'après la propriété de conergence on a d[ i ] = δ(s, i ), et cette inégalité ne boge pls ensite. Montrons maintenant qe, si G ne contient acn circit de poids négatif accessible depis s, alors, à la n de l'eéction de l'algorithme, d[] = δ(s, ) por tot sommet accessible depis s. Soit n sommet accessible depis s, et soit n pls cort chemin de s à : p =,,..., k, aec = s et k =. Le chemin p a a pls V arcs, et donc k V. Chacne des V itérations de la bocle por des lignes à relâche tos les E arcs. Parmi les arcs relâchés dans la ième itération, por i =,,..., k, il a ( i, i ). D'après la propriété de relâchement de chemin, on a donc d[] = d[ k ] = δ(s, k ) = δ(s, ). Qestion. Montrer qe por chaqe sommet, il eiste n chemin de s ers si et selement si Bellman-Ford se termine aec d[] <. Soltion : Propriété acn-chemin : S'il n' a pas de chemin de s à, alors on a tojors d[] = δ(s, ) =. Démonstration : d'après la propriété de majorant, on a tojors = δ(s, ) d[], d'où d[] = = δ(s, ). Nos poons à présent démontrer la alidité de l'algorithme. Qestion. Montrer qe si G ne contient acn circit de poids négatif accessible depis s, alors l'algorithme retorne VRAI, on a d[] = δ(s, ) por tos les sommets V, et le sos-graphe G π des sommets dont π() NIL et des arcs (π(), ) est ne arborescence des pls corts chemins de racine s. Montrer qe si G contient n circit de poids négatif accessible à partir de s, l'algorithme renoie FAUX (on porra raisonner par l'absrde). Soltion : Spposons qe G ne contienne acn circit de longer strictement négatie accessible depis s. Si est accessible depis s, alors d'après la qestion. on a d[] = δ(s, ). Si n'est pas accessible depis s, alors la propriété se dédit de la propriété acn-chemin, et d[] = = δ(s, ). La propriété est donc ériée. Propriété de sos-graphe prédécesser : ne fois qe d[] = δ(s, ) por tot V, le sos-graphe prédécesser est ne arborescence de pls corts chemins de racine s. Démonstration : Il nos fat les trois propriétés siantes
les n ds de G π sont accessibles depis s : par dénition δ(s, ) est ni si et selement si est accessible depis s, et donc les sommets accessibles depis s sont eactement ce dont l'attribt d a ne aler nie. Mais d[] a ne aler nie por n sommet V {s} si et selement si π[] NIL. Donc les sommets de G π sont accessibles depis s. G π forme ne arborescence de racine s : après l'initialisation, G π ne contient qe le sommet d'origine. Considérons maintenant n sos-graphe prédécesser G π obten après ne séqence d'étape de relâchement. Montrons qe G π est sans circit par l'absrde. On sppose qe G π contient n circit c =,,..., k, aec = k. On a donc π[ i ] = i por i =,,..., k, et on pet spposer sans perte de généralité qe le circit est d a relâchement de l'arc ( k, k ). Tos les sommets d circit c sont accessibles depis l'origine s, car ils ont tos n prédécesser diérent de NIL, et on donc ne longer de pls cort chemin nie. Jste aant l'appel à relâcher por ( k, k ), on a π[ i ] = i por i =,,..., k, et la dernière mise à jor de d[ i ] était d[ i ] d[ i ]+w( i, i ), et si d[ i ] a été modié depis, il a diminé. On a donc jste aant relâcher : d[ i ] d[ i ]+w( i, i ). Pisqe π[ k ] est modié par l'appel, on a également aant l'appel d[ k ] > d[ k ] + w( k, k ). Donc la longer d pls cort chemin le long d ccle c at : d[ i ] > i= (d[ i ] + w( i, i )) i= Mais, k i= d[ i] = k i= d[ i ]. On a donc > k i= w( i, i ). Donc, le circit a n poids strictement négatif, ce qi contredit l'hpothèse selon laqelle G ne contient pas de circit de longer strictement négatie. Donc G π est n graphe orienté sans circit. Il fat ensite montrer par récrrence qe G π forme ne arborescence de racine s : montrer qe por chaqe sommet S π, il eiste n niqe chemin de s à dans G π. G π arborescence de pls corts chemins : V π, le chemin simple niqe p de s à dans G π est n pls cort chemin entre s et dans G. Soit p =,,..., k, où = s et k =. Por i =,,..., k, on a à la fois d[ i ] = δ(s, i ) et d[ i ] d[ i ]+w( i, i ), d'où l'on conclt qe w( i, i ) δ(s, i ) δ(s, i ). En sommant les poids le long d chemin p, on obtient w(p) = k i= w( i, i ) k i= (δ(s, i) δ(s, i )) = δ(s, k ) δ(s, ) = δ(s, k ) Donc, w(p) δ(s, k ). Comme δ(s, k ) est ne borne infériere de la longer d'n chemin qelconqe de s à k, on conclt qe w(p) = δ(s, k ) et donc qe p est n pls cort chemin de s ers = k. Reenons à la démonstration de la alidité de l'algorithme. Aec la propriété précédente, et le fait qe d[] = δ(s, ), cela impliqe qe G π est ne arborescence de pls corts chemins. L'algorithme retorne rai si G ne contient acn circit de poids négatif? À la n de l'algorithme on a (, ) E d[p] = δ(s, ) δ(s, ) + w(, ) = d[] + w(, ) et donc acn des tests de la ligne de l'algorithme ne permet de retorner fa.
Spposons maintenant q'il eiste n circit de longer strictement négatie c =,,..., k, où = k, accessible depis l'origine s. Alors, w( i, i ) < i= Spposons qe l'algorithme retorne rai. Alors d[ i ] d[ i ]+w( i, i ), por i =,,..., k. On a donc, en sommant sr le circit c k i= d[ i] k i= (d[ i ] + w( i, i )) = k i= d[ i ] + k i= w( i, i ) Comme = k, chaqe sommet de c apparaît eactement ne fois dans chacne des sommes. Donc d[ i ] = d[ i ] De pls, qe d[ i ] est ni, on a i= i= w( i, i ) i= Ce qi contredit l'inégalité précédente k i= w( i, i ) <. Donc l'algorithme retorne rai niqement s'il n' a pas de circit de longer strictement négatie, et fa sinon. L'algorithme de Johnson On s'intéresse maintenant a problème consistant à calcler les pls corts chemins por tot cople de sommets d graphe. L'algorithme de Johnson a ne bonne compleité por les graphes cre (pe d'arêtes en comparaison d nombre de sommets). Il tilise les algorithmes de Dijkstra et de Bellman-Ford, et renoie soit la matrice des poids des pls corts chemins, soit l'assertion qe le graphe possède n circit de poids négatif. La techniqe tilisée consiste à se ramener a cas aec niqement des poids positifs, pis de faire torner l'algorithme de Dijkstra en partant de chaqe sommet. Si les poids ne sont pas tos positifs, on les redénit por pooir se ramener a premier cas. Soit w la fonction des poids aant redénition. La noelle fonction de poids ŵ doit respecter de propriétés :. Por chaqe cople de sommets, V, n pls cort chemin de à en tilisant la fonction de poids w est également n pls cort chemin por la fonction ŵ.. Por chaqe arête (, ), le noea poids ŵ(, ) n'est pas négatif. Dans la site, on note comme dans l'eercice précédent δ por la fonction des poids des pls corts chemins (aec w), et ˆδ représente la fonction des poids des pls corts chemins en tilisant la fonction de poids ŵ. Voici l'algorithme de Dijkstra. Aec V, adjacent[] la liste des sommets adjacents à.
Algorithme Dijkstra(G, w, s) : por tot sommet V faire // Initialisation : d[], π[] NIL : d[s] : E : F V [G] // ensemble des sommets de G : tantqe F faire : d[] = min{d[] F } // on choisit le sommet aec la pls petite aler de d : F F {} : E E {} : por tot sommet adjacent[] faire // relâchement de l'arc (, ) : si d[] > d[] + w(, ) alors : d[] d[] + w(, ), π[] Qestion. Propriété Soit h : V R ne fonction qelconqe faisant correspondre n réel à chaqe sommet. Por chaqe arête (, ) E, on dénit ŵ(, ) = w(, ) + h() h(). Soit p =,,..., k n chemin allant de à k. Montrer qe w(p) = δ(, k ) si et selement si ŵ(p) = ˆδ(, k ). De pls, montrer qe G possède n circit de poids négatif en tilisant w si et selement si G possède n circit de poids négatif en tilisant ŵ. Soltion : Commençons par montrer qe ŵ(p) = w(p) + h( ) h( k ). On a ŵ(p) = k i= ŵ( i, i ) = k i= (w( i, i ) + h( i ) h( i )) = k i= w( i, i ) + h( ) h( k ) = w(p) + h( ) h( k ) Donc, por tot chemin p entre et k érie w(p) + h( ) h( k ). Si n chemin est pls cort q'n atre por la fonction w, alors il l'est également por ŵ. Donc, w(p) = δ(, k ) si et selement si w(p) ˆ = ˆδ(, k ). Montrons qe si G possède n circit de poids négatif en tilisant w alors il en est de même por la fonction de poids ŵ. Soit c =,,..., k n circit qelconqe tel qe = k. On a donc ŵ(p) = w(p) + h( ) h( k ) = w(c). Qestion. Propriété On désire maintenant dénir ŵ ériant également la deième propriété (fonction non négatie). On crée n noea graphe G = (V, E ) aec V = V {s} (s / V ) et E = E {(s, ) : V }. La fonction de poids w est étende de manière à ce qe w(s, ) = por chaqe V. De pls, si G n'a pas de circit de poids négatif, on dénit h() = δ(s, ) por chaqe V... A partir des indications précédentes, dénir ne noelle fonction de poids et montrer q'elle érie les de propriétés. Soltion : En étendant la fonction de pondération de la sorte, on a q'acn arc n'entre dans s, acn pls cort chemin de G, hormis ce d'origine s, ne contient s. De pls G ne contient acn circit de longer strictement négatie si et selement si G n'en contient acn.
Spposons qe G et G ne contiennent acn circit de longer strictement négatie. On dénit h() = δ(s, ) por tot V. D'après l'inégalité trianglaire on a h() h()+w(, ) por tot arc (, ) E. Donc, si l'on dénit les noea poids ŵ comme étant : ŵ(, ) = w(, ) + h() h(), on a bien ŵ(, ), et la seconde propriété est ériée... Générer G à partir d graphe G ci-dessos, et calcler les noea poids. - - Soltion : Voir gre. - - - - - - - - (a) Fonction de pondération initiale w (b) Fonction de pondération modiée ŵ Fig. : Graphe G Qestion. Algorithme de Johnson Écrire l'algorithme de Johnson en s'inspirant des qestions précédentes. Faire torner l'algorithme sr le graphe ci-desss. Jstier la correction de l'algorithme et calcler sa compleité. On rappelle qe l'algorithme de Dijkstra implémenté par n tas de Fibonacci a ne compleité en O(V logv + E). Soltion :
Algorithme Johnson(G, w, s) : Calcler G, où V [G ] = V [G] {s}, E[G ] = E[G] {(s, ) : V [G]}, et w(s, ) = V [G] : si Bellman F ord(g, w, s) =Fa alors : print le graphe contient n circit de longer strictement négatie : sinon : por tot sommet S[G ] faire : h() δ(s, ) // δ(s, ) calclé aec Bellman-Ford : por tot arc (, ) E[G ] faire : ŵ(, ) w(, ) + h() h() : por tot sommet V [G] faire : Eécter Dijkstra(G, ŵ, ) // an de calcler ˆδ(, ), V [G] : por tot sommet V [G] faire : d, ˆδ(, ) + h() h() : retorner D La ligne constrit G. La ligne eécte l'algorithme de Bellman-Ford sr G en tilisant la fonction de pondération w et le sommet d'origine s. Si G, et donc G, contient n circit de longer strictement négatie, alors on signale le problème. Le reste de l'algorithme sppose donc qe le graphe ne contient acn circit de longer strictement négatie, et calcle les longers des pls corts chemins ˆδ(, ) en tilisant Dijkstra n fois por chaqe sommet de V. La ligne stocke dans d, (élément de la matrice D de taille V V ) la aler δ(, ). / - - - - - - - - / /- / /- / / / /- / / / /- /- /- / / / /- / / / / / /
Si la le de priorité min de Dijkstra est gérée aec n tas de Fibonacci, le temps d'eéction de l'algorithme est alors de O(V log V + V E). L'implémentation, pls simple, basée sr n tas min binaire donne n temps d'eéction en O(V E log V ).