Chemin de longueur optimale Graphe sans circuit 6 2 1 5 3 4 7 9 8 1 Résultat : Dans un graphe orienté sans circuit il existe au moins un sommet de degré intérieur nul. Mise en niveau d’un graphe sans circuit - Prendre k =2, étiqueter par « 1 » les sommets ayant un degrés intérieur nul. - Tant qu’il y a des sommets non étiquetés, répéter les deux étapes suivantes : - Etiqueter par k tous les sommets n’ayant pas un prédécesseur non étiqueté. - Faire k=k+1 EXEMPLE Résultat de la mise en niveau 2 2 5 6 3 2 1 3 4 5 7 9 6 1 4 5 8 7 2 2 6 7 1 3 9 5 8 4 1 2 3 4 5 6 7 Niveaux Ordre topologique X={x1,x2, ….., xn} l’ensemble des sommets du graphe sans circuit G. L’ordre xi1, xi , ….., xin sera dit ordre topologique Si pour tout arc xil xik de G Alors l<k 2 N.B. Si on commence par étiqueter les sommets par l’algorithme de mise en niveau et puis on numérote les sommets des niveaux consécutifs, on obtient un ordre topologique. 3 Graphe valué G=(X,U) est un graphe A chaque arc u de U est associée une valeur l(u) réelle. Graphe Valué Ainsi étant donné un chemin de G µ= [u1, u2,…., up] on définit sa longueur par : L(µ) = l(u1)+l(u2)+….+l(up ) 3 problèmes se posent P1 - Étant donné 2 sommets x0 et xn de X, déterminer un plus court (long) chemin entre x0 et xn. P2 - Étant donné un sommet x0 de X, déterminer un plus court (long) chemin de x0 à tout autre sommet de X. P3 - Déterminer un plus court (long) chemin entre tout couple de sommets de X. Condition nécessaire pour l’existence d’un chemin de longueur «optimale» entre deux sommets xi et xj est qu’il n’existe pas un chemin entre xi et xj contenant un circuit absorbant. Pour la recherche d’un plus court (resp. long) chemin, un circuit C sera dit absorbant si L(C)<0 (resp. L(C)>0). 4 Algorithme de Ford (Problème P2) G=(X,U) un graphe valué avec X={x0,x1,x2, ….., xn} Déterminer la longueur du plus court chemin de x0 à tout autre sommet xi de G On associe à tout sommet xi une pondération λi Initialisation : Prendre λ0 =0 et λi= ! pour tout i ! 0. Itération de base: Étant donné l’arc xi xj de G Si λi+l(xi xj ) < λj Alors faire λj= λi+l(xi xj) Répéter l’itération de base jusqu’à la stabilisation de toutes les pondérations λi. Remarque 1. On démontre qu’à la fin de l’algorithme, la pondération λi représente la longueur du plus court chemin du sommet x0 au sommet xi. En plus, ce résultat est valable indépendamment des signes des valeurs des arcs. Remarque 2. Si on effectue à l’initialisation # i = !" et on remplace la condition de l’itération de base par : « Si λi+l(xi xj ) > λj Alors faire λj= λi+l(xi xj) » λi représentera alors la longueur du plus long chemin. Remarque 3. L’algorithme de Ford est général, mais ne précise pas l’ordre du parcourt des arcs du graphe. Le parcourt des arcs de G peut se réaliser en visitant tous les sommets de G (dans un ordre donné) et puis en parcourant les arcs incidents vers l’extérieur (ou l’intérieur) de chaque sommet visité. L’efficacité de cet algorithme dépend de l’ordre de visite des sommets de G. 5 Cas d’un graphe sans circuit Remarque : Si x0 est un point entré de G et si l’on parcourt les sommets de G dans un ordre topologique, les pondérations se stabilisent à la fin du premier parcourt. L’algorithme de FORD devient : - Prendre λ0 = 0 - Parcourir les sommet de G suivant un ordre topologique. Pour chaque sommet xi visité faire "i = MIN ( "k + l(x k & x i )) % x k #$ (x i ) Prédécesseurs de xi ! Algorithme de DIJKSTRA Valable lorsque les valuations des arcs sont positives. Étant un sous ensemble A de sommets. Etape 0 Prendre A=X, λ0=0 et λi= ! pour tout i ! 0. Etape 1. Soit i0 ! A tel que ! i0 = MIN ! j x j"A Etape 2. Faire A = A-{xi0}, Si A= Φ Alors FIN. Etape 3. pour tout arc xi0 ! x j avec x j ! A Faire " j = MIN (" j , "i0 + l ( xi0 ! x j )) Revenir à l’étape 1. Remarque : Il n’est pas possible de transformer cet algorithme en un algorithme pour la détermination les longueurs des plus longs chemins. 6 Détermination des chemins optimaux Afin de déterminer les chemins optimaux, on modifie l’algorithme de Ford de la manière suivante : - Définir un tableau : TAB [0..n] de type entier ; prendre TAB[0]=0; - L’itération de base devient : étant donné l’arc xi xj de G Si λi+l(xi xj ) < λj Alors faire {λj= λi+l(xi xj) ; Tab[j]=i} La procédure qui permet de trouver le chemin optimal de x0 à xi s’écrit: Définir k entier ; prendre k=i ; Tant que k ! Tab[k] faire Imprimer xk fin Tant que Imprimer x0 ; Cette procédure liste les sommets du chemin optimal dans le sens inverse de xi à x0 Méthode matricielle (Recherche des plus courts chemins entre tout couple de sommet de G) Construire une suite de matrice (n !n) M0, M1, …, Mn k On note par vij les éléments de la matrice Mk. Initialisation : Prendre % l(x " x j ) si x i " x j # U v ij0 = & i $ sinon ' Calcule des éléments de Mk à partir de ceux de Mk-1 : Pour k = 1 à n calculer les éléments de Mk par : k"1 k"1 v kij = MIN( v k"1 ij , v ik + v kj ) n ij ! Remarque : ! représente la longueur du plus court chemin! de xi à xj dans G 7