Mag 24
Mag 24
Équipe pédagogique :
3/186 3/186
Généralités, notions de base, exemples d’applications
4/186 4/186
Définitions formelles et notations : graphe, graphe orienté et non orienté
5/186 5/186
Exemples de graphes
Obtention d’un diplôme Master d’informatique (Exam. décembre 2008)
Modélisation à l’aide d’un graphe : les sommets correspondent aux modules, les arcs
- aux prérequis.
7/186 7/186
Obtention d’un diplôme Master d’informatique : suite 2
8/186 8/186
Obtention d’un diplôme Master d’informatique : suite 3
9/186 9/186
Exemple de graphes : suite
Construction d’un pavillon
La construction d’un pavillon demande la réalisation d’un certain nombre de tâches.
La liste des tâches à effectuer, leur durée et les contraintes d’antériorités à respecter
sont données dans le table ci-dessus. Le travail commençant à la date 0, on cherche
un planning des opérations qui permet de minimiser la durée totale.
Code tâche libellé durée antériorité
(semaines)
A Travaux de maçonnerie 7 -
B Charpente de la toiture 3 A
C Toiture 1 B
D Installation électrique 8 A
E Façade 2 D,C
F Fenêtres 1 D,C
G Aménagement du jardin 1 D,C
H Travaux de plafonnage 3 F
J Mise en peinture 2 H
K Emménagement 1 E,G,J
Un chemin P dans un graphe orienté G est une suite d’arcs dont les extrémités
droites/gauches coïncident de la façon suivante :
P = ((u0 , u1 ), (u1 , u2 ), (u2 , u3 ), . . . , (uk −1 , uk )). La longueur du P est le nombre
d’arcs (ici k ).
Si u0 = uk , le chemin est appelé circuit.
Un chemin élémentaire est défini par une suite de sommets sans répétition (sauf
pour le premier et le dernier sommet).
Si le graphe est non orienté, on utilise chaîne et cycle à la place de chemin et
circuit.
Un graphe sans cycle/circuit est appelé acyclique / sans circuit.
Un graphe non orienté tel que chaque couple de sommets est connecté par une
chaîne est dit connexe.
Un graphe orienté tel que chaque couple de sommets (u , v ) est connecté par un
chemin dans les deux sens (c.-à-d. de u à v et de v à u) est dit fortement
connexe. On dit aussi que les sommets u et v sont mutuellement accessibles.
Un graphe, non orienté, connexe et acyclique est dit arbre.
11/186 11/186
Vocabulaire
12/186 12/186
Vocabulaire : Illustration pour le problème "Obtention d’un diplôme"
13/186 13/186
Vocabulaire
14/186 14/186
Exemple de graphes : (clique, stable)
Planning d’examen
Les cinq étudiants : Dupont, Dupond, Durand, Duval et Duduche doivent passer
certaines épreuves parmi les suivants : Français, Anglais, Dessin, Couture,
Mécanique et Solfège. L’examen se déroulant par écrit, on désire que tous les
étudiants qui doivent subir une même épreuve le fassent simultanément. Chaque
étudiant ne peut se présenter qu’à une épreuve au plus chaque jour. Ci-dessous la
liste des épreuves que doit passer chaque étudiant : Dupont : Français, Anglais,
Mécanique ; Dupond : Dessin, Couture ; Durand : Anglais, Solfège ; Duval : Dessin,
Couture, Mécanique ; Duduche : Dessin, Solfège.
1. Quel est le nombre maximum d’épreuves que l’on peut organiser le même jour ?
2. Quel est le nombre minimum de jours nécessaires à l’organisation de toutes les
épreuves ?
15/186 15/186
Planning d’examen : solution
16/186 16/186
Exemple des graphes : les 7 ponts de Königsberg
La ville de Königsberg sur le Pregel et ses 7 ponts. Déterminer s’il existe ou non une
promenade dans les rues de Königsberg permettant, à partir d’un point de départ au
choix, de passer une et une seule fois par chaque pont, et de revenir à son point de
départ. Ce problème (résolu par Leonhard Euler en 1736) est considéré comme
l’origine de la théorie des graphes.
17/186 17/186
Vocabulaire et modélisation
On appelle chaîne eulérienne (resp. cycle eulérien) une chaîne (resp. un cycle)
qui emprunte une fois et une seule chaque arête du graphe.
Théorème d’Euler : Un graphe connexe a une chaîne eulérienne si et
seulement si tous ses sommets ont un degré pair ou tous ses sommets ont un
degré pair sauf deux sommets.
On peut démontrer que :
si le graphe n’a pas de sommet impair, alors il a un cycle eulérien.
un graphe ayant plus de deux sommets impairs ne possède pas de chaîne
eulérienne (donc non pour le graphe de la ville de Königsberg).
si le graphe a deux sommets impairs, ce sont les extrémités de la chaîne eulérienne.
18/186 18/186
Les 7 ponts de Königsberg : Modélisation et solution
L’analyse des degrés des sommets du graphe de la figure (5) montre que
d (A) = 3, d (B ) = 3, d (C ) = 5, d (D ) = 3.
Ce graphe a plus de deux sommets impairs et ne possède donc pas de cycle eulérien
d’après le théorème d’Euler.
19/186 19/186
Exemples de graphes : suite
20/186 20/186
Modéliser l’accessibilité au centre-ville de l’Utopia
1 2 3 4
5 6 7 8 9
10 11 12 13 14 15
21/186 21/186
Modéliser l’accessibilité au centre-ville de l’Utopia : solution
1 2 3 4
5 6 7 8 9
10 11 12 13 14 15
F IGURE 7 – Les sommets jaunes et verts ne sont pas joignables à partir des sommets rouges.
Les trois zones coloriées en rouge, jaune et vert sont des Composantes Fortements Connexes
(CFC)
22/186 22/186
Modéliser l’accessibilité au centre-ville de l’Utopia
1 2 3 4
5 6 7 8 9
10 11 12 13 14 15
F IGURE 8 – Le plan devient acceptable si on inverse au moins un arc (par exemple si l’arc
(14, 15) devient (15, 14)).
23/186 23/186
Graphe de de Bruijn : à voir en TD
24/186 24/186
Réseaux : une application importante pour les graphes
On cherche dans G un flot de s à t compatible avec la capacité des arcs et qui soit de
valeur maximale.
25/186 25/186
Définition d’une coupe et de sa capacité
Soit le réseau G = (X , U , C ). Une coupe séparant s et t (notée s − t) est une
partition (L, R ) de X , telle que s ∈ L et t ∈ R = L̄ = X \ L.
La capacité C (L, R ) de la coupe s − t est définie par C (L, R ) = ∑ ce où
e∈ω+ (L)
ω+ (L) représente le sous-ensemble d’arcs qui ont leurs extrémités initiales dans
L et leurs extrémités terminales dans L̄ = R.
Lemme : La valeur maximale d’un flot de s à t compatible avec cu n’excède
jamais la capacité d’une coupe séparant s et t.
26/186 26/186
Exemple de graphes : Le problème de mariage (couplage)
F IGURE 11 – Il s’agit de marier ces personnes en satisfaisant les contraintes des couples
compatibles. On peut voir ici (par énumération) qu’on ne peut marier que trois couples.
28/186 28/186
Le problème du flot maximum : solution
29/186 29/186
Représentations des graphes : listes de successeurs
30/186 30/186
Représentations des graphes : matrice d’adjacence
31/186 31/186
Représentations des graphes : matrice d’incidence sommet/arc
Soit le graphe G = (V , E ) où |V | = n et |E | = m.
La matrice d’incidence sommet/arc d’un graphe orienté est une matrice
A = [ai ,j ] i = 1, 2, . . . , |V | et j = 1, 2, . . . , |E | telle que :
+1 si l’arc uj est sortant pour le sommet i
ai ,j = −1 si l’arc uj est entrant pour le sommet i
0 sinon
u1 u2 u3 u4 u5
s +1 +1 0 0 0
A= t 0 0 0 −1 −1
a −1 0 +1 +1 0
b 0 −1 −1 0 +1
Remarque : les valeurs en bleu sont les poids (longueurs) des arcs.
32/186 32/186
Complexité des algorithmes :
Ordre de grandeur des fonctions
33/186 33/186
Analyse des algorithmes
34/186 34/186
Tri-Insertion
35/186 35/186
Analyse de complexité de Tri-Insertion
On cherche une mesure du temps d’exécution T (n) qui doit être la plus
indépendante possible de l’implémentation et de la machine.
Associons une constante ci à chaque exécution de la i-ème ligne.
Soit tj le # de fois que le test de la ligne 4 est exécuté pour cette valeur de j.
1: for j = 2 to n do 1: c1 n
2: clef ← A[j ] 2: c2 n−1
3: i ← j −1 3: c3 n−1
4: while i > 0 and Ai > clef do 4: c4 ∑nj=2 tj
5: A[i + 1] ← A[i ] 5: c5 ∑nj=2 (tj − 1)
6: i ← i −1 6: c6 ∑nj=2 (tj − 1)
7: end while 7: 0
8: A[i + 1] ← clef 8: c8 n−1
9: end for 9: 0
n n
T (n) = c1 n + (c2 + c3 + c8 )(n − 1) + c4 ∑ tj + (c5 + c6 ) ∑ (tj − 1) (1)
j =2 j =2
36/186 36/186
Influence de la nature de données sur le temps d’exécution
le pire des cas (worst case) ; C’est celui où le tableau est trié dans l’ordre
décroissant. Dans ce cas tj = j pour j = 2, 3, . . . , n et on obtient :
n n
T (n) = c1 n + (c2 + c3 + c8 )(n − 1) + c4 ∑ tj + (c5 + c6 ) ∑ (tj − 1)
j =2 j =2
n(n + 1) (3)
= ( c1 + c2 + c3 + c8 )n − (c2 + c3 + c8 ) + c4 ( − 1)
2
n (n − 1 )
+ (c5 + c6 )
2
= an2 + bn + c (fonction quadratique) (4)
37/186 37/186
Analyse de complexité de Tri-Insertion
38/186 38/186
Ordre de grandeur des fonctions : définitions principales
39/186 39/186
Propriétés principales liées à l’ordre de grandeur des fonctions
Transitivité
f (n) = Θ(g (n)) et g (n) = Θ(h(n)) =⇒ f (n) = Θ(h(n))
f (n) = O (g (n)) et g (n) = O (h(n)) =⇒ f (n) = O (h(n))
f (n) = Ω(g (n)) et g (n) = Ω(h(n)) =⇒ f (n) = Ω(h(n))
f (n) = o(g (n)) et g (n) = o(h(n)) =⇒ f (n) = o(h(n))
f (n) = ω(g (n)) et g (n) = ω(h(n)) =⇒ f (n) = ω(h(n))
Reflexivité
f (n) = O (f (n)), f (n) = Θ(f (n)), f (n) = Ω(f (n))
Symétrie
f (n) = Θ(g (n)) ssi g (n) = Θ(f (n))
Symétrie transposée
f (n) = O (g (n)) ssi g (n) = Ω(f (n))
f (n) = o(g (n)) ssi g (n) = ω(f (n))
Analogie entre le comportement asymptotique des fonctions f et g et la
comparaison de 2 nombres réels a et b.
f (n) = O (g (n)) ' a ≤ b
f (n) = Ω(g (n)) ' a ≥ b
f (n) = Θ(g (n)) ' a = b : On dit que f et g sont asymptotiquement équivalents
f (n) = o(g (n)) ' a < b : On dit que f est négligeable devant g
f (n) = ω(g (n)) ' a > b
40/186 40/186
Propriétés principales liées à l’ordre de grandeur des fonctions
41/186 41/186
Critères pour classer les fonctions : Soit f , g , : N → R+ .
Lemme 1
f (n )
a) lim = a 6= 0 ⇒ f = Θ(g ) et g = Θ(f )
n→∞ g (n)
f (n )
b) lim = 0 ⇒ f = o(g ) ⇒ f = O (g ) et f 6= Θ(g )
n→∞ g (n)
f (n )
c) lim = ∞ ⇒ g = o(f ) ⇒ g = O (f ) et g 6= Θ(f )
n→∞ g (n)
Remarque : Le Lemme 1 est un critère suffisant. Les réciproques de a), b), c) sont
f (n)
fausses. Si la limite lim n’existe pas, il faut revenir aux définitions.
n→∞ g (n)
n si n est impair
Exemple 1 : Soit f (n) = et g (n) = 2n, ∀n
2n si n est pair
f (n ) g (n)
alors lim @, mais f = Θ(g ) puisque 2 ≤ f (n) ≤ g (n).
n→∞ g (n)
f (n)
Lemme 2 : Si lim n’est pas déterminée ( 00 ou ∞ ∞ ) on peut appliquer la règle de
n→∞ g (n)
0
f (n ) f (n ) 0
f (n)
l’Hôpital : lim 0 ∃ on a lim = lim 0 .
n→∞ g (n) n→∞ g (n) n→∞ g (n)
2
n 2n 2
Exemple 2 : n2 = o(en ) car lim n = lim n = lim n = 0.
n→∞ e n→∞ e n→∞ e
42/186 42/186
Exploration des graphes :
Parcours en profondeur et parcours en largeur
43/186 43/186
Exploration des graphes
L’exploration d’un graphe (c.-à-d. la visite de tous les sommets joignables à partir
d’un sommet de départ) est une opération fréquente et importante.
elle ressemble à l’exploration d’un labyrinthe
pour explorer un labyrinthe il faut :
une craie : pour noter les carrefours/couloirs déjà visités
un fil : pour pouvoir retourner sur ses pas (backtrack)
44/186 44/186
Les structures Pile (Stack) et File (Queue)
45/186 45/186
Parcours en profondeur (Depth-first Search (DFS)) : 1e version itérative
Algorithm 2 DFS(G,s) (utilise une pile P et suit la stratégie LIFO (Last In First Out )).
where :
previsit(v)={v.visited ← true ; v.in ← clock ; clock ← clock+1}
postvisit(v)={v.out ← clock ; clock← clock+1}
46/186 46/186
Analyse de l’algorithme (2)
L’algorithme (2) est appliqué sur le graphe G de la Fig. (15) à partir du sommet S. Les
valeurs v .in (v .out) seront indiquées en haut à gauche(droite) du sommet v (une fois
calculées).
47/186 47/186
Analyse de l’algorithme (2) : suite
L’algorithme (2) est appliqué sur le graphe G de la Fig. (17) à partir du sommet S.
F IGURE 16 – L’état de la pile P après les F IGURE 17 – Le graphe G après les premiers
premiers cinq coups d’horloge (clock). La cinq coups d’horloge. C .out = 5 : c’est le
pile contient les trois sommets S , A, B. Le moment quand le sommet C a été dépilé de la
sommet B est actuellement la tête de la pile. pile.
48/186 48/186
Analyse de l’algorithme (2) : suite
L’algorithme (2) est appliqué sur le graphe G de la Fig. (19) à partir du sommet S.
49/186 49/186
Analyse de l’algorithme (2) : suite
L’algorithme (2) est appliqué sur le graphe G de la Fig. (21) à partir du sommet S. .
50/186 50/186
Analyse de l’algorithme (2) : suite
L’algorithme (2) est appliqué sur le graphe G de la Fig. (23) à partir du sommet S.
51/186 51/186
Analyse de l’algorithme (2) : suite
L’algorithme (2) est appliqué sur le graphe G de la Fig. (25) à partir du sommet S. .
F IGURE 24 – L’état de la pile P après les F IGURE 25 – Le graphe G après les premiers
premiers neuf coups d’horloge. La pile neuf coups d’horloge. Tous les sommets ont été
contient les sommets S , D , E. Le sommet E visités. Les valeurs v .in correspondent au
est la tête de la pile. moment de la visite/découverte du sommet v .
52/186 52/186
Analyse de l’algorithme (2) : suite
L’algorithme (2) est appliqué sur le graphe G de la Fig. (26) à partir du sommet S.
53/186 53/186
Parcours en largeur d’abord (Breadth First Search (BFS))
Algorithm 3 BFS(G,s) (utilise une file F et suit la stratégie FIFO (First In First Out) ).
where :
previsit(v)={v.visited ← true ; v.in ← clock ; clock ← clock+1}
postvisit(v)={v.out ← clock ; clock← clock+1}
54/186 54/186
Analyse de l’algorithme BFS(G,S)
L’algorithme (3) est appliqué sur le graphe G de la Fig. (29) à partir du sommet S. Les
valeurs v .in (v .out) seront indiquées en haut à gauche(droite) du sommet v (dès
qu’elles soient calculées).
55/186 55/186
Analyse de l’algorithme BFS(G,S) : suite
L’algorithme (3) est appliqué sur le graphe G de la Fig. (31) à partir du sommet S..
56/186 56/186
Analyse de l’algorithme BFS(G,S) : suite
L’algorithme (3) est appliqué sur le graphe G de la Fig. (33) à partir du sommet S..
57/186 57/186
Analyse de l’algorithme BFS(G,S) : suite
L’algorithme (3) est appliqué sur le graphe G de la Fig. (35) à partir du sommet S..
58/186 58/186
Analyse de l’algorithme BFS(G,S) : fin
L’algorithme (2) est appliqué sur le graphe G de la Fig. (36) à partir du sommet S.
59/186 59/186
Parcours en profondeur d’abord :
version récursive
60/186 60/186
Exploration de la descendance d’un sommet donné v
Algorithm 4 Explore(G,v).
61/186 61/186
Explore(G,v) : validation formelle
62/186 62/186
Parcours en profondeur d’abord : l’algorithme complet
Require: G=(V,E).
Ensure: v.visited = true for all vertices v∈ V.
1: for all v∈V do
2: v.visited ← false
3: end for
4: for all v∈V do
5: if not v.visited then Explore(G,v)
6: end for
Analyse de complexité :
∀v ∈ V Explore(G,v) est appelée une seule fois (grâce à l’étiquette v.visited).
Chaque arête (u,v)∈ E est examiné exactement deux fois : la première fois lors
d’Explore(G,u) et une deuxième fois lors d’Explore(G,v).
Sous l’hypothèse que previsit et postvisit prennent un temps constant, DFS(G)
nécessite un temps Θ(|V | + |E |) (linéaire).
63/186 63/186
Forêt couvrante associée à un parcours en profondeur d’abord
Lors du parcours, chaque sommet v est muni de deux étiquettes (v.in, v.out). On
utilise aussi les notations (pre(v), post(v)) 1 . v.in indique le moment de la
première visite du sommet v. v.out indique le moment quand la procédure DFS a
définitivement quitté le sommet v (il a été donc complètement exploré).
1. Dans la terminologie de ce cours la numérotation (pre, post) est une autre dénomination de la
numérotation (in, out) (c.-à-d. pre(u)=u.in et post(u)=u.out)
64/186 64/186
Calcul la numérotation (in, out) ((pre, post))
Les valeurs in/out peuvent être calculées dans les procédures previsit et
postvisit.
On utilise pour ce faire le compteur « clock » initialisé à 1 et défini comme suit.
previsit(v)={v.in ← clock ; clock ← clock+1}
postvisit(v)={v.out ← clock ; clock ← clock+1}
Proposition : Pour chaque couple de sommet u et v, les intervalles [u.in,u.out] et
[v.in,v.out] sont soit complètement disjoints, soit l’un est entièrement inclus dans
l’autre.
Preuve : L’intervalle [u.in, u.out] indique le temps durant lequel le sommet u est
présent dans la pile. La stratégie LIFO explique alors la propriété ci-dessus.
65/186 65/186
Parcours en profondeur dans les graphes orientés
DFS(G) s’applique d’une façon similaire dans les graphes orientés. En raison de
l’orientation des arcs, les arbres de parcours engendrés sont plus complexes
(appelés aussi arborescences).
F IGURE 38 – Un graphe G.
F IGURE 39 – L’arborescence de l’appel
DFS (G, A).
66/186 66/186
Parcours en profondeur dans les graphes orientés : classification des arcs
Dans une forêt DFS, le sommet u est un ancêtre du sommet v ssi u est visité le
premier et v est visité lors de l’appel explore(u) (c.-à-d. pre(u) < pre(v) <
post(v) < post(u)).
Dans une forêt DFS, le sommet u est un descendant du sommet v ssi v est visité
le premier et u est visité lors de l’appel explore(v) (c.-à-d. pre(v) < pre(u) <
post(u) < post(v)).
On peut alors donner la classification suivante pour l’arc (u,v) :
pre(u) < pre(v) < post(v) < post(u) ssi l’arc (u,v) est de type arc
couvrant/arc en avant.
pre(v) < pre(u) < post(u) < post(v) ssi l’arc (u,v) est de type arc retour.
les intervalles [pre(v), post(v)] et [pre(u), post(u)] sont disjoints ssi l’arc
(u,v) est de type arc croisé.
68/186 68/186
Application de DFS : tri topologique (linéaire)
Le parcours en profondeur peut être utilisé pour effectuer un tri topologique (ou tri
linéaire) d’un graphe orienté sans circuit. Le tri topologique d’un DAG (graphe orienté
acyclique) G = (V , E ) consiste à ordonner linéairement tous ses sommets de telle
sorte que si G contient l’arc (u,v) alors, u apparaisse avant v .
69/186 69/186
Application de DFS : linéarisation d’un DAG (Directed Acyclic Graph)
70/186 70/186
Application de DFS : linéarisation d’un DAG (suite)
Proposition : La numérotation post d’un DAG obtenue lors d’un parcours DFS
satisfait l’inégalité post (u ) > post (v ) pour chaque arc (u, v).
Preuve : Les seuls arcs (u , v ) pour lesquels post (u ) < post (v ) dans l’arbre DFS
sont les arcs retour. Or, il n’y pas de tels arcs dans un DAG.
71/186 71/186
Linéarisation d’un DAG par l’algorithme 6
F IGURE 42 – La numérotation
F IGURE 41 – Un graphe G = (V , E ). [pre, post ] obtenue avec un parcours
DFS (G, A).
72/186 72/186
Composantes fortement connexes (CFC)
73/186 73/186
Modéliser l’accessibilité au centre-ville de l’Utopia
1 2 3 4
5 6 7 8 9
10 11 12 13 14 15
74/186 74/186
Modéliser l’accessibilité au centre-ville de l’Utopia : solution
1 2 3 4
5 6 7 8 9
10 11 12 13 14 15
F IGURE 45 – Les sommets jaunes et verts ne sont pas joignables à partir des sommets rouges.
Les trois zones coloriées en rouge, jaune et vert sont des Composantes Fortements Connexes
(CFC)
Le plan donc n’est pas acceptable puisque le graphe associé contient trois CFC.
75/186 75/186
Application de DFS : Composantes fortement connexes (CFC)
76/186 76/186
Application de DFS : Composantes fortement connexes (suite)
La détection des c.f.c. se fait facilement grâce aux propriétés du parcours DFS.
Propriété 1 : La procédure explore(G,u) ne se termine que si tous les sommets
accessibles à partir de u soient visités/explorés (c.-à-d. après avoir exploré toute
la descendance Γ∗u du sommet u).
Ainsi, si la procédure explore(G, v ) est exécutée à partir d’un sommet v
appartenant à une c.f.c. puits (une c.f.c. sans arcs sortants), alors elle visiterait
exactement cette c.f.c. La dernière pourrait être alors enlevée du graphe G, et le
0
processus continuerait sur le graphe résultant G .
Illustrer cette propriété avec les deux meta-sommets {D} et {G,H,I,K,J,L} du
graphe de la figure (46).
77/186 77/186
Application de DFS : Composantes fortement connexes (suite)
F IGURE 47 – Ce
meta-graphe a deux F IGURE 48 – On enlève F IGURE 49 – On enlève
sommets-puits (en gris). On l’unique sommet-puits. l’unique sommet-puits.
peut les enlever.
La connaissance des sommets-puits permet de les enlever un par un et de découvrir
ainsi toutes les C.F.C. du graphe. Pour se faire, on peut utiliser le deuxième
algorithme de tri topologique.
78/186 78/186
Application de DFS : Composantes fortement connexes (suite)
79/186 79/186
Application de DFS : Composantes fortement connexes (suite)
Grace à la propriété 3, nous savons comment trouver une c.f.c. source dans G.
Déterminer les sommets appartenant aux c.f.c. nécessite que le parcours
commence à partir d’une c.f.c. puits. Comment trouver une telle c.f.c. ?
Idée : Renverser le graphe (c.-à-d. changer l’orientation de tous les arcs). Le
graphe ainsi obtenu sera noté GR .
Alors les c.f.c. ne changent pas (facile à vérifier). Mais les sommets puits se
transforment en sources et vice versa. Le graphe G̃ se renverse aussi (voir les
graphes des figures (46) et (51).
La linéarisation du DAG G̃R permet de trier topologiquement les sommets de
DAG G̃ dans l’ordre des sommets-puits vers les sommets-sources.
80/186 80/186
Application de DFS : Composantes fortement connexes (suite)
81/186 81/186
Application de DFS : Algorithme de Kosaraju pour la détection des CFC
Require: G=(V,E)
Ensure: Detect the strongly connected components (SCC) of G
1: Reverse all the edges in G, yielding digraph GR .
2: Run DFS on GR , obtaining the post (v ) numbers for all vertices v .
3: k ← 1.
4: Run EXPLORE(G,v) in G from the vertex v that has the highest post (v ) value in
GR , and has not yet been assigned to any SCC. Assign all vertices mapped out by
the exploration into SCC k .
5: Set k ← k + 1 and repeat from step 4, until all vertices have been assigned to
SCCs.
Complexité : linéaire.
Appliquer l’algorithme 7 pour trouver les C.F.C. du graphe de fig. (50)
82/186 82/186
Application de l’algorithme de Kosaraju (algorithme 7) : suite
F IGURE 53 – Le graphe GR = (V , ER )
avec la numérotation [pre, post ] [in,
F IGURE 52 – Le graphe G = (V , E ). out obtenue avec un parcours
DFS (GR , A).
83/186 83/186
Application de l’algorithme de Kosaraju (algorithme 7) : suite et fin
84/186 84/186
Application de DFS : Composantes fortement connexes (suite)
F IGURE 57 – Ce
meta-graphe a deux F IGURE 58 – On enlève F IGURE 59 – On enlève
sommets-puits (en gris). On l’unique sommet-puits. l’unique sommet-puits.
peut les enlever.
La connaissance des sommets-puits permet de les enlever un par un et de découvrir
ainsi toutes les c.f.c. du graphe. Pour se faire, on peut utiliser le deuxième algorithme
de tri topologique (Alg 7).
85/186 85/186
Application de DFS : linéarisation d’un DAG (suite)
86/186 86/186
Linéarisation d’un DAG par l’algorithme 8
Les deux dernières tâches E et F peuvent être exécutées dans un ordre quelconque.
L’ordre d’exécution des tâches est donné par l’odre d’enlèvement des
sommets-sources : B, D, A, C, E, F.
87/186 87/186
Linéarisation d’un DAG par l’algorithme 8
Algorithm 9 topological_sort_2(G, d − , Z )
Require: G = (V , E ) given by the list of successor succ, d − the list of input degree
value, Z a LIFO/FIFO queue containing the indices of vertices v such that d − [v ] =
0, i .e. Z = {v ∈ V | d − [v ] = 0}.
Ensure: the list top is a topological sort of the graph G
1: top ← [ ]
2: while Z 6= 0 / do
3: u ← Z .pop()
4: for v ∈ succ [u ] do
5: d − [v ] ← d − [v ] − 1
6: if d − [v ] = 0 then
7: Z .add (v )
8: end if
9: end for
10: top.add (u )
11: end while
12: return top
89/186 89/186
Réseaux : définitions
90/186 90/186
Exemple de flot
On dit que [φ1 , φ2 , . . . φm ]T est un flot de s à t ssi la loi de conservation du flot est
vraie ∀u ∈ V \{s, t }, i.e.
F IGURE 65 – Un flot de valeur 6. La première valeur dans un couple (φu , cu ) sur l’arc u
correspond au flot, tandis que la deuxième valeur indique sa capacité.
91/186 91/186
Définition d’une coupe et de sa capacité
Soit le réseau G = (V , U , C ). Une coupe séparant s et t (notée s − t) est une
partition (L, R ) de V , telle que s ∈ L et t ∈ R = L̄ = V \ L.
La capacité C (L, R ) de la coupe s − t est définie par C (L, R ) = ∑ ce où
e∈ω+ (L)
ω+ (L) représente le sous-ensemble d’arcs qui ont leur extrémité initiale dans L
et leur extrémité terminale dans L̄ = R.
Lemme : La valeur maximale d’un flot de s à t compatible avec C n’excède
jamais la capacité d’une coupe séparant s et t.
92/186 92/186
L’égalité entre le flot et la capacité d’une coupe est un certificat d’optimalité
F IGURE 67 – Les valeurs en rouges sont les F IGURE 68 – Les valeurs en bleu visualisent
poids des arcs. le flot sur les arcs.
F IGURE 69 – a) Un réseau G avec un flot φ de valeur 5. Le couple (φu , cu ) associé à chaque arc
u indique la valeur du flot φu et sa capacité cu . b) : Le graphe d’écart Ḡ(φ) associé au flot φ.
94/186 94/186
Un chemin améliorant
2. On dit aussi un chemin élémentaire. C’est un chemin qui passe au plus une fois par chaque sommet.
95/186 95/186
Algorithme de Ford et Fulkerson (1956)
96/186 96/186
Algorithme de Ford et Fulkerson : illustration
99/186 99/186
La relation entre le flot maximum et la coupe minimale
Théorème : Soit φ un flot compatible dans le réseau G. Les conditions suivantes sont
équivalentes :
1. φ est un flot maximum dans G.
2. Le réseau résiduel Ḡ(φ) ne contient aucun chemin améliorant.
3. La valeur du flot φ est égale à la capacité d’une coupe de capacité minimale
séparant s et t.
Démonstration :
(1) ⇒ (2) : Evident
(2) ⇒ (3) : On définit L = {v ∈ V : ∃ un chemin de s à v dans Ḡ(φ)}.
Soit R = V \ L. La partition (L, R ) est une coupe : de façon triviale s ∈ L et t ∈ R.
Par hypothèse, pour chaque arc (u , v ) tq u ∈ L et v ∈ R on a φ(u , v ) = c (u , v ).
D’autre part, pour chaque arc (v , u ) tq v ∈ R et u ∈ L on a φ(v , u ) = 0 .
Donc, size(φ) = C (L, R ).
(3) ⇒ (1) : Conséquence du lemme : La valeur maximale d’un flot de s à t
compatible avec C n’excède jamais la capacité d’une coupe séparant s et t.
100/186 100/186
Analyse de complexité de l’algorithme de
Ford-Fulkerslon
101/186 101/186
Le cas où la valeur de chaque capacité est égale à 1
102/186 102/186
Le cas où la valeur de chaque capacité est une valeur entière ≥ 1
Theorem
Si les capacités initiales C sont entières alors à chaque étape intermédiaire les
valeurs du flot φ(e) et celles des capacités résiduelles Ḡ(φ) sont aussi entières.
103/186 103/186
Analyse de complexité quand les capacités sont des entiers ≥ 1
Theorem
Notons φ le flot dans G, et soit π un chemin simple s ; t dans Ḡ(φ). Alors
size(φ0 ) = size(φ) + ε(π, φ) ; et puisque ε(π, φ) > 0, on a size(φ0 ) > size(φ).
Theorem
L’algorithme de Ford-Fulkerson effectue au plus c itérations de la boucle tant que.
Theorem
L’algorithme de Ford-Fulkerson a une complexité temporelle en O (m × c ).
104/186 104/186
Un cas difficile pour l’algorithme de Ford et Fulkerson
105/186 105/186
Analyse de complexité : amélioration par l’algorithme de Edmonds-Karp
106/186 106/186
Applications
107/186 107/186
Barrage routier par les flots
F IGURE 77 – Le réseau routier d’une île. Pour exprimer leur mécontentement, les agriculteurs
décident de bloquer toute possibilité d’aller de A à B. Pour réduire la gêne occasionnée, on
envisage bloquer seulement les routes, pas les agglomérations.
Proposer une méthode générale pour déterminer où placer les barrages routiers.
Déterminer le nombre minimal de barrages nécessaires et leur emplacement.
Les forces publiques de la vile A ont décidé de surveiller les routes au départ de
A. Toute possibilité de dresser un barage sur ces routes est donc exclue.
Déterminer à nouveau le nombre minimal de barrages nécessaires et leur
emplacement.
108/186 108/186
Barrage routier par les flots - suite
Le problème consiste à supprimer un nombre minimal d’arcs de façon à ce qu’il n’existe plus de
chemin de A vers B. Le problème se ramène à la recherche d’une coupe de capacité minimale.
On affecte une capacité 1 à chaque arc. La valeur d’une coupe fournit le nombre d’arcs à
supprimer afin d’éliminer toute communication de A vers B.
F IGURE 79 – Le flot trouvé est le flot maximum puisqu’il n’existe pas de chemin dans le graphe
résiduel. La coupe associée (donnée par la partition des sommets en sommets rouges et
blancs) est la coupe minimale. Elle suggère l’emplacement des barages – en l’occurrence sur
les arcs (A, 1), (13, B ), (14, B ).
109/186 109/186
Barrage routier par les flots - suite
Pour modéliser le fait que les forces publiques de la vile A ont décidé de surveiller les routes au
départ de A, on affecte une capacité ∞ aux arcs sortants de A.
F IGURE 81 – Le flot trouvé est le flot maximum puisqu’il n’existe pas de chemin dans le graphe
résiduel. La coupe associée (donnée par la partition des sommets en sommets rouges et
blancs) est la coupe minimale. Elle suggère l’emplacement des barages – en l’occurrence sur
les arcs (1, 5), (13, B ), (14, B ).
110/186 110/186
Construction d’autoroutes
a d
[4]
[2]
[2] [2]
[3] [3] [7]
S b e T
[7] [4] [6]
[1]
[9] [5] [5]
c f
[3]
111/186 111/186
Arbres couvrants minimaux (ACM)
112/186 112/186
Définitions et propriétés principales
3. " Arbre Couvrant Minimal" est un racourci pour "Arbre Couvrant de poids Minimal". Tous les arbres
couvrants comportent exactement |V | − 1 arêtes.
113/186 113/186
Arbre Couvrant Minimal : Illustration
F IGURE 83 – Un graphe connexe. Les arêtes de l’arbre couvrant sont grisées. Le poids total de
l’arbre montré est 37. L’arbre n’est pas unique : on peut remplacer l’arête (b, c ) par l’arête (a, h)
et on obtient un autre arbre de même poids.
114/186 114/186
Une application des arbres couvrants minimaux
a b c d e
a 10 1 2 5
b 10 6 4 3
c 1 6 8 9
d 2 4 8 7
e 5 3 9 7
Pour mener à bien cette exploitation il est nécessaire de tracer un réseau de chemins
de coût de construction minimum qui permette de circuler entre tous les bosquets.
Les coûts de construction de ces chemins sont proportionnels à leur longueur.
115/186 115/186
Définitions et propriétés principales
116/186 116/186
Théorème de l’arête minimale qui traverse la coupure : Illustration
117/186 117/186
Théorème de l’arête minimale qui traverse la coupure : preuve
118/186 118/186
Algorithme générique pour la construction d’un ACM
119/186 119/186
Illustration pour l’algorithme ACM_Prim (G(V,E),w,A)
itér S F
A B C D E F
0 {} 0 ∞, nil ∞, nil ∞, nil ∞, nil ∞, nil
1 {A} — 5, A 6, A 4, A ∞, nil ∞, nil
2 {A; D } — 2, D 2, D — ∞, nil 4, D
3 {A; D ; B } — — 1, B — ∞, nil 4, D
4 {A; D ; B ; C } — — — — 5, C 3, C
5 {A; D ; B ; C ; F } — — — — 4, F —
6 {A; D ; B ; C ; F ; E } — — — — — —
120/186 120/186
Algorithme de Prim pour la construction d’un ACM (version tbl)
121/186 121/186
Arbres parfaits partiellement ordonnés et tas binaire (Binary heap)
Le tas binaire (Binary heap) est une file de priorité fréquemment utilisée pour
améliorer la complexité des algorithmes comme le tri par tas, l’alg. de Dijkstra,
l’alg. de Prim ...
Définition : Soit π(j ) la clé associée avec l’élément j de la file F. F est un tas
binaire si la condition suivante est satisfaite (relation entre le père et ses deux
fils) :
j
π(j ) ≥ π(b c) ∀j (12)
2
⇐⇒ π(j ) ≤ π(2j ) and π(j ) ≤ π(2j + 1) ∀j
On représente le tas binaire par un arbre parfait partiellement ordonné :
Tout niveau est rempli de gauche à droite ;
Tout niveau est complètement rempli avant de commencer le niveau suivant ;
la condition (12) est satisfaite (l’élément contenu dans tout nœud est inférieur ou
égal aux deux éléments contenus dans ses fils).
Le tas est facile à implémenter avec un tableau.
122/186 122/186
Arbres parfaits partiellement ordonnés et tas binaire : implementation à l’aide
d’un tableau
F IGURE 86 – L’arbre parfait qui visualise un tas binaire avec 10 éléments. Seules les clés sont
indiquées. Ci-dessous le tableau π associé avec ce tas binaire.
j 1 2 3 4 5 6 7 8 9 10
π(j ) 3 10 5 11 12 6 8 15 20 13
123/186 123/186
Arbres parfaits partiellement ordonnés et tas binaire : propriétés
124/186 124/186
Arbres parfaits partiellement ordonnés et tas binaire : illustration du
fonctionnement
F IGURE 87 – (a) : un tas binaire avec 10 éléments. Seules les clés sont indiquées. (b)-(d) :
illustration de l’opération « insertion ». (e)-(h) : illustration de l’opération « extraction et
suppression du minimum ».
125/186 125/186
Algorithme de Prim pour la construction d’un ACM (version tas binaire)
Algorithm 13 ACM_Prim (G(V,E),w,r)
127/186 127/186
Algorithme de Kruskal pour la construction d’un ACM
128/186 128/186
Opérations et structures de données pour les ensembles disjoints (Union-Find)
Chaque ensemble est un arbre orienté, dont la racine est le représentant de cet
ensemble.
Chaque noeud i de l’arbre est muni d’un pointeur, π (i ), vers son père, ainsi que d’un
rang, (rank), qui équivaut à la taille du sous-arbre enraciné à ce noeud.
129/186 129/186
Opérations et structures de données pour les ensembles disjoints (suite)
Algorithm 15 procedure makeset (x)
Ensure: crée un nouvel ensemble dont le seul élément (donc le représentant) est x.
π(x ) ← x
rank (x ) ← 0
130/186 130/186
Opérations et structures de données pour les ensembles disjoints (suite)
Algorithm 18 procedure union (x,y)
131/186 131/186
Illustration pour les opérations sur les ensembles disjoints
F IGURE 89 – Résultat des opérations makeset et union sur des ensembles disjoints
132/186 132/186
Analyse de complexité des opérations sur les ensembles disjoints
133/186 133/186
Algorithme de Prim versus l’algorithme de Kruskal
F IGURE 90 – (a) visualise les quatre premières arêtes ajoutées par l’algorithme de Prim à partir
du sommet r ; (b) visualise les quatre premières arêtes ajoutés par l’algorithme de Kruskal. Pout
les deux cas la ligne indiquée en pointillés est la suivante à être ajoutée.
134/186 134/186
Calcul des Plus Courts Chemins (PCC)
dans les graphes
135/186 135/186
Parcours en largeur d’abord et calcul des PCC de s aux autres sommets :
le cas où la longueur de chaque arête vaut 1
136/186 136/186
Illustration
Remarque : tous les chemins partant de la racine s sont des PCC (c.-à-d. que ceci
est un arbre des PCC de s à tous les autres sommets).
137/186 137/186
BFS(G,s) : validation formelle
138/186 138/186
Calcul des PCC de s aux autres sommets dans le cas le > 0 : ∀e ∈ E
139/186 139/186
Algorithme de Dijkstra (suite)
Algorithm 21 dist_update(u,v).
Exemple :
140/186 140/186
Application de l’algorithme de Dijkstra sur un graphe
B D B D
4 2 2
3
A 1 3 1 A 1
4 3
2 2
C E C E
5
itér P T
A B C D E
0 ∅ 0 ∞, nil ∞, nil ∞, nil ∞, nil
1 {A} — 4, A 2, A ∞, nil ∞, nil
2 {A; C } — 3, C — 6, C 7, C
3 {A; C ; B } — — — 5, B 6, B
4 {A; C ; B ; D } — — — — 6, B
5 {A; C ; B ; D ; E } — — — — —
141/186 141/186
Justification de l’alg. de Dijkstra
142/186 142/186
Justification de l’alg. de Dijkstra
Lemme : Soit u ∈ T tq
143/186 143/186
Analyse de complexité - version tableaux (Array)
Algorithm 22 Dijkstra_a (G,l,s).
Require: Graph G=(V,E) with positive edge weights {le > 0 : e ∈ E }, vertex s ∈ V
Ensure: ∀u ∈ V , dist (u ) is set to the shortest distance from s to u ; prev (u ) points
to the predecessor of u on this shortest path
1: Initialisation : ∀u ∈ V : dist (u ) ← ∞ and prev (u ) ← nil ; dist (s ) ← 0 ;
2: P ← 0 / , (P contient les sommets v , tq dist (v ) est définitif)
3: T ← V (T contient des sommets v , tq dist (v ) n’est qu’une borne supérieure)
4: while T is not empty do
5: u ← argmin dist (v )
v ∈(T )
P ← P {u }
S
6:
7: T ← T \{u }
8: for all (u , v ) ∈ E do
9: dist_update(u,v)
10: end for
11: end while
Le tas binaire (Binary heap) est une file de priorité importante fréquemment
utilisée pour améliorer la complexité des algorithmes comme le tri par tas, l’alg.
de Dijkstra, l’alg. de Prim ....
Définition : Soit π(j ) la clé associée avec l’élément j de la file F. F est un tas
binaire si la condition suivante est satisfaite (relation entre le père et ses deux
fils) :
j
π(j ) ≥ π(b c) ∀j (15)
2
⇐⇒ π(j ) ≤ π(2j ) and π(j ) ≤ π(2j + 1) ∀j
On représente le tas binaire par un arbre parfait partiellement ordonné :
∀ niveau est rempli de gauche à droite ;
∀ niveau est complètement rempli avant de commencer le niveau suivant ;
la condition (15) est satisfaite (l’élément contenu dans tout nœud est inférieur ou
égal aux éléments contenus dans les fils de ce nœud).
Le tas est facile à implémenter en tableau.
Les propriétés essentielles d’un tas binaire de k éléments :
la racine contient le plus petit élément. L’opération « accès à la racine » se fait en
O (1) ;
l’opération « insertion » se fait en O (log2 k ) ;
l’opération « suppression du minimum » se fait en O (log2 k ).
145/186 145/186
Version tas binaire de l’alg. de Dijkstra
Algorithm 23 Dijkstra_bis(G,l,s).
Require: Graphe G=(V,E) directed or undirected, with positive edge weights {le : e ∈
E } ; vertex s ∈ V
Ensure: For all vertices u ∈ V , dist (u ) is set to the shortest distance from s to u ;
prev (u ) points to the previous of u on this shortest path
1: Initialisation : ∀u ∈ V : dist (u ) ← ∞ and prev (u ) ← nil ; dist (s ) ← 0
2: P ← {s } // P contient les sommets v tq dist (v ) est définitif
3: T ← makequeue(V) // crée une file de priorité T avec dist () comme clé
4: while T is not empty do
5: u ← ExtractMin(T)
P ← P {u }
S
6:
7: T ← T \{u }
8: for all (u , v ) ∈ E do
9: dist_update_bis(T,(u , v ))
10: end for
11: end while
146/186 146/186
Version tas binaire de l’alg. de Dijkstra (suite)
147/186 147/186
Calcul des chemins les plus courts dans les graphes :
148/186 148/186
Présence de poids négatifs
Les valeurs dist () dans l’alg. de Dijkstra sont soit des valeurs exactes (valeur du
chemin le plus court), soit des bornes supérieurs. On a dist (u ) = dist ∗ (u ) si tous les
sommets intermédiaires des chemins s ; u sont dans P. Les valeurs successives
dist () peuvent être vues comme une suite des mises à jour :
Propriétés :
dist (v ) = dist ∗ (v ) si dist (u ) = dist ∗ (u ) et si u est l’avant-dernier sommet
(u = prev (v )) sur le PCC(s;v) ;
la procédure update((u , v )) ne génère que des bornes supérieures à la valeur
dist ∗ (v ).
Utilisation pour chercher le PCC(s;v) :
(a) | PCC (s ; v ) |≤| V | −1 ;
(b) si update() est appliqué aux arêtes du PCC(s;v)
(s, u1 ), (u1 , u2 ), (u2 , u3 ), . . . (u , v ) dans cet ordre, alors dist (v ) = dist ∗ (v ).
149/186 149/186
Présence de poids négatifs : Algorithme de Bellman-Ford
Require: Graphe G=(V,E) directed, edge weights {le : e ∈ E } with no negative cycles ;
vertex s ∈ V
Ensure: For all vertices u ∈ V reachable from s, dist (u ) is set to the shortest distance
from s to u ;
1: for all u ∈ V do
2: dist (u ) ← ∞
3: end for
4: dist (s ) ← 0
5: k ← 1
6: while (k ≤ |V | − 1) do
7: for all edges (u , v ) ∈ E do
8: dist (v ) ← min{dist (v ), dist (u ) + l (u , v )}
9: end for
10: k ← k +1
11: end while
150/186 150/186
Algorithme de Bellman-Ford (variant)
Une autre approche est d’utiliser la fonction multivoque Γ−1 et l’observation que le
(PCC(s;v)) passe par un des prédécesseurs u ∈ Γ−1 (v ). On doit donc avoir
dist (v ) = min {dist (u ) + l (u , v )} = min{dist (v ), min {dist (u ) + l (u , v )}}
u ∈Γ−1 (v ) u ∈Γ−1 (v )
(16)
On obtient la variante suivante.
F IGURE 93 –
152/186 152/186
Techniques d’accélération de l’algorithme de Bellman-Ford_bis
153/186 153/186
Accélérations posibles pour l’algorithme de Bellman-Ford_bis (exemple)
2
4
2 5
1
7
−2
1 2
2 3
3 6
2
154/186 154/186
Calcul des chemins les plus courts/longs (PCC/PLC)
dans les graphes
155/186 155/186
Les principes de la programmation dynamique
L’équation (17) permet de calculer la valeur dist (v ) sous l’hypothèse que les
valeurs dist (u ), ∀u ∈ Γ−1 (v ) sont calculées. Cette stratégie permet de résoudre
un ensemble de sous-problèmes en commençant par les plus « petits », et en
allant vers les plus « grands ». Pour les « plus petits » la solution est connue.
C’est une méthode de résolution applicable aux problèmes qui satisfont le
principe d’optimalité de Bellman (1955) : chaque sous-chemin d’un chemin
optimal est lui-même optimal.
C’est un principe générique. La fonction min de la l’équation (17) peut être
remplacée par la fonction max et l’opérateur binaire « addition » par
« multiplication ».
156/186 156/186
L’alg. de Bellman-Ford vu dans le contexte de la programmation dynamique
La récurrence (18) permet ainsi de calculer la valeur dist k (v ) sous l’hypothèse que
les valeurs dist k −1 (u ), ∀u ∈ Γ−1 (v ) ont été calculées. Ce qui nécessite de résoudre
des sous- problèmes possedant un arc de moins par rapport au problème originel.
157/186 157/186
Les principes de la programmation dynamique
A B 3
6
1 2
S 4 1 E S0 C0 A0 B0 D0 E0
2 4 6 1 1
2 1
1 2
C D
3
158/186 158/186
Algorithmes pour linéariser un DAG (graphe orienté sans circuit) (rappel)
159/186 159/186
Linéarisation d’un DAG par l’algorithme 29
F IGURE 96 – La numérotation
F IGURE 95 – Un graphe G = (V , E ). [pre, post ] obtenue avec un parcours
DFS (G, A).
160/186 160/186
Application de l’ordre topologique/linéaire pour la détermination des chemins
les plus courts/longs dans un DAG
161/186 161/186
Application de l’ordre topologique/linéaire pour la détermination des chemins
plus courts/longs dans un DAG
162/186 162/186
Les principes de la programmation dynamique
163/186 163/186
La plus longue sous-séquence croissante
164/186 164/186
La plus longue sous-séquence croissante
165/186 165/186
Algorithme pour la plus longue sous-séquence croissante
1: for j = 1 to n do
2: L(j ) = 1 + max{L(i ) | (i , j ) ∈ E }
3: end for
4: return maxj L(j )
where max{} = 0.
Et ce sous-problème sera résolu plusieurs fois ! Pour L(n) la taille de l’arbre sera
exponentielle. Cela s’explique par les dépendances entre les problèmes L(j ) et
L(j − 1) ; ils sont presque de la même taille.
Pour améliorer l’efficacité il faut mémoriser les solutions des sous-problèmes
résolus, et les calculer dans le bon ordre (cela évoque déjà la programmation
dynamique).
167/186 167/186
La fonction rang pour les graphes sans circuit (DAG)
168/186 168/186
Une application de la fonction rang
Obtention d’un diplôme Master d’informatique (sujet d’examen)
F IGURE 98 – Modélisation à l’aide d’un graphe : les sommets correspondent aux modules, les
arcs - aux pré-requis.
170/186 170/186
Cas des graphes sans circuit (DAG) : calcul de la fonction rang
Les questions suivantes nécessitent l’utilisation de la fonction rang calculée par :
Algorithm 34 Vertex-rank(G).
F IGURE 99 – Sk est l’ensemble des sommets v tels que d − (v ) = 0 ; La fonction rang associe à
chaque sommet v ∈ V le nombre rank (v ) tel que rank (v ) =le nombre d’arcs dans un chemin
de cardinalité maximum entre les sommets sans prédécesseurs et v . On obtient ici
rank (Prog ) = rank (MD ) = 0, rank (Sys) = rank (MAG) = 1, rank (IniR ) = 2 et
rank (SysRep) = rank (SecR ) = 3.
172/186 172/186
Obtention d’un diplôme Master d’informatique : suite
Les valeurs da la fonction rang calculées précédement (rank (Prog ) = rank (MD ) = 0,
rank (Sys) = rank (MAG) = 1, rank (IniR ) = 2 et rank (SysRep) = rank (SecR ) = 3)
permettent de visualiser le graphe par niveaux et de répondre aux questions
suivantes.
1. Quel est le nombre minimum de semestres pour obtenir ce master ?
F IGURE 100 – Les modules sont ordonnancés dans l’ordre croissant de leur numéro rank . Le
graphe est représenté par niveaux, chaque niveau correspond aux sommets ayant la même
valeur rank .
173/186 173/186
Obtention d’un diplôme Master d’informatique : suite
F IGURE 101 – Au moins 4 semestres sont nécessaires pour obtenir ce master. Cela peut se
calculer par l’algorithme Vertex-rank-longest-paths(G,l,s) qui permet de calculer le plus long
chemin (PLC) du premier au dernier niveau dans un graphe par niveaux.
174/186 174/186
Calcul des PCC/PLC dans un graphe sans circuit (DAG)
Algorithm 35 Vertex-rank-shortest-paths(G,l,s).
F IGURE 102 – Le nombre maximum de modules qu’il devra suivre simultanément vaut 2 : c’est le
nombre maximum de sommets dans un niveau (colonne) du graphe représenté par niveaux, où
chaque niveau correspond aux sommets ayant la même valeur rank .
176/186 176/186
Ordonnancement de tâches
177/186 177/186
Ordonnancement de tâches
À partir d’un projet donné, on construit un graphe sans circuit (DAG) comme suit :
i di j
On ajoute un arc (i , j ) de longueur di , noté par , si la
tâche i de durée di doit précéder la tâche j ;
On ajoute deux tâches fictives α (début) et ω (fin) ;
α est reliée aux sommets sans prédécesseur ;
ω est reliée aux sommets sans successeur.
On structure alors le graphe en niveaux après avoir calculé sa fonction rang ;
178/186 178/186
Ordonnancement de tâches
179/186 179/186
Les tâches pour la construction d’un pavillon
F IGURE 104 – La représentation du graphe des tâches par niveaux après avoir calculé sa
fonction rang et l’ajout des deux tâches fictives début et fin.
180/186 180/186
Ordonnancement de tâches : l’approche « graphe potentiel-tâches »
Notions principales :
La tâche fictive α (début) est reliée aux sommets sans prédécesseur ;
La tâche fictive ω (fin) est reliée aux sommets sans successeur ;
Le graphe est représenté par niveaux après avoir calculé sa fonction rang ;
La date au plus tôt ti de début de la tâche i : ti = max (tj + dj )
j ∈Γ−
i
1
181/186 181/186
Ordonnancement de tâches : calcul des dates au plus tôt et au plus tard
Soit le graphe G=(V,E) orienté, sans circuit, avec les durées des tâches comme des
poids sur les arcs {de : e ∈ E }, le sommet α pour le début des tâches, le sommet ω
pour la fin. Les dates les plus tôt et les plus tard peuvent être calculées par les
algorithmes suivants :
F IGURE 105 – L’étiquette (ti , Ti ) associé au sommet i représente les dates au plus tôt et au
plus tard. Les dates au plus tôt (ti ) sont calculées par l’algorithme (36), tandis que les dates au
plus tard (Ti ) sont calculées par l’algorithme (37). Les tâches i dont les marges MTi = Ti − ti
sont nulles sont appllées des tâches critiques. Les tâches critiques et les arcs du chemin critique
obtenu pour la construction de ce pavillon sont soulignés. Si un quelconque retard est pris sur
une de ces tâches la durée minimale de la construction de la villa sera augmentée d’autant.
183/186 183/186
L’ordonnancement des tâches pour la construction d’un pavillon
F IGURE 106 – Caractéristiques de l’ordonnancement des tâches. Les tâches peuvent être
classée en trois catégories : a) tâches pour lesquelles le moindre retard de démarrage allonge le
délai de réalisation du projet. Ce sont les tâches critiques (MTi = 0 - ici {A, D, F, H, J, K } ) ; b)
tâches pour lesquelles le moindre retard de démarrage pérturbe le calendrier (MLi = 0 - ici {B }) ;
c) tâches pour lesquelles un léger retard ne modifie pas le planning (MLi 6= 0 - ici {C, G, E }) ;
184/186 184/186
Compléments pratiques
Les contraintes de type potentiel (la tâche j doit commencer après la fin de i, ou bien
après la moitié de la réalisation de de i, ou bien un certain temps après la fin de i,
etc.) se modélisent facilement dans l’approche « graphe potentiel-tâches ».
la contrainte : j ne doit pas commencer avant la moitié de la réalisation de la
tâche i se représente par un arc supplémentaire (i , j ) de longueur d2i , c.-à-d.
i di /2 j
.
la contrainte : j ne peut commencer qu’un temps t après la fin de i se représente
i di + t j
par un arc (i , j ) de longueur di + t, c.-à-d. .
la contrainte : j ne peut commencer qu’après la date bj , se représente par un arc
α bj j
(α, j ) de longueur bi , c.-à-d. .
185/186 185/186
Compléments pratiques (suite)
i −d j
i, se représente par un arc (j , i ) de longueur −d, .
la contrainte : j doit commencer avant la date cj , se représente par un arc (j , α)
α −cj j
de longueur −cj , .
la contrainte : j doit suivre immédiatement i, s’écrit ti + di = tj et se représente
par un arc (i , j ) de longueur di et un arc (j , i ) de longueur −di
di
i j
−di
Remarque : Les trois dernières contraintes introduisent des circuits et des arcs de
longueur négative. La condition d’existence d’un ordonnancement devient alors il
n’existe pas de circuit de longueur strictement positive . On devra utiliser un des
algorithmes vus en cours plus adaptés à de telles situations.
186/186 186/186