Plus courts chemins et programmation dynamique discrète Frédéric Meunier 12 octobre 2016 Ecole des Ponts, France
Un exemple 5 1 2 1 2 2 1 9 10 6 4 2 5 s a b c d e f g h i t 6 Trouver le trajet le plus court dans ce réseau, i.e. la s-t chaîne de plus petit poids dans ce graphe.
Un exemple a 1 b 2 s 5 2 10 c 6 e 2 d 6 4 f 1 2 g 5 9 h 1 t La solution. i
Plan 1. Graphes orientés : quelques définitions. 2. Plus courts chemins dans les graphes orientés. Tous les poids sont 0 : Dijkstra. Le graphe est sans circuit Et sinon?. Plus courte chaîne dans les graphes non-orientés. Tous les poids sont 0 : Encore Dijkstra. Et sinon?
Graphes orientés : quelques définitions
Graphes orientés graphe orienté= brique de base en modélisation. graphe : D = (V, A) V : ensemble de sommets A : ensemble d arcs ; à tout arc correspond un couple de sommets arc (u, v) : u est le prédécesseur de v et v est le successeur de u. u1 u (u, u4) u4 (u4, u) (u5, u) (u7, u5) u5 u7 (u2, u1) (u6, u) u2 u6
Graphes orientés : Chemins chemin = suite de la forme v 0, a 1, v 1,..., a k, v k v i V, a j A avec a j = (v j 1, v j ) Chemin ne passant jamais plus d une fois sur un arc = chemin simple. Chemin ne passant jamais plus d une fois sur un sommet = chemin élémentaire. Chemin simple passant par tous les arcs = chemin eulérien Chemin élémentaire passant par tous les sommets = chemin hamiltonien.
Graphes orientés : Chemin eulérien 5 6 2 1 7 4 8
Graphes orientés : circuits chemin = suite de la forme v 0, a 1, v 1,..., a k, v k v i V, a j A avec a j = (v j 1, v j ) Chemin simple fermé (v 0 = v k ) = circuit Circuit élémentaire, circuit hamiltonien, circuit eulérien
Graphe non-orienté / orienté graphe non-orienté graphe orienté G = (V, E) D = (V, A) arête arc chaîne chemin cycle circuit
Plus courts chemins dans les graphes orientés
Tous les poids sont 0 Cas le plus naturel : tous les poids sont 0. Le plus naturel? Modélisation d un réseau de transport, par exemple. a 2 b 1 1 s d c 5 f 2 1 e 2 6 t 7
L algorithme de Dijkstra Initialisation : U := V, λ(s) := 0 et λ(v) = + pour tout v s. Répéter 1. Choisir u minimisant λ(u) dans U. 2. Pour chaque a = (u, v) A tq λ(v) > λ(u) + w(a), redéfinir λ(v) := λ(u) + w(a).. Redéfinir U := U \ {u}. Arrêt qd λ(u) = + pour tout u U (en particulier arrêt si U = ).
Exemple d application s a b c d e f t (0) ( ) ( ) ( ) ( ) ( ) ( ) ( ) 0 () ( ) ( ) () ( ) (5) ( ) 0 (5) ( ) () ( ) (5) ( ) 0 (4) ( ) ( ) (5) ( ) 0 4 (5) ( ) (5) ( ) 0 4 5 (8) (5) ( ) 0 4 5 (7) 5 (12) 0 4 5 7 5 (9) 0 4 5 7 5 9
L algorithme de Dijkstra Algorithme peut être facilement adapté pour calculer le chemin lui-même (et pas seulement le poids minimum) Théorème Etant donné un graphe orienté D = (V, A), deux sommets s, t et une fonction de poids w : A R +, un s-t chemin de plus petit poids peut être trouvé en O(n 2 ).
Un graphe sans circuit a 2 s 2 10 4 b 2 c 6 d 5 t
Equation de Bellman Posons pour tout sommet v λ(v) := poids minimum d un s-v chemin (λ(v) := si un tel chemin n existe pas) Alors (équation de Bellman) λ(v) = min (λ(u) + w(u, v)) (u,v) A Le plus court chemin de s à v est le plus court chemin de s à un antécédent u de v auquel on a ajouté le dernier arc (u, v).
Suite de l exemple a 2 s 2 10 4 b 2 c 6 d 5 t
Suite de l exemple a 2 s 2 10 4 b 2 c 6 d 5 t
Equation de Bellman algorithme. L algorithme Initialisation λ(s) := 0 et λ(u) := pour tout u tel qu il n existe pas de s-u chemin. Répéter 1. Chercher v dont on connaît λ(u) pour tous les prédécesseurs u. 2. λ(v) := min (u,v) A (λ(u) + w(u, v)) (équation de Bellman) Arrêt quand λ calculé pour tous les sommets. Graphe acircuitique il y a toujours un sommet v dont on connaît tous les prédécesseurs.
L idée de Bellman Principe d optimalité de Bellman La sous-trajectoire d une trajectoire optimale est encore optimale.
Algorithme Algorithme peut être facilement adapté pour calculer le chemin lui-même (et pas seulement le poids minimum) Théorème Etant donné un graphe acircuitique D = (V, A), deux sommets s, t et une fonction de poids w : A R, un s-t chemin de plus petit poids peut être trouvé en O(m). Poids peuvent être positifs et négatifs ( Dijkstra). On peut donc également trouver le plus long chemin élémentaire.
Poids quelconques, pas forcément acircuitique Poids quelconques, et il peut y avoir des circuits : algorithme polynomial si le graphe est sans circuit absorbant. Circuit absorbant = circuit dont la somme des poids < 0. Equation de Bellman.
Pas de circuit absorbant : équation de Bellman λ(k, v) := poids minimum d un s-v chemin traversant exactement k arcs. Equation de Bellman : pour tout v V. λ(k + 1, v) = min (λ(k, u) + w(u, v)) (u,v) A
L algorithme Equation de Bellman algorithme. Initialisation λ(0, s) := 0, λ(0, v) := + pour v s et k := 0. Répéter tant que k V 1 1. Pour tout v, faire λ(k + 1, v) := min (u,v) A (λ(k, u) + w(u, v)) (équation de Bellman) 2. k := k + 1 Renvoyer min k=1,..., V 1 λ(k, t).
Pas de circuit absorbant Algorithme peut être facilement adapté pour calculer le chemin lui-même (et pas seulement le poids minimum) Théorème Etant donné un graphe D = (V, A), deux sommets s, t et une fonction de poids w : A R telle qu il n y ait pas circuit absorbant, un s-t chemin de plus petit poids peut être trouvé en O(nm).
Cas général Théorème Trouver le poids minimal d un s-t chemin élémentaire lorsque le graphe a des poids quelconques est NP-difficile. Contient le problème du chemin hamiltonien.
Plus courte chaîne dans les graphes non-orientés
Tous les poids sont 0 Si tous les poids sont 0, on applique encore Dijkstra. we we Transformation : we Les plus courtes chaînes élémentaires correspondent aux plus courts chemins élémentaires. Donne exactement le même algorithme.
S il y a des poids 0 S il y a des poids 0, mais pas de cycle absorbant : on peut encore y arriver en temps polynomial. Outils seront vus lors de la séance Tournée. ATTENTION : transfomation we we ne permet pas de se ramener au cas orienté (toute arête de poids négatif fait apparaître un circuit absorbant) we
Cas général Théorème Trouver la s-t chaîne élémentaire de poids minimum lorsque le graphe a des poids quelconques est NP-difficile.
Résumé Complexité Graphe orienté, O(n 2 ) poids positifs (Dijkstra) Graphe orienté, O(m) poids quelconques, acircuitique (Programmation dynamique) Graphe orienté, O(nm) poids quelconques, (Programmation dynamique, sans circuit absorbant algorithme de Ford-Bellman) Graphe orienté, NP-difficile poids quelconques Graphe non-orienté, O(n 2 ) poids positifs (Dijkstra) Graphe non-orienté, O(n ) poids quelconques, (voir Séance Tournées) pas de cycle absorbant Graphe non-orienté, NP-difficile poids quelconques
On a Programmation dynamique 1. système dynamique à temps discret x k+1 = f k (x k, u k ), k = 1, 2,..., N 2. fonction de coût additive dans le temps. x 0 : état initial. x k : état au début de la période k. u k : décision pour la période k. c k (x k, x k+1 ) : coût de la transition de x k à x k+1 sur la période k. Trouver la trajectoire x 0, x 1,..., x N de coût total N k=1 c k (x k, x k+1 ) minimal : peut se résoudre par la programmation dynamique.
Programmation dynamique λ(k, x) := coût minimal de la trajectoire amenant le système dans l état x en k étapes. Programmation dynamique : équation de Bellman pour tout y λ(k, y) = min (λ(k 1, x) + c k 1 (x, y)) x X k 1 Algorithme : calculer de proche en proche
Gestion de stock Dynamique d un stock : x k+1 = x k d k + u k, d k : demande pour la période k (supposée connue) x k Z : nombre d unités disponibles en début de période k u k : nombre d unités commandées (et reçues immédiatement) en début de période k K : capacité maximale de stockage c(u k ) + g(x k+1 ) : coût de gestion de stock pour la période k en c(u k ) coût de réapprovisionnement g(x k+1 ) coût de stockage ou coût de pénurie Objectif. Minimiser N 1 k=0 c(u k ) + g(x k+1 ).
Gestion de stock Modélisation par la programmation dynamique périodes : périodes k = 1,..., N états : valeurs possibles x k de niveau de stock, transitions : x k x k+1 tq x k+1 satisfasse simultanément x k+1 Z, x k+1 + d k K et x k+1 x k d k coût de la transition : x k x k+1 est c(x k+1 x k + d k ) + g(x k+1 ) Objectif. Minimiser N 1 k=0 c(x k+1 x k + d k ) + g(x k+1 ) (critère additif = somme des coûts des transitions de la trajectoire).
Programmation dynamique = plus court chemin Programmation dynamique = plus court chemin dans un graphe acircuitique Prog. dyn. états périodes transitions coût de la transition trajectoire trajectoire optimale Plus court s-t chemin sommets arcs longueur l arc chemin plus court chemin Si plusieurs états de départ ou plusieurs états à l arrivée, on peut ajouter des sommets fictifs s et t, et des transitions de coût = 0.
Programmation dynamique = plus court chemin xk K. x0..... transition xk xk+1, de coût ck(xk, xk+1). k = 1 k = 2 k = k = N 1 k = N k transition x0 0
Programmation dynamique = plus court chemin xk K. x0..... k = 1 k = 2 k = trajectoire optimale k = N 1 k = N k
Programmation dynamique = plus court chemin xk K. s := x0 t..... k = 1 k = 2 k = k = N 1 k = N trajectoire optimale = plus court s t chemin dans un graphe acircuitique coûts := 0 k