Deuxième partie II
A LGORITHMES DANS LES GRAPHES
Représentation en mémoire : matrice d’incidence 1/2
Matrice d’incidence
SoitG= (V,E)graphe simple non orienté avecn=|V|etm=|E| matrice d’incidence de G :matriceM∈ Mn,m({0,1})tel que
mve=
(1 si sommetv incident à l’arêtee
0 sinon , ∀v ∈V,e∈E
1 2
3 4
5
grapheG
{1,2} {1,3} {1,4} {2,3} {2,5} {3,4} {3,5}
1 1 1 1 0 0 0 0
2 1 0 0 1 1 0 0
3 0 1 0 1 0 1 1
4 0 0 1 0 0 1 0
5 0 0 0 0 1 0 1
matrice d’incidence deG
Remarque :d(v) = X
e∈E
mve, ∀v ∈V
Représentation en mémoire : matrice d’incidence 2/2
Matrice d’incidence
SoitG~ = (V,E)graphe simple orienté avecn=|V|etm=|E|
matrice d’incidence deG :~ matriceM∈ Mn,m({−1,0,1})tel que mve=
−1 si sommetv origine de l’arce 1 si sommetv but de l’arce 0 sinon
, ∀v ∈V,e∈E
1 2
3 4
5
grapheG~
(1,2) (1,4) (2,3) (2,5) (3,1) (3,4) (3,5)
1 −1 −1 0 0 1 0 0
2 1 0 −1 −1 0 0 0
3 0 0 1 0 −1 −1 −1
4 0 1 0 0 0 1 0
5 0 0 0 1 0 0 1
matrice d’incidence deG~
Remarque :d−(v) = X
e∈E:mve=1
mve etd+(v) =− X
e∈E:mve=−1
mve, ∀v ∈V
Représentation en mémoire : matrice d’adjacence 1/2
Matrice d’adjacence
SoitG= (V,E)graphe simple non orienté avecn=|V|etm=|E| matrice d’adjacence de G :matriceM ∈ Mn,n(N)tel que
muv =nombre d’arêtes{u,v} ∈E, ∀u,v ∈V
1 2
3 4
5
grapheG
1 2 3 4 5
1 0 1 1 1 0
2 1 0 1 0 1
3 1 1 0 1 1
4 1 0 1 0 0
5 0 1 1 0 0
matrice d’adjacence deG
Remarque :d(v) = X
u∈V
muv = X
u∈V
mvu, ∀v ∈V
Représentation en mémoire : matrice d’adjacence 2/2
Matrice d’adjacence
SoitG~ = (V,E)graphe simple orienté avecn=|V|etm=|E|
matrice d’adjacence deG :~ matriceM ∈ Mn,n(N)tel que muv =nombre d’arcs(u,v)∈E, ∀u,v ∈V
1 2
3 4
5
grapheG~
1 2 3 4 5
1 0 1 0 1 0
2 0 0 1 0 1
3 1 0 0 1 1
4 0 0 0 0 0
5 0 0 0 0 0
matrice d’adjacence deG~
Remarque :d+(v) = X
u∈V
mvu et d−(v) = X
u∈V
muv, ∀v ∈V
Représentation en mémoire : méthode des tableaux 1/2
Comment éviter d’enregistrer des « zéros » inutiles ?
Méthode des tableaux
SoitG= (V,E)graphe non orienté avecn=|V|etm=|E|
méthode des tableaux :enregistrer le graphe à l’aide de 2 tableaux : un tableauadjacentde taille 2mtel que
adjacentdivisé ennsous blocs de tailled(v)contenantV(v) un tableauindicede taillenavec, pour chaque sommetv ∈V :
indice[v]: indice du premier voisin dev dansadjacent
Extension aux graphes orientés possible
Représentation en mémoire : méthode des tableaux 2/2
Chaque arête{u,b} ∈E est enregistrée deux fois :
{u,adjacent[k]} aveck ∈ {indice[u], . . . ,indice[u+1]−1}
{v,adjacent[k]} aveck ∈ {indice[v], . . . ,indice[v+1]−1}
convention :indice[n+1] =SIZE(adjacent) +1
1 2
3 4
5
indice 1 1
4 2
7 3
11 4
13 5 tableaux d’indices
adjacent 2 1
3 2
4 3
1 4
3 5
5 6
1 7
2 8
4 9
5 10
1 11
3 12
2 13
3 14
tableaux des sommets adjacents
V(1) V(2) V(3) V(4) V(5)
Remarque :d(v) =indice[v +1]−indice[v]
Représentation en mémoire : liste d’adjacence 1/2
Liste d’adjacence
Soit un graphe non orientéG= (V,E)avecn=|V|etm=|E| liste d’adjacence du sommet v ∈V :liste des voisins dev
liste(v) liste
v1
voisin next v2
voisin null next
1 2
3 4
5
liste(1) 2 3 4 X
liste(2) 1 3 5 X
liste(3) 1 2 4 5 X
liste(4) 1 3 X
liste(5) 2 3 X
Remarque :d(v) =TAILLE(liste(v)), ∀v ∈V
Représentation en mémoire : liste d’adjacence 2/2
Liste d’adjacence
Soit un graphe orientéG~ = (V,E)avecn=|V|etm=|E|
liste d’adjacence du sommet v ∈V :liste des voisins sortants dev
liste+(v) liste
v1
voisin next v2
voisin null next
1 2
3 4
5
liste+(1) 2 4 X
liste+(2) 3 5 X
liste+(3) 1 4 5 X
liste+(4) X liste+(5) X
Remarque :d+(v) =TAILLE(liste+(v)), ∀v ∈V
Comparaison des structures de graphes : matrices
Matrice d’incidence :
4 Simple à implémenter/utiliser
8 Gourmand en place mémoire (nmblocs mémoire) surtout si le graphe est peu dense (m<<n2) 8 Lecture du voisinage :o(m)
8 Inadapté pour les graphes dynamiques (ajout/retrait de sommet/arêtes)
Matrice d’adjacence :
4 Simple à implémenter/utiliser
4 Accès rapide à l’information d’adjacence :o(1) 8 Gourmand en place mémoire (n2blocs mémoire)
surtout si le graphe est peu dense (m<<n2) 8 Lecture du voisinage :o(n)
8 Inadapté pour les graphes dynamiques (ajout/retrait de sommets)
Comparaison des structures de graphes : tableaux et listes
Tableaux :
4 Simple à implémenter
4 Moins gourmand en place mémoire (2m+nblocs) 4 Lecture du voisinage :o(d(v))
8 Accès lent à l’information d’adjacence :o(d(v)) 8 Inadapté pour les graphes dynamiques (ajout/retrait
de sommets/arêtes) Liste d’adjacence :
4 Moins gourmand en place mémoire (2m+nblocs) 4 Lecture du voisinage :o(d(v))
4 Adapté pour les graphes dynamiques (ajout/retrait de sommet/arêtes)
8 Accès lent à l’information d’adjacence :o(d(v)) 8 Plus dur à implémenter (appel de bibliothèque
spécifique)
Utilisation d’une approche orienté objet
Sauvegarder une graphe avec des classes Classe Sommet : Les caractéristiques liées au sommet
Attributs : indice, poids, couleur, voisins,. . . Méthodes : renvoyer l’indice, changer de couleur, récupérer le voisinage, calculer le degré,. . . Classe Arête : Les caractéristiques liées à une arête
Attributs : indice, coût, sommets incidents,. . . Méthodes : renvoyer l’indice, récupérer le coût, renvoyer les sommets incidents,. . .
Classe Graphe : L’ensemble du graphe
Attributs : nom, tableau des sommets/arêtes,. . . Méthodes : renvoyer nom, ajouter/supprimer un sommet/arête, dessiner le graphe,. . .
Parcours de graphe 1/2
Principe d’un algorithme de parcours de graphe
Algorithme explorant les sommets d’un graphe de proche en proche à partir d’un sommet initial
Pourquoi utiliser un parcours de graphe ?
1 Etudier les propriétés du graphe
Déterminer toutes les composantes connexes d’un graphe Déterminer si un graphe est connexe, acyclique ou biparti
2 Résoudre des problématiques dans les graphes Calculer le diamètre du graphe
Résoudre le problème du plus court chemin Parcourir (aléatoire ou non) le graphe Déterminer heuristiquement une coloration
Parcours de graphe 2/2
Algorithme générique de parcours de graphe : complexo(max{|V|,|E|}) entrée un graphe non orientéG= (V,E) +sommets
sortie un tableaumarquerdes sommets atteints depuiss procédurePARCOURS_GRAPHE(G,s)
initialiser le tableaumarquerde taille|V|avecmarquer[i]←faux,∀i∈V .tableau de marquage des sommets marquer[s]←vrai .marquer le sommets explorer← {s} .ensemble des sommets marqués non explorés tant queexplorer6=∅faire
choisir un sommetudeexplorer .lequel choisir ? siil existev∈ V(u)tel quemarquer[v]est fauxalors .quel ordre ? marquer[v]←vrai .marquer le sommetv explorer←explorer∪ {v} .ajouterv àexplorer sinon
explorer←explorer\ {u} .retirerudeexplorer fin si
fin tant que
retournermarquer fin procédure
Parcours en largeur de graphe 1/2
Structure de File FIFO (First In First Out) : File File :structure de données avec cinq fonctions :
CREER(file) : créer une file
VIDE(file) : retourner vrai si la file est vide ; sinon retourner faux
VALEUR(file) : renvoyer le premier élément de la file
ENFILER(file, élément) : ajouter un élément à la fin de la file
DEFILER(file) : retourner le premier élément de la file et le retirer
i1 . . . ik ENFILER(j) i1 . . . ik j DEFILER() i2 . . . ik j
Principe d’un parcours en largeur (Breadth First Search)
Algorithme de parcours de graphe utilisant une file pourexplorer Principe :
explorer en priorité le voisinage des sommets étudiés en premier
Parcours en largeur de graphe 2/2
Algorithme de parcours en largeur
entrée un graphe non orientéG= (V,E) +un sommets sortie un tableaumarquerdes sommets atteints depuiss
procédurePARCOURS_LARGEUR(G,s)
initialiser le tableaumarquerde taille|V|à faux
marquer[s]←vrai ; TRAITER/AFFICHER(s).opération sur le sommets
CREER(explorer) .créer une fileexplorer
ENFILER(explorer,s) .ajoutersà la file tant queVIDE(explorer) est fauxfaire
u ←VALEUR(explorer) .récupérer la valeur de la file tant queil existev ∈ V(u)tel quemarquer[v] est fauxfaire
marquer[v]←vrai ; TRAITER/AFFICHER(v) .opération surv
ENFILER(explorer,v) .ajouterv à la file fin tant que
DEFILER(explorer) .défiler la file
fin tant que
retournermarquer fin procédure
Application du parcours en largeur sur un graphe 1/4
Parcours en largeur à partir du sommet1
0 Initialisation :
1
2 3
4 5 6
7 1
MARQUER V 1
F 2
F 3
F 4
F 5
F 6
F 7
FILE 1
1 2 3 4 5 6 7
ORDRE 1
1 2 3 4 5 6 7
1 Itération 1 :u =1 + exploration du voisinageV(1) ={2,4,5}
2 3
4 5 6
7 1
2
4 5
MARQUER V 1
V 2
F 3
V 4
V 5
F 6
F 7
FILE 2 1
4 2
5
3 4 5 6 7
ORDRE 1 1
2 2
4 3
5
4 5 6 7
il existe des sommets non marqués : enfiler 2,4,5 et défiler 1
Application du parcours en largeur sur un graphe 2/4
2 Itération 2 :u =2 + exploration du voisinageV(2) ={1,3,5,6}
3 6
7 1
2
4 5
3
6 MARQUER V
1 V
2 V
3 V
4 V
5 V
6 F
7
FILE 4 1
5 2
3 3
6
4 5 6 7
ORDRE 1 1
2 2
4 3
5 4
3 5
6 6 7
il existe des sommets non marqués : enfiler 3,6 et défiler 2
3 Itération 3 :u =4 + exploration du voisinageV(4) ={1,5,7}
7 1
2 3
4 5 6
7
MARQUER V 1
V 2
V 3
V 4
V 5
V 6
V 7
FILE 5 1
3 2
6 3
7
4 5 6 7
ORDRE 1 1
2 2
4 3
5 4
3 5
6 6
7 7
il existe des sommets non marqués : enfiler 7 et défiler 4
Application du parcours en largeur sur un graphe 3/4
4 Itération 4 :u =5 + exploration du voisinageV(5) ={1,2,3,4}
1
2 3
4 5 6
7
MARQUER V 1
V 2
V 3
V 4
V 5
V 6
V 7
FILE 3 1
6 2
7
3 4 5 6 7
ORDRE 1 1
2 2
4 3
5 4
3 5
6 6
7 7
il n’existe pas de sommets non marqués : défiler 5
5 Itération 5 :u =3 + exploration du voisinageV(3) ={2,5,7}
1
2 3
4 5 6
7
MARQUER V 1
V 2
V 3
V 4
V 5
V 6
V 7
FILE 6 1
7
2 3 4 5 6 7
ORDRE 1 1
2 2
4 3
5 4
3 5
6 6
7 7
il n’existe pas de sommets non marqués : défiler 3
Application du parcours en largeur sur un graphe 4/4
6 Itération 6 :u =6 + exploration du voisinageV(6) ={2}
1
2 3
4 5 6
7
MARQUER V 1
V 2
V 3
V 4
V 5
V 6
V 7
FILE 7
1 2 3 4 5 6 7
ORDRE 1 1
2 2
4 3
5 4
3 5
6 6
7 7
il n’existe pas de sommets non marqués : défiler 6
7 Itération 7 :u =7 + exploration du voisinageV(7) ={3,4}
1
2 3
4 5 6
7
MARQUER V 1
V 2
V 3
V 4
V 5
V 6
V 7
FILE
1 2 3 4 5 6 7
ORDRE 1 1
2 2
4 3
5 4
3 5
6 6
7 7
il n’existe pas de sommets non marqués : défiler 7
Parcours en profondeur 1/2
Structure de File LIFO (Last In First Out) : Pile Pile :structure de données avec cinq fonctions :
CREER(pile) : créer une pile
VIDE(pile) : retourner vrai si la pile est vide ; sinon retourner faux
VALEUR(pile) : renvoyer le dernier élément de la pile
EMPILER(pile, élément) : ajouter un élément à la fin de la pile
DEPILER(pile) : retourner le dernier élément de la pile et le retirer
i1 . . . ik EMPILER(j) i1 . . . ik j DEPILER() i1 . . . ik
Principe d’un parcours en profondeur (Depth First Search)
Algorithme de parcours de graphe utilisant une pile pourexplorer Principe :
explorer en priorité le voisinage des sommets étudiés en dernier
Parcours en profondeur 2/2
Algorithme de parcours en profondeur
entrée un graphe non orientéG= (V,E) +un sommets sortie un tableaumarquerdes sommets atteints depuiss
procédurePARCOURS_PROFONDEUR(G,s)
initialiser un tableaumarquerde taille|V|à faux
marquer[s]←vrai ; TRAITER/AFFICHER(s).opération sur le sommets
CREER(explorer) .créer une pileexplorer
EMPILER(explorer,s) .ajoutersà la pile tant queVIDE(explorer) est fauxfaire
u ←VALEUR(explorer) .récupérer la valeur de la pile tant queil existev ∈ V(u)tel quemarquer[v]est fauxfaire
marquer[v]←vrai ; TRAITER/AFFICHER(v) .opération surv
EMPILER(explorer,v) .ajouterv à la pile u←VALEUR(explorer).récuperer le sommet suivant de la pile fin tant que
DEPILER(explorer) .dépiler la pile
fin tant que
retournermarquer fin procédure
Application du parcours en profondeur sur un graphe 1/5
Parcours en profondeur à partir du sommet1
0 Initialisation :
1
2 3
4 5 6
7 1
MARQUER V 1
F 2
F 3
F 4
F 5
F 6
F 7
PILE 1
1 2 3 4 5 6 7
ORDRE 1
1 2 3 4 5 6 7
1 Itération 1 :u =1 + chercher un voisin non marqué dansV(1)
2 3
4 5 6
7 2
1
MARQUER V 1
V 2
F 3
F 4
F 5
F 6
F 7
PILE 1 1
2
2 3 4 5 6 7
ORDRE 1 1
2
2 3 4 5 6 7
il existe un sommet non marqué : empiler le sommet 2
Application du parcours en profondeur sur un graphe 2/5
2 Itération 2 :u =2 + chercher un voisin non marqué dansV(2)
3
4 5 6
7 1
2 3 MARQUER V
1 V
2 V
3 F
4 F
5 F
6 F
7
PILE 1 1
2 2
3
3 4 5 6 7
ORDRE 1 1
2 2
3
3 4 5 6 7
il existe un sommet non marqué : empiler le sommet 3
3 Itération 3 :u =3 + chercher un voisin non marqué dansV(3)
1 2
4 5 6
7 1
2 3
5
MARQUER V 1
V 2
V 3
F 4
V 5
F 6
F 7
PILE 1 1
2 2
3 3
5
4 5 6 7
ORDRE 1 1
2 2
3 3
5
4 5 6 7
il existe un sommet non marqué : empiler le sommet 5
Application du parcours en profondeur sur un graphe 3/5
4 Itération 4 :u =5 + chercher un voisin non marqué dansV(5)
4 6
7 1
2 3
5
4
MARQUER V 1
V 2
V 3
V 4
V 5
F 6
F 7
PILE 1 1
2 2
3 3
5 4
4 5 6 7
ORDRE 1 1
2 2
3 3
5 4
4 5 6 7
il existe un sommet non marqué : empiler le sommet 4
5 Itération 5 :u =4 + chercher un voisin non marqué dansV(4)
6
7 1
2 3
4 5
7
MARQUER V 1
V 2
V 3
V 4
V 5
F 6
V 7
PILE 1 1
2 2
3 3
5 4
4 5
7 6 7
ORDRE 1 1
2 2
3 3
5 4
4 5
7 6 7
il existe un sommet non marqué : empiler le sommet 7
Application du parcours en profondeur sur un graphe 4/5
6 Itération 6 :u =7 + chercher un voisin non marqué dansV(7)
6 1
2 3
4 5
7
MARQUER V 1
V 2
V 3
V 4
V 5
F 6
V 7
PILE 1 1
2 2
3 3
5 4
4 5 6 7
ORDRE 1 1
2 2
3 3
5 4
4 5
7 6 7
il n’existe pas de sommets non marqués : dépiler le sommet 7
7 Itération 7 :u =4 + chercher un voisin non marqué dansV(4)
6 1
2 3
4 5
7
MARQUER V 1
V 2
V 3
V 4
V 5
F 6
V 7
PILE 1 1
2 2
3 3
5
4 5 6 7
ORDRE 1 1
2 2
3 3
5 4
4 5
7 6 7
il n’existe pas de sommets non marqués : dépiler le sommet 4
8 Itération 8 : dépiler les sommets non marqués : 4 puis 5 puis 3
Application du parcours en profondeur sur un graphe 5/5
9 Itération 11 :u =2 + chercher un voisin non marqué dansV(2)
6 1
2 3
4 5
7
6 MARQUER V
1 V
2 V
3 V
4 V
5 V
6 V
7
PILE 1 1
2 2
6
3 4 5 6 7
ORDRE 1 1
2 2
3 3
5 4
4 5
7 6
6 7
il existe un sommet non marqué : empiler le sommet 6
10 Itération 12 :u =6 + chercher un voisin non marqué dansV(6)
1
2 3
4 5 6
7
MARQUER V 1
V 2
V 3
V 4
V 5
V 6
V 7
PILE 1 1
2
2 3 4 5 6 7
ORDRE 1 1
2 2
3 3
5 4
4 5
7 6
6 7
il n’existe pas de sommets non marqués : dépiler le sommet 6
11 Itération 13 : dépiler chaque sommet jusqu’à la fin : 2 puis 1
Autres algorithmes de parcours de graphes
Autres variantes d’algorithme de parcours
1 Enregistrer l’arbre de parcours dans une structure approprié
2 Algorithmes de parcours appliquées aux graphes orientés (exploration du voisinage entrant/sortant de chaque sommet)
3 Algorithme déterminant un ordre topologique :
1. initialement, calculer le degré entrant de chaque sommet 2. choisir un sommetude degré nul parmi les non marqués 3. marquer le sommetu
4. mettre à jour les degrés des sommets non marqués 5. réitérer le processus en retournant au pas2.
Cet algorithme détermine si un graphe orienté contient un circuit
4 Autres parcours : parcours Lex-BFS, variantes BFS/DFS Ordre topologique d’un graphe orientéG~ = (V,E)
Numérotationni de chaque sommeti∈V tel que : ni <nj pour tout(i,j)∈E
Application à la génération de labyrinthe
Principe : diviser un rectangle en petit carrés et appliquer un parcours en profondeur modifié sur le graphe définit par :
un sommet : un carré
une arête : deux carrés partageant une frontière
vidéo manquante : ouvrir avec okular
source : en.wikipedia.org, auteur : Purpy Pupple, licence : Creative Commons
Problème du plus court chemin 1/2
Problème du plus court chemin entre le sommetset le sommett
Trouver un chemin de longueur totale minimale entre le sommet source set le sommet ciblet(i.e. envoyer une unité de flot entresett)
Pourquoi s’intéresser à ce problème ? Problème facile à résoudre
Applications dans l’industrie : chercher la route la moins coûteuse dans un réseau routier (GPS)
dans un réseau de communication (transfert d’information) Nombreux aspects de l’optimisation dans les réseaux Résoudre des problèmes plus difficiles
Utiliser par la programmation dynamique
Problème du plus court chemin 2/2
Données : G~ = (V,E)graphe orienté + 2 sommets particulierss ett cij distance de parcours de l’arc(i,j)∈E
Objectif : chercher le chemin le plus court en distance entresett Hypothèses : pas de circuit de distance totale négative
existence d’un chemin entre le sommetset le sommett
s
1
2
3
4
t
i j
10
7
7
1 5
10 2
5
3 cij
Résumé min
X
(i,j)∈P
cij :Pest un chemin entres ettdansG~
Applications au problème de sac-à-dos 1/2
Données : un sac-à-dos de capacité maximaleW
un ensembleI depobjets avec pour chaque objeti ∈I: un poidswi et une utilitéui
Objectif : choisir des objets afin de maximiser l’utilité totale Contraintes : ne pas dépasser la capacité du sac
Problème du sac-à-dos
Choisir un ensemble d’objets afin de maximiser l’utilité totale sans dépasser la capacité du sac
source:wikipédia-auteur:Dake
Applications au problème de sac-à-dos 2/2
Considérons le jeu de données
i 1 2 3 4
ui 40 15 20 10
wi 4 2 3 1
et W =6
chaque objet peut-être pris plusieurs fois Transformation du problème en un problème de plus long chemin Soit le graphe multipleG~ = (V,E)avec V ={0, . . . ,W}etE définit par
(i,i+wk)k ∈E aveck ∈I,i∈ {0, . . . ,W −wk} en posantci,jk =uk pour tout(i,j)k ∈E
0 0 1 0 2 0 3 0 4 0 5 0 6
40 40 40
15 15 15 15 15
20 20 20 20
10 10 10 10 10 10
On cherche le plus long chemin dans ce graphe entre 0 et 6
Variantes du problème du plus court chemin
Il existe plusieurs variantes du problème :
1 Plus court chemin entre un sommetset tous les autres sommets
2 Plus courts chemins entre toutes paires de sommets
3 Résolution de cas particuliers :
Plus court chemin dans un graphe orienté sans circuit
Plus court chemin dans un graphe avec des distances unitaires Plus court chemin dans un graphe avec des distances positives Plus long chemin dans un graphe
Plus court chemin dans un graphe non orienté :
i ce j i cij=cji=ce j
Transformation : chaque arête remplacée par deux arcs inverses
4 Ajouter des contraintes supplémentaires : contrainte de temps/capacité,. . .
5 Utiliser une fonction de distance non linéaire :
coût dépendant du nombre d’arcs empruntés,. . .
Conditions d’optimalité 1/2
Propriété des plus courts chemins
SiPuv est le plus court chemin du sommetuau sommetv passant par le sommetw
Alors le cheminPuw est un plus court chemin deuàw Conséquences
1 Les plus courts chemins des vers tous les autres sommets forme un arbre, appelé arbre des plus courts chemins partant des
2 Sidk représente la distance de plus court chemin entresetk Alors, le cheminPsk est un plus court chemin desàk ssi
dj =di+cij pour tout(i,j)∈Psk
Conditions d’optimalité 2/2
Théorème des arcs tendus (conditions de complémentarité de la dualité) Sidk représente la distance du plus court chemin entres etk, ∀k ∈V Alors, le cheminPsk est un plus court chemin desàk ssi
dj =di+cij pour tout(i,j)∈Psk Théorème : conditions d’optimalité
Sidk représente la distance du plus court chemin entres etk,∀k ∈V Alors, la distancedk vérifie les conditions suivantes :
1. pour chaque arc, on a
dj ≤di +cij pour tout(i,j)∈E
2. si le cheminPsk est un plus court chemin desàk alors dj =di+cij pour tout(i,j)∈Psk On en déduit que les plus courts chemins vérifient :
dj =minndi+cij :i ∈ V−(j)o ∀j∈V\ {s}
Résolution du problème du plus court chemin
Principe des algorithmes de plus courts chemins
Chercher l’arbre des plus courts chemins en partant des et vérifiant la condition d’optimalité
Utiliser des étiquettesdj pour chaque sommetj tel que : dj : estimation de la distance des àj Mettre à jour itérativement ces étiquettes pour obtenir :
dj =minndi+cij :i ∈ V−(j)o ∀j∈V Deux types d’algorithmes :
1 Fixation d’étiquette :fixer itérativement les étiquettes de distance une à une lorsqu’on a garantit l’optimalité d’une étiquette
2 Correction d’étiquette :corriger les étiquettes de distance jusqu’à obtenir la condition d’optimalité
Résolution pour un graphe acyclique 1/4
Ordre topologique
Un graphe est sans circuit ssi il existe une numérotationni des sommetsi ∈V tel que :
ni <nj pour tout(i,j)∈E
a
b
c
d e f 1 g
2 3
4
5
6
7
Graphe avec un ordre topologique
Principe de l’algorithme du plus court chemin pour un graphe acyclique Calculer et fixer itérativement les distances des plus courts chemins selon l’ordre topologique
Résolution pour un graphe acyclique 2/4
Condition d’application
Partir avec un graphe acyclique oùsest le sommet numéroté 1
⇔graphe possédant un ordre topologique Principe de l’algorithme de Bellman
Fixer et mettre à jour itérativement les étiquettes de distancedi des sommetsi en suivant l’ordre topologique
A une itérationk
les plus courts chemins desàisont connus∀i∈ {1, . . . ,k −1}
les plus courts chemins desàirestent à calculer∀i∈ {k, . . . ,n}
En effet, le plus court chemin entre le sommetset un sommeti ∈V est composé exclusivement des sommets{1, . . . ,i}
Résolution pour un graphe acyclique 3/4
Partir du sommet s=1
Initialisation :distance[1] =0 2
d2=∞
3
d3=∞ 4 d4=∞
5 d5=∞
1
d1=0
6
d6=∞
8 4 2
2
1
1 7
2 3
Itération 1 :distance[2] =8 2
d2=8
3
d3=4 4 d4=∞
5 d5=∞
1
d1=0
6
d6=∞
2 2
1
1 7
2 3 4
8
Itération 2 :distance[3] =4 2
d2=8
3
d3=4 4 d4=∞
5 d5=10
1
d1=0
6
d6=∞
2
1
1 7
2 3 8
4
2
Itération 3 :distance[4] =5 2
d2=8
3
d3=4 4 d4=5
5 d5=5
1
d1=0
6
d6=∞
2 2
7 2 3 8
4
1 1
Itération 4 :distance[5] =5 2
d2=8
3
d3=4 4 d4=5
5 d5=5
1
d1=0
6
d6=7
2 2
7 3 8
4
1 1
2
Itération 5 :distance[6] =7 2
d2=8
3
d3=4 4 d4=5
5 d5=5
1
d1=0
6
d6=7
2 2
7 3 8
4
1 1
2
Légende des distances :
En vert : distance temporaire En bleu : distance améliorée
En rouge : distance permanente (fixée) En violet : distance devenant permanente
Résolution pour un graphe acyclique 4/4
Algorithme avec un ordre topologique : complexitéo(|E|)
entrée un graphe orientéG~ = (V,E)avecc des coûts sur arcs+sommets sortie un tableaudistancedes distances entreset les autres sommets
procédureALGORITHME_BELLMAN(G,~ s)
partir/calculer un ordre topologique pourG~ avecsnuméroté 1
.numérotation de départ initialiser le tableaudistancede taille|V|
.distanceenregistre la distance entreset les autres sommets distance[i]←+∞, ∀i ∈V\ {s} ; distance[s]←0
pour touti allant de 1 à|V| −1 par pas de 1faire
pour toutj ∈ V+(i)faire .exploration du voisinage sortant dei sidistance[j]>distance[i] +cij alors
.distance desàj plus courte en passant pari distance[j]←distance[i] +cij .mise à jour distance fin si
fin pour fin pour
retournerdistance fin procédure
Application à la programmation dynamique
Graphe par couches-états
i-j couche i-état j transition
0-1
1-1 1-2 1-3
2-1 2-2 2-3 2-4 2-5
3-1 3-2 3-3 3-4 3-5 3-6 3-7
. . . . . . . . . . . . . . . . . . . . .
couche 0 couche 1 couche 2 couche 3 couche K-2 couche K-1 couche K couche K+1
Pour un problème d’optimisation résolu par programmation dynamique:
une couche=un niveau de décision ; un état=état de la solution
Résolution pour un graphe avec distances positives 1/3
Condition d’application
Toutes les distances sont positives Principe de l’algorithme de Dijkstra
Fixer et mettre à jour itérativement les étiquettes de distancedi des sommetsi en séparant les sommets en deux :
une liste de sommets avec un statutpermanent: distances des sommets sont optimales (étiquettes fixées)
une liste de sommets avec un statuttemporaire: distances des sommets sont des estimations partielles
A une itérationk
choisir un sommet temporaireitel quedi est minimale rendre le sommetien statut permanent
ajuster les distances temporaires des voisins du sommeti
Résolution pour un graphe avec distances positives 2/3
Partir du sommet s=1
Initialisation :distance[1] =0 2
d2=∞
3
d3=∞ 4 d4=∞
5 d5=∞
1
d1=0
6
d6=∞
8 4 2
2
1
1 7
2 3
Itération 1 :distance[3] =4 2
d2=8
3
d3=4 4 d4=∞
5 d5=∞
1
d1=0
6
d6=∞
2 2
1
1 7
2 3 8
4
Itération 2 :distance[5] =5 2
d2=8
3
d3=4 4 d4=∞
5 d5=5
1
d1=0
6
d6=∞
2 2
1
7 2 3 8
4
1
Itération 3 :distance[2] =7 2
d2=7
3
d3=4 4 d4=12
5 d5=5
1
d1=0
6
d6=8
8 2
1
2 4
1 2
7 3
Itération 4 :distance[6] =8 2
d2=7
3
d3=4 4 d4=12
5 d5=5
1
d1=0
6
d6=8
8 2
1
2 4
1 2
7 3
Itération 5 :distance[4] =10 2
d2=7
3
d3=4 4 d4=10
5 d5=5
1
d1=0
6
d6=8
8 2
1 4 7
1 2
3 2
Légende des distances :
En vert : distance temporaire En bleu : distance améliorée temporaire= vert + bleu
En rouge : distance permanente
En violet : distance devenant permanente permanent= rouge + violet