Académique Documents
Professionnel Documents
Culture Documents
Février 2017
Principe et Origines 2
La théorie des graphes visualise une
problématique par un graphe synoptique. b
Elle propose des algorithmes de résolution.
a c
Historique
d
b
1 Représentation de Königsberg par un graphe
2 3
a 7
c
6 5 Le théorème d’Euler affirme que ce problème
4 n’admet pas de solution.
d
Kirchhoff (1847) : analyse des circuits électriques
Les 7 ponts de Königsberg
20
Graphe orienté : les liens sont des arcs 3
15
e a b c e
7
b
9 17 1
d c
d e 𝑑+ 𝑎 = 2
a
𝑑− 𝑎 = 1
⇒𝑑 𝑎 =2+1=3
c
𝑑+ 𝑒 = 1
Les successeurs de a sont 𝑈 + 𝑎 = 𝑐, 𝑑 ,
𝑑− 𝑒 = 3
Les prédécesseurs de e sont : 𝑈 − 𝑒 = 𝑏, 𝑐, 𝑑
⇒𝑑 𝑒 =1+3=4
Les voisins de a sont 𝑈 𝑎 = 𝑏, 𝑐, 𝑑
Modélisation par un Graphe 5
Exemple 1 (problème du passeur)
Rive Gauche Rive Droite
Un passeur (P) doit faire traverser une rivière à un
loup (L), une chèvre (V) et un chou (C) dans une P,L,V,C t0
petite barque à deux places.
Pour des raisons évidentes, on ne peut laisser seules L,C P,V t1
sur une rive le loup et la chèvre ou la chèvre et le
chou.
L, C,P V t2
Solution
Un sommet représente l’état d’une rive à un L V,P,C t3
instant donné.
Un arc représente le passage d’une rive d’un L,P,V C t4
état à un autre.
V C,P,L t5
V,P C,L t6
C,L,P,V t7
… 6
Exemple 2 (transvaser 3 récipients) t0
Soient 3 récipients A, B et C de capacités 8, 5 et
3 litres respectivement. Le récipient A est rempli 8/0/0
d’un liquide, les deux autres (B et C) sont vides. t7 t1
Comment utiliser les récipients B et C pour 4/4/0 3/5/0
répartir ce liquide en deux quantités égales de 4
litres ? Utiliser un graphe pour représenter la
solution de ce problème. t6 t2
b b c e
d c
(c, d, e, a ) est un chemin
a d f
(b,a,d,c,e) est une chaine
Circuit : c’est un chemin fermé
Cycle : c’est une chaine fermée
e a
b b c e
d c
(e, c, d, e) est un circuit
a d f
(c,e,f,d) est un cycle
Graphe Heulerien et Hamiltonien 8
Un chemin simple (resp. un circuit) ne passe Deux arcs u1(x1,y1) et u2(x2,y2) sont parallèles
qu’une seule fois par chacun de ses arcs. si x1=x2 et y1=y2.
Un chemin élémentaire (resp. un circuit) ne
u1 a1
passe qu’une seule fois par chacun de ses b b
sommets.
a u2 a a2
b
f e a
a d
b
c e
d c
Graphe non connexe
Par exemple, il y a pas de chaine entre b et f Graphe non fortement connexe
Par exemple, pas de chemin entre b et e
Ce graphe admet 2 composantes connexes
{a,b,c,d} et {e,f}
Représentation Informatique d’un Graphe 5 b 2
3
b a
7 c
4
a d 1
c
Cas de graphe valué
d
Liste des arcs : On ajoute une 3° ligne au tableau
Cas de graphe non valué pour contenir les valeurs des arcs
b c d b e g
c h j
e f g h i a
f i
j k d
Un Arbre Un Réseau
{a} est la racine, {e,f,g,j,k,i} sont les feuilles {a} : entrée du réseau, { j } : sortie du réseau
Une Foret
Applications des Graphes 14
L’arbre couvrant, eg. optimiser la connexion Problème de coloriage : utiliser un nombre
des quartiers d’une ville par la fibre optique minimum de couleurs
1
3 8 2
1 2
4 7 3
7
8 6
6 5 4
5
Passages de la fibre Coloriage d’une carte
Les rues d’une ville Modélisation
optique géographique
par un graphe
(arbre couvrant) Forte Connexité : placer des sens uniques dans
Plus court chemin : routage de paquets de une ville en garantissant un chemin entre tous ses
données transitant par un réseau (internet) quartiers :
b c b c
2 b 7
a a
a 7 6 j
1
4 6 c 5 3 d e d e
d 8 f
e f f
9 6 g g
Le plus court chemin entre a et j est (a,b,f,j) h h
Avant (rues a double sens) Après (rues à sens uniques)
… 15
Graphe planaire : conception de circuit Réseau (problème de flot maximum) :
électronique intégré, les liens entre les acheminer une quantité maximale entre A et B
composants ne doivent pas se croiser. en respectant les contraintes [min,max] du
réseau.
[0,4] [2,3]
[1,4] b d f [0,5]
a b a b
a [1,3]
[1,2] [3,6] h
[2,7] [8,10]
c e [7,10]
g
[2,8]
d c d c
Conception erronée Conception correcte Ordonnancement des tâches : Chemin critique
(1) fondations Sommet : fin d’une tâche
Graphe biparti : affectations des taches T1…Tm à (2) gros œuvres Valeur d’un arc : durée
des processus P1…Pk (3) électricité d’une tâche
(4) chauffage central
(5) peinture extérieur 7
P1 P3 2
P2 (6) peinture intérieur 40
5 5
10
40 45
0 1 3 6
T1 T2 T3 T4 3
50
4
2 – Les Arbres et Arborescence en
Théorie des Graphes
Université Alger 1, Dept Maths & Informatique
1
Février 2017
Un Arbre 2
Les arbres sont des graphes particuliers, très On appelle feuille d’un arbre un sommet
utilisés en algorithmique et en informatique. adjacent à une seule arête.
Soit G=(X,U) un graphe d’ordre 𝑛 = 𝑋 et de Une forêt est un graphe, dont chaque
taille 𝑚 = 𝑈 . composant connexe est un arbre. Autrement dit
une forêt est un graphe acyclique.
G est arbre s’il est connexe et acyclique (c.-à-d.
sans cycle). Sur ordinateur, une forêt peut être représentée à
l’aide de 2 tableaux :
Un arbre vérifie les propriétés suivantes :
NA : nombre d’arêtes de chaque arbre de la forêt
1. Le nombre d’arcs 𝑚 = 𝑛 − 1
AR : les arêtes des arbres
2. Si on supprime un arc, le graphe G sera
Exemple : Soit la foret suivante :
déconnecté ( ne sera plus connexe).
a d
On peut la
3. Si on ajoute un arc, G devient cyclique. h
sauvegarder sur
ordinateur sous e g
G1 G2 G3 G4 b c
forme de : i
f
NA 2 3 1
Exemples d’arbres
a a e e e h
AR
b c d f g I
Arbre Couvrant 3
Lorsque on élimine quelques arêtes d’un graphe Soit G=(X,U,W) un graphe valué où W={w1,…wm}
G, on obtient un graphe partiel de G. sont les poids des arêtes.
7 d
Lorsque on élimine quelques sommets de G et a 2 3
8
les arêtes associées, on obtient un sous graphe 4
8 c 6
de G. 9 e
b
a d a d d 4 f 5
Graphe Valué
b e b e b 7
a d a d
2 3
c c c 8
f f f c 4 c 6
6
Graphe Initial Graphe Partiel Sous Graphe 9 e e
b b
f 5 4 f
Un arbre T=(XT,UT) est un arbre couvrant du Arbre couvrant Arbre couvrant
graphe G=(X,U) si T est un graphe partiel de G c- de poids w=30 de poids w=24
à-d 𝑋𝑇 = 𝑋 et 𝑈𝑇 ⊂ 𝑈
Un arbre couvrant de poids minimum n’est pas
a d a d forcement unique.
b e b e Un arbre couvrant de poids min est unique si
pour chaque sommet du graphe G, ses arêtes
c c ont des poids distincts.
f f
Graphe G Arbre Couvrant de G
Une Arborescence 4
Dans le cas d’un graphe orienté, si un arbre Une arborescence k-aire est un arbre orienté
possède un seul sommet sans dont chaque sommet a au plus k successeurs :
prédécesseurs, ce sommet est appelé ses fils.
racine, et l’arbre est dit enraciné, ou bien Quand k=2, l’arbre est binaire.
une arborescence.
Niveau 0 a
a
Niveau 1 b c
b c d
Niveau 2 d e f g
e f g h i j k l
Niveau 3 h i j k l
Une chaine reliant la racine d’un arbre à Dans une arborescence, un niveau est un
une feuille est appelé une branche. ensemble de nœuds qui sont équidistants de la
racine. La racine se trouve au niveau 0.
Dans une arborescence, il existe un chemin
La hauteur (ou profondeur) d’un arbre est le
unique de la racine vers tous les autres nombre d’arcs sur un chemin de longueur
sommets. maximale.
… 5
Représentation Informatique des Arbres : Quelques Applications des Arbres Couvrants :
Sur ordinateur, un arbre peut être représenté Connecter économiquement un ensemble de
de différentes manières selon le contexte : stations : terminaux, téléphones, usines, etc.
c 2 f 9 i 1 l
L = {hl}.
Ajoutons L à F, on obtient :
F={{ab, ad, bf, cf, dg, gh, eh, hl, jk, kl, il} }
La Complexité d’un Algorithme Exponentielle
11
Complexité temporelle : c’est le nombre O(n)
d’instructions nécessaires à l’exécution d’un
algorithme. On note c(n)
Complexité spatiale : c’est l'espace mémoire
nécessaire au stockage des données de
l'algorithme.
Exemple : Rechercher le minimum d’un tableau de
𝑛 entiers.
Dans le pire des cas, il faut 𝑛 affectations et 𝑛 −
1 tests, soit c 𝑛 = 𝑛 + 𝑛 − 1 = 2𝑛 − 1.
Cet algorithme est de complexité linéaire, on Exemple : Considérons un PC pour lequel durée
note cette complexité par O(n). exécution d’une instruction élémentaire = 0,001 s
Quelques classes de Complexités : Complexité de Temps D’Exécution sur Machine
c(n) Notation Complexité l’Algorithme n =10 n = 1000
𝑐 𝑛 =𝑐 O(1) Constante log 𝑛 0,001s 0,003 s
𝑛 0,003 s 0,032 s
𝑐 𝑛 = 2𝑛 + 1 O(n) Linéaire
𝑛 0,01s 1s
𝑐 𝑛 = log 𝑛 O(log n) Logarithmique n² 0,1s 17 min
𝑐 𝑛 = 𝑛3 + 2𝑛 + 4 O(n3) Polynomiale 𝑛3 1s 12 jours
𝑐 𝑛 = 𝑎𝑛 + 3𝑛2 − 5 O(an) Exponentielle 𝑛4 10 s 32 ans
2𝑛 1,024 s 3,4 *10287 millénaires
… 12
Complexité de l’algorithme Kruskal : Complexité de l’algorithme Bovurka :
Le tri des arêtes est la partie qui consomme La boucle externe de l’algorithme prend O(log
le plus de temps dans cet algorithme. n) itérations,
En incluant la boucle interne , l’algorithme prend
Avec un algorithme de tri rapide, le tri des
O(m log n).
arêtes peut se faire en m log m opérations
pour les m arêtes du graphe.
Donc, la complexité de l’algorithme de
Kruskal est O(m log m).
Algorithme de Prim (1957) 13
Procédure Prim (Arbre couvrant de poids minimum) Exemple : Utiliser l’algorithme de Prim pour retrouver
un arbre couvrant de poids minimum du graphe
Input : G=(X,U,W) // le graphe valué suivant : 8 7
b d g
Output : A // l’arbre couvrant
9
4 2
On pose 𝐴 = ∅ , 𝑆 = 𝑥1 // 𝑥1 premier sommet de X 11 4
a e i
Tant que 𝑆 < 𝑋 faire
7 6
• Sélectionner l’arête 𝑢 = 𝑥, 𝑦 ∈ 𝑈 de poids 8 10
minimum telle que 𝑥 ∈ 𝑆 et 𝑦 ∈ 𝑋/𝑆
c 1
f 2
h
• 𝑆=𝑆∪ 𝑦 Solution
• 𝐴=𝐴∪ 𝑢
Fin tant que Initialisation : 𝐴 = ∅ , 𝑆 = 𝑎
Itération 1 : 𝑆 = 1 < 9 = 𝑋
8 7
b d g
Compléxité : O(|X|²)
9
4 2
Mais on peut améliorer cette complexité avec certaines
techniques algorithmiques. 11 4
a e i
7 6
𝑢 = 𝑎, 𝑏 8 10
𝑆 = 𝑆 ∪ 𝑏 = 𝑎, 𝑏 c f h
1 2
𝐴 = 𝐴 ∪ 𝑢 = 𝑎𝑏
… 14
Itération 2 : 𝑆 = 2 < 9 Itération 4 : 𝑆 = 4 < 9
8 7 8 7
b d g b d g
9 9
4 2 4 2
11 4 11 4
a e i a e i
7 6 7 6
8 8 10
𝑢 = 𝑎, 𝑐 10
𝑆 = 𝑆 ∪ 𝑐 = 𝑎, 𝑏, 𝑐 c f 2
h c 1
f 2
h
1
𝐴 = 𝐴 ∪ 𝑢 = 𝑎𝑏, 𝑎𝑐 𝑢 = 𝑓, ℎ
𝑆 = 𝑆 ∪ 𝑐 = 𝑎, 𝑏, 𝑐, 𝑓, ℎ
Itération 3 : 𝑆 = 3 < 9 𝐴 = 𝐴 ∪ 𝑢 = 𝑎𝑏, 𝑎𝑐, 𝑐𝑓, 𝑓ℎ
8 7
b d g Itération 5 : 𝑆 = 5 < 9 8 7
9 b d g
4 2
9
4 2
11 4
a e i 11 4
7 6 a e i
8 10 7 6
8
c f 2
h 10
𝑢 = 𝑐, 𝑓 1
c f h
𝑆 = 𝑆 ∪ 𝑐 = 𝑎, 𝑏, 𝑐, 𝑓 𝑢 = ℎ, 𝑑 1 2
𝐴 = 𝐴 ∪ 𝑢 = 𝑎𝑏, 𝑎𝑐, 𝑐𝑓 𝑆 = 𝑆 ∪ 𝑐 = 𝑎, 𝑏, 𝑐, 𝑓, ℎ, 𝑑
𝐴 = 𝐴 ∪ 𝑢 = 𝑎𝑏, 𝑎𝑐, 𝑐𝑓, 𝑓ℎ, 𝑑ℎ
… 15
Itération 6 : 𝑆 = 6 < 9 Itération 8 : 𝑆 = 8 < 9 8 7
b
8 7 b d g
d g
9
9 4 2
4 2
11 4
11 4 e i
a e i a
7 6
7 6 8
8 10
10
c f h 𝑢 = 𝑔, 𝑖 c 1
f 2
h
1 2
𝑢 = 𝑑, 𝑒 𝑆 = 𝑆 ∪ 𝑐 = 𝑎, 𝑏, 𝑐, 𝑓, ℎ, 𝑑, 𝑒, 𝑔, 𝑖
𝑆 = 𝑆 ∪ 𝑐 = 𝑎, 𝑏, 𝑐, 𝑓, ℎ, 𝑑, 𝑒 𝐴 = 𝐴 ∪ 𝑢 = 𝑎𝑏, 𝑎𝑐, 𝑐𝑓, 𝑓ℎ, 𝑑ℎ, 𝑑𝑒, 𝑑𝑔, 𝑔𝑖
𝐴 = 𝐴 ∪ 𝑢 = 𝑎𝑏, 𝑎𝑐, 𝑐𝑓, 𝑓ℎ, 𝑑ℎ, 𝑑𝑒 Itération 9 : 𝑆 = 9 ≮ 9 ⇒ 𝑓𝑖𝑛
Itération 7 : 𝑆 = 7 < 9 b d
7
g
8 7
b d g 9
4 2
9
4 2 4
11 4 a e i
a e i
8
7 6
8 10 c 1
f 2
h
𝑢 = 𝑑, 𝑔 c 1
f 2
h Le poids de cet arbre couvrant est
𝑆 = 𝑆 ∪ 𝑐 = 𝑎, 𝑏, 𝑐, 𝑓, ℎ, 𝑑, 𝑒, 𝑔
w = 4 + 8 + 1 + 2 + 4 + 2 + 7 + 9 = 37
𝐴 = 𝐴 ∪ 𝑢 = 𝑎𝑏, 𝑎𝑐, 𝑐𝑓, 𝑓ℎ, 𝑑ℎ, 𝑑𝑒, 𝑑𝑔
Code C pour l’algorithme de Prim 16
#include <stdio.h> int charger_fichier_donnees()
#include <stdlib.h> { FILE *f;
char nom_fichier[80];
#define Max 20 int i,j;
#define Inf 99999 printf("\n\nAlgorithme de PRIM (arbre couvrant de poids
minimum)");
double G[Max][Max], poids; printf("\n*********************************************
int A[Max][2], S[Max], T[Max]; ********");
int n_G, n_A, n_S, n_T; printf("\n\n\tFichier de donnees : ");
int a_min, b_min, indice; scanf("%s",nom_fichier);
if ( ( f=fopen(nom_fichier, "r") ) == NULL)
{ printf("\n\n\tFichier de donnees incorrect.");
int charger_fichier_donnees(); return 0;
void afficher_matrice_adjacence(); }
void initialiser_variables(); else
int detecte_arete_minimale(); { fscanf(f,"%d",&n_G);
int prim(); for(i=1; i<=n_G; i++)
void afficher_arbre_couvrant(); for(j=1; j<=n_G; j++) fscanf(f, "%d",
&G[i][j]);
}
return 1;
}
void afficher_matrice_adjacence()
{ int i,j;
int main() printf("\n\n\tNombre de sommets = %d",n_G);
{ printf("\n\n\tMatrice d'adjacence :");
if (! charger_fichier_donnees() ) exit(0);
afficher_matrice_adjacence(); for(i=1; i<=n_G; i++)
prim(); { printf("\n");
afficher_arbre_couvrant(); for(j=1; j<=n_G; j++) printf("\t%d",G[i][j]);
return 1; }
} }
… 17
void initialiser_variables() int prim()
{ int i,j; {
for(i=1; i <= n_G; i++) initialiser_variables();
for(j=1; j <= n_G; j++) while(n_S < n_G)
if(G[i][j] == 0) G[i][j] = Inf; {
detecte_arete_minimale();
S[1] = 1;
n_S = 1; A[++n_A][1] = a_min;
A[n_A][2] = b_min;
for(i=1; i <= n_G - 1 ; i++) T[i] = i+1; S[++n_S] = b_min;
n_T = n_G - 1; for(int j=indice; j <= n_T - 1; j++) T[j] = T[j+1];
n_T--;
n_A = 0; poids = poids + G[a_min][b_min];
poids= 0; }
} return 1;
}
int detecte_arete_minimale()
{ int a, b, i,j; void afficher_arbre_couvrant()
double v_min = Inf; {
printf("\n\n\tArbre couvrant de poids minimum : ");
for(i=1; i <= n_S; i++) for(int i=1; i <= n_A; i++) printf("\n\t%d,
{ a = S[i]; %d",A[i][1],A[i][2]);
for(j=1; j <= n_T; j++) printf("\n\n\tPoids de l'arbre : %d",poids);
{ b = T[j]; }
if( G[a][b] < v_min)
{ v_min = G[a][b];
a_min = a;
b_min = b;
indice = j;
}
}
}
return 1;
}
Exécution du programme C 18
Les données (matrice d’adjacence) sont Etape 2 : on exécute le programme C. Apres le
sauvegardées sur un fichier texte, puis on lance lancement, on saisit le nom du fichier de données :
le programme C précèdent en lui indiquant le
fichier de données sur lequel il doit travailler.
Exemple : Reprenons le graphe à 9 sommets de la
page Algorithme de Prim
Etape 1: on crée un fichier texte nommé
graphe1.txt, contenant :
sur la première ligne : on saisit le nombre de
sommets du graphe (9 dans ce cas)
juste après, on saisit la matrice d’adjacence du Le résultat suivant sera affiché :
graphe comme suit :
3 – Problème du Plus Court
Chemin en Théorie des Graphes
Université Alger 1, Dept Maths & Informatique
1
Avril 2017
Introduction 2
Problématique : Il y a 2 classes d’algorithmes :
Soit un graphe orienté et valué G=(X,U,W). Classe P1 : Trouver les plus courts chemins entre
un sommet source s et les autres sommets du
Il peut y avoir plusieurs chemins entre deux graphe :
sommets x et y.
Algorithme de Dijkstra
Trouver le chemin le plus court entre x et y.
Algorithme de Bellman
Applications:
Classe P2 : Trouver les plus courts chemins entre
Optimiser le trafic urbain tous les couples de sommets du graphe :
Navigation des rebots Algorithme de Dantzig
Traitement de texte (Latex) Algorithme de Floyd
Conception des cartes électroniques
Appels de fonctions dans les algorithmes Notation : Selon le besoin, on note
avancés Les valeurs des arcs 𝑢, ⋯ , 𝑢𝑚 ∈ 𝑈 par 𝑤1 , ⋯ , 𝑤𝑚
Routage des messages dans les avec 𝑊 = 𝑤1 , ⋯ , 𝑤𝑚 .
télécommunications • La valeur de l’arc 𝑥, 𝑦 ∈ 𝑈 est notée par 𝑤(𝑥, 𝑦)
Quelques Résultats 3
Un circuit absorbant est un circuit dont la longueur Lemme : Si on a
totale est inférieure à 0.
1. G est un graphe simple non orienté connexe, et
4 La longueur du
c 2. 𝑤𝑖 > 0 pour toutes les arêtes,
2 e circuit (c,e,d,c) est w
a = 4-2-3 = -1 alors P1 et P2 ont une solution à partir de tout
-3 -2 circuit absorbant sommet de G.
9
Remarque : Cette solution n’est pas
2 d
nécessairement unique.
-5 La longueur du circuit
b (a,d,b,a) est w = 9-5+2 = 6
circuit non absorbant
Théorème : Tout sous-chemin 𝑥𝑖 ⋯ 𝑥𝑗 d’un chemin
optimal 𝑥1 ⋯ 𝑥𝑖 ⋯ 𝑥𝑗 ⋯ 𝑥𝑘 est un chemin optimal
entre 𝑥𝑖 et 𝑥𝑗 .
Théorème 1: Le problème P1 admet une solution
dans le graphe G=(X,U,W) à partir d’un sommet
𝑠 ∈ 𝑋 si et seulement si
Théorème : La suite 𝐷 1 , ⋯ , 𝐷(𝑛) représente les plus
1. Il existe un chemin entre s et tous les autres courtes distances de la source s vers les autres
sommets, et sommets si et seulement si
2. G est sans circuit absorbant. 1. 𝐷 1 = 0, et
2. 𝐷(𝑦) ≤ 𝐷 𝑥 + 𝑤 𝑥, 𝑦 , ∀(𝑥, 𝑦) ∈ 𝑈.
Algorithme de Dijkstra (1959) 4
Il permet de résoudre P1 pour 𝑤𝑖 > 0 pour tous les i. Exemple 1 : Appliquer l’algorithme de Dijkstra pour
retrouver les plus courts chemins entre le sommet 𝑎
Procedure Dijkstra : Recherche des Plus Courts et les autres sommets du graphe suivant :
Chemins
5 6
a c e
Input: G(X,U,W) et s 7 5
6
Output: D et P 3 2 3 2
• 𝐷 𝑠 = 0 et 𝐷 𝑥 = ∞ pour 𝑥 ∈ 𝑋/𝑥 b 2
d f g
9 1
• ∀ 𝑥 ∈ 𝑋, 𝑃 𝑥 = ∅
•𝐹=𝑋 1iere approche : Graphique
b d f g b d f
2 9 1 2 9 1 g
∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞
3a 6a 3a 6a 8c 12c
5b 5b
… 6
Itération 5 : Résultat de l’algorithme
∞ ∞ 0 5
0 11
5a 11c 5 6
a
5
c
6
e a c e
6 7 5 3 3
3 2 3 2
b d b d f g
2
f g 2 1
9 1 3 5 8 9
∞ ∞ ∞ ∞
3a 6a 8c 12c
5b 9f
Itération 6 : a 𝒃 𝒄 𝒅 𝒆 𝒇 𝒈
∞ ∞
0
D 0 3 5 5 11 8 9
5a 11c
5 6
a c e P ∅ a a b c c f
6 7 5
3 2 3 2
b 2
d f g
9 1
∞ ∞ ∞ ∞
3a 6a 8c 12c
5b 9f
… 7
2ieme approche : Tableau
5 6 a 𝒃 𝒄 𝒅 𝒆 𝒇 𝒈
a c e
7 5 D 0 3 5 5 11 8 9
6
3 2 3 2
P ∅ a a b c c f
b 2
d f g
9 1
a b c d e f g 0 5 11
5 6
0 ∞ ∞ ∞ ∞ ∞ ∞ a c e
a 0 𝟑𝒂 𝟓𝒂 𝟔𝒂 ∞ ∞ ∞ 3 3
b 0 𝟑𝒂 𝟓𝒂 𝟓𝒃 ∞ ∞ ∞ b d f g
2 1
3 5 8 9
c 0 𝟑𝒂 𝟓𝒂 𝟓𝒃 𝟏𝟏𝒄 𝟖𝒄 𝟏𝟐𝒄
d 0 𝟑𝒂 𝟓𝒂 𝟓𝒃 𝟏𝟏𝒄 𝟖𝒄 𝟏𝟐𝒄
f 0 𝟑𝒂 𝟓𝒂 𝟓𝒃 𝟏𝟏𝒄 𝟖𝒄 𝟗𝒇
g 0 𝟑𝒂 𝟓𝒂 𝟓𝒃 𝟏𝟏𝒄 𝟖𝒄 𝟗𝒇
… 8
Exemple 2 : Appliquer l’algorithme de Dijkstra pour
déterminer les plus courts chemins en partant du a 𝒃 𝒄 𝒅 𝒆 𝒇 𝒈
sommet 𝑎 du graphe ci-dessous : f D 0 4 3 9 7 11 12
5 2
b d
6 3
P ∅ a a b a d e
11 10
4 2 11
c
3 8 g f
4 9 2
5
a e 5 b d
7
Solution :
3
a b c d e f g 4 12
c
0 ∞ ∞ ∞ ∞ ∞ ∞ 3
7 g
a 0 𝟒𝒂 𝟑𝒂 ∞ 𝟕𝒂 ∞ ∞ a e 5
7
0
c 0 𝟒𝒂 𝟑𝒂 𝟏𝟒𝒄 𝟕𝒂 ∞ ∞
b 0 𝟒𝒂 𝟑𝒂 𝟗𝒃 𝟕𝒂 ∞ ∞
Complexité : La complexité temporelle de
e 0 𝟒𝒂 𝟑𝒂 𝟗𝒃 𝟕𝒂 ∞ 𝟏𝟐𝒆 l’algorithme de Dijkstra est O(|X|²).
d 0 𝟒𝒂 𝟑𝒂 𝟗𝒃 𝟕𝒂 𝟏𝟏𝒅 𝟏𝟐𝒆
f 0 𝟒𝒂 𝟑𝒂 𝟗𝒃 𝟕𝒂 𝟏𝟏𝒅 𝟏𝟐𝒆
Algorithme de Bellman (1956) 9
Procedure Bellman : Recherche des Plus Courts L’algorithme de Bellman (appelé aussi
Chemins algorithme de Bellman-Ford) retrouve les plus
Input: G(X,U,W) et s courts chemins à partir d’un sommet de départ
Output: D et P même si certains arcs portent des valeurs
• 𝐷 𝑠 = 0 et 𝐷 𝑥 = ∞ pour 𝑥 ∈ 𝑋/𝑥 négatives.
• ∀ 𝑥 ∈ 𝑋, 𝑃 𝑥 = ∅ Son principe : pour chaque sommet du graphe,
// Rechercher les plus courts chemins on parcourt séquentiellement tous les arcs pour
Pour i allant de 1 à |X|-1 Faire voir si on peut améliorer les distances.
Pour tout arc (𝑢, 𝑣) ∈ 𝑈 Faire
Si 𝐷 𝑣 > 𝐷 𝑢 + 𝑤(𝑢, 𝑣) Alors La deuxième partie de l’algorithme vérifie s’il
𝐷 𝑣 = 𝐷 𝑢 + 𝑤(𝑢, 𝑣) n’existe pas de circuit absorbant dans le graphe.
𝑃 𝑣 =𝑢 Remarque : Cet algorithme peut s’arrêter avant la
Fin Si (|X|-1)ieme itération si à l’issue d’une itération
Fin Pour 𝑘 < |𝑋| − 1, on n’arrive pas à améliorer la distance
Fin Pour d’aucun des sommets.
// Détecter circuit absorbant
Pour tout arc (𝑢, 𝑣) ∈ 𝑈 Faire
Si 𝐷 𝑢 + 𝑤 𝑢, 𝑣 < 𝐷 𝑣 Alors Complexité : La complexité de l’algorithme de
Retourner « Il existe un circuit absorbant » Bellman est O(|X|3).
Fin SI
Fin Pour
Retourner « Pas de circuit absorbant »
… 10
,
Exemple 1 : Appliquer l’algorithme de Bellman A chaque itération, le parcourt séquentiel des
pour retrouver les plus courts chemins entre le arcs de ce graphe doit se faire dans l’ordre
sommet 𝑎 et les autres sommets du graphe suivant :
suivant : a 5 c
6
e
ab, ac, ad,
6 7 5 ba, bd,
3 2 3 2
ca, cd, ce, cf, cg,
b d f g
2 9 1 da, db, dc, df,
ec, ef,eg
Solution
fc, fd, fe, fg
Initialisation : On initialise 𝐷 𝑎 = 0 et 𝐷 𝑥 = ∞
pour les autres sommets gc, ge, gf
0 ∞ ∞
5 6
a c e
6 7 5
3 2 3 2
b 2
d f g
9 1
∞ ∞ ∞ ∞
… 11
, approche : Graphique
1iere l’arête (a,d), on améliore D(d) : D(d) = 6
∞
0 5a ∞
Itération 1 : On parcourt toutes les arêtes du 5 6
graphe pour voir si on peut améliorer certaines a c e
7 5
distances : 3
6
2 3 2
6 7 5
3 2 3 2
l’arête (b,a), aucune amélioration
b d f g
∞
2
∞
9
∞
1 l’arête (b,d), on améliore D(d) : D(d) = 3+2=5
∞
3a
∞
0 5a ∞
Avec l’arête (a,c), ∞
on améliore D(c) : D(c) = 5 5 6
0
a c e
5a ∞
5 6 6 7 5
a c e 3 2 3 2
6 7 5
3 2 2 b d
3
2
f g
9 1
∞ ∞ ∞ ∞
b 2
d f g 3a 6a
9 1
∞ ∞ ∞ ∞ 5b
3a
… 12
, Arête (c,a), aucune amélioration Arête (c,g), on améliore D(g) : D(g) = 5+7=12
∞ ∞
Arête (c,d), aucune amélioration 0 5a 11c
5 6
Arête (c,e), on améliore D(e): D(e)=5+6=11 a c e
6 7 5
∞ ∞ 3 2 3 2
0 5a 11c
5 6 b d
a c e 2
f g
9 1
∞ 6a ∞ ∞
6 7 5
3 2 2 3a 5b 8c 12c
3
b 2
d f g Les arêtes (d,a), (d,b), (d,c), (d,f) : aucune
9 1
∞ 6a ∞ ∞ amélioration
3a 5b
Arête (c,f), on améliore D(f) : D(f) = 5+3=8 Les arêtes (e,c), (e,f), (e,g) : aucune amélioration
Les arêtes (f,c), (f,d), (f,e), aucune amélioration
∞ ∞
0 5a 11c
5 6
a c e
6 7 5
3 2 3 2
b 2
d f g
9 1
∞ 6a ∞ ∞
3a 5b 8c
… 13
Arête (f,g), on améliore D(g) : D(g)=8+1=9 Les arêtes (c,a), (c,d), (c,e), (c,f), (c,g) : aucune
∞ ∞ amélioration
0 5a 11c
5 6 Les arêtes (d,a), (d,b), (d,c), (d,f) : aucune
a c e
amélioration
6 7 5
3 2 3 2
Les arêtes (e,c), (e,f), (e,g) : aucune amélioration
b 2
d f g Les arêtes (f,c), (f,d), (f,e), (f,g) : aucune
9 1
∞ 6a ∞ 12c amélioration
3a 5b 8c 9f
Les arêtes (g,c), (g,e), (g,f) : aucune Les arêtes (g,c), (g,e), (g,f) : aucune
amélioration amélioration
L’itération 2 n’améliore aucune distances D(x), on
arrête donc l’algorithme à ce niveau. Et comme le
Itération 2 : On parcourt à nouveau toutes les arêtes
nombre d’itération 𝑖 = 2 < |𝑋| − 1 = 7 − 1 = 6, la
du graphe pour voir si on peut améliorer certaines
solution obtenue est optimale.
distances :
Les chemins obtenus sont :
Les arêtes (a,b), (a,c), (a,d) : aucune
amélioration a 𝒃 𝒄 𝒅 𝒆 𝒇 𝒈
Les arêtes (b,a), (b,d) : aucune amélioration D 0 3 5 5 11 8 9
P ∅ a a b c c f
… a b c d e f g
14
ab 3
2° approche : Tableau
ac 5
On affiche seulement les arcs qui améliorent les
0 ∞ ∞ ad 6
distances. 5 6
a c e
bd 5
6 7 5
3 2 3 2 ce 11
b 2
d f g cf 8
9 1
∞ ∞ ∞ ∞
Initialisation : cg 12
fg 9
a b c d e f g
Itération 2 :
0 ∞ ∞ ∞ ∞ ∞ ∞
On parcourt à nouveaux tous les 24 arêtes du
graphe. On constate qu’aucun d’eux n’améliore la
Itération 1 : distance d’un sommet. On arrête donc à cette
itération. Cette solution est optimale.
a 𝒃 𝒄 𝒅 𝒆 𝒇 𝒈
D 0 3 5 5 11 8 9
P ∅ a a b c c f
… Itération 1 :
15
a b c d e f g
Exemple 2 (avec circuit absorbant) : Utiliser
0 ∞ ∞ ∞ ∞ ∞ ∞
l’algorithme de Bellman pour retrouver les plus
courts chemins partant du sommet 𝑎 pour le graphe ab 4
ci-dessous : ac 3
5
b d bd 9
11 3
4 6 ce 11
c 2 -10 f df 12
a 3
8 eg 13
g 5
-7 gd 3
2
e
Solution
Itération 2 :
Initialisation :
a b c d e f g
0 4 3 3 11 12 13
a b c d e f g df 6
0 ∞ ∞ ∞ ∞ ∞ ∞ fg 11
gd 1
… b
5
d
Itération 4 :
16
11 3 a b c d e f g
4 6
0 4 3 -1 11 4 9
c 2 -10 f
a 3 df 2
8
g 5 fg 7
-7
2 gd -3
e
Itération 3 : Itération 5 :
a b c d e f g a b c d e f g
0 4 3 1 11 6 11 0 4 3 -3 11 2 7
df 4 df 0
fg 9 fg 5
gd -1 gd -5
… 5
b d 17
11 3
4 6 Itération 7 :
c 2 -10 f a b c d E f g
a 3
8
5
0 4 3 -7 11 -2 3
g
-7 df -4
2
e fg 1
Itération 6 : gd -9
a b c d e f g
Cette 7° itération améliore les distances, donc il y a
0 4 3 -5 11 0 5 un circuit absorbant dans ce graphe.
df -2
fg 3
gd -7
1
Mai 2017
Flot dans un Réseau 2
Un réseau est un graphe orienté et valué 2) Le flot qui traverse un sommet 𝑥 est conservé c-
G=(X,U,W) ayant deux sommets particuliers : la à-d :
2/3 3/5
source 𝒔 et le puit 𝒕. 𝑓(𝑦, 𝑥) = 𝑓(𝑥, 𝑦) 5/5
2
5 6
𝑦∈𝑑− 𝑥 𝑦∈𝑑+ 𝑥 5/5
1/4
7 3 4
Flot Flot
4 5 entrant= 8 sortant= 8
1
Un flot est une quantité de matière 3) Le flot total 𝑓 envoyé de la source 𝑠 arrive au
puits 𝑡 c-à-d
(marchandise, eau, électricité, information, etc.)
envoyée par le sommet s, elle traverse certains 𝑓= 𝑓(𝑠, 𝑦) = 𝑓(𝑦, 𝑡)
arcs du graphe, pour atteindre le puits t. 𝑦∈𝑑+ 𝑠 𝑦∈𝑑− 𝑡
2/2
2/5 3/6
Un flot réalisable vérifie les 3 contraintes suivantes : Notation : La matrice des flots élémentaire est
𝐹 = [𝑓𝑖𝑗 ] où 𝑓𝑖𝑗 est le flot de l’arc (𝑖, 𝑗) ∈ 𝑈. On a bien
1) Le flot 𝑓(𝑢) qui traverse l’arc 𝑢 ∈ 𝑈 vérifie la 𝑛 𝑛
contrainte de capacité :
𝑓= 𝑓𝑖𝑗
0 ≤ 𝑓(𝑢) ≤ 𝑤(𝑢) 𝑖=1 𝑗=1
Exemple de Flot 3
Soit le réseau de distribution d’eau suivant : Réseau avec plusieurs Sources/puits :
𝑓(𝑧, 𝑡) = 3 + 2 = 5
𝑓′ = 𝑓 + 𝜀 𝑓′ = 𝑓 + 𝜀
2
Coupe Minimale et Flot Maximum 5
3
6
5
7 4
Une coupe (𝑌, 𝑌 ) est définie par l’ensemble 4 5
𝑌 ⊂ 𝑋 et son compliment 𝑌 tel que 1
Corolaire : S’il existe un flot 𝐹 ∗ et une coupe 𝑌 ∗ tel 0/7 0/3 1/4
que 𝑓 ∗ = 𝑤 𝑌 ∗ , 𝑌 ∗ alors le flot 𝐹 est maximal. 𝑌 ∗ est 4/4
3/3 𝑓𝑡 =6
appelée coupe minimale. 4/5
Origine - s 0/2
0/8 0/6
𝜀 ∞ 2 0/10
0/10
𝑓=0
0/9
Il n y a plus de chaine améliorante, le flot obtenu
est maximal 2/3
0/10
0/10 𝑓=4
0/9
… Itération 4 :
10
Itération 2 : Sommet s c a d t
Origine - s -c a d
Sommet s a c d b t
𝜀 ∞ 10 2 2 𝜀 =2
Origine - s a c d b 4/4
10/10
𝜀 ∞ 6 2 2 2 𝜀=2 10/10
6/8 6/6
4/4 0/2
6/10
6/10 2/10
2/10 𝑓 = 10 + 2 = 12
0/8 2/6 2/9
2/2
0/10
0/10 𝑓 =4+2=6 Itération 5 :
2/9
Sommet s c d t
Itération 3 :
Origine - s c d
Sommet s a d b t 𝜀 ∞ 8 7 𝜀 =7
Origine - s a d b 4/4
10/10
𝜀 ∞ 4 4 4 𝜀 =4 10/10
6/8 6/6
4/4 0/2
10/10 9/10
10/10 9/10 𝑓 = 12 + 7 = 19
4/8 6/6 9/9
2/2
Il n’y a plus de chaine améliorante, ce flot est max.
0/10
0/10 𝑓 = 6 + 4 = 10
2/9 D’ailleurs la coupe 𝑌 = {𝑠, 𝑎, 𝑐} est de capacité 19.
5 – Méthodes d’Ordonnancement
en Théorie des Graphes
Université Alger 1, Dept Maths & Informatique
1
Mai 2017
Méthode PERT 2
PERT = Program Evaluation and Review Le graphe PERT :
Technique.
représente les taches et les dépendances
Méthode développée en 1958 aux USA. entre elles;
Elle permet d’optimiser la gestion des tâches affiche une date de début au plutôt et une
d’un grand projet impliquant des milliers de date au plus tard pour chaque tâche;
personnes et de taches.
détermine un chemin critique qui
La méthode PERT implique : conditionne la durée minimale du projet;
un découpage du projet en tâches précises; montre les tâches critiques qu’il faut réaliser
l’estimation des durées de chaque tache; absolument dans leurs temps, sinon tout le
projet sera retardé.
détermination des prédécesseurs de chaque
tache.
Une tâche non critique peut être retardée dans la
limite de la marge calculée sans impacter la durée
La 1iere application a permis de réduire le délai totale du projet.
de réalisation d’un projet de 7 à 4 ans.
Conventions de la Méthode PERT Le graphe PERT démarre toujours par l’étape
3
D (ou Début) et se termine par l’étape F (Fin).
Une tâche est représentée par une étiquette sur
une flèche. L’étiquette indique le code de la D F
tâche et sa durée.
𝐵30
Deux tâches, ou leurs successeurs, ne peuvent pas
La tâche B ci-dessous dure 30 jours. On note être raccordées aux mêmes étapes de départ et
𝑤(𝐵) = 30 de fin.
Une étape : représente le début où la fin d’une A10
tâche. Elle est visualisée par un cercle ayant 3 𝟐 𝟑 C25
portions : B20
𝑥 : numéro de l’étape (facultatif)
𝒙 Erreur
𝑡1 : date au plutôt
𝒕𝟏 𝒕𝟐 𝑡2 : date au plus tard
Pour y remédier, il faut ajouter une tâche fictive en
pointillés de durée 0.
La tâche C10 démarre à l’étape 3 et se termine 𝟐 A10 𝟑 C25
à l’étape 5. 3 C10 5
4
Une Etape peut recevoir et 4
Correct
émettre plusieurs tâches :
…
Exemple 1 : Soit les taches suivantes d’un projet Calcul des dates au plutôt :
4
Tâches Prédécesseurs Durées Etape 𝐷, on pose 𝑡1 (𝐷) = 0.
A - 2 Etape 𝑦 : 𝑡1 (𝑦) = max
−
𝑡1 (𝑥) + 𝑤(𝑥, 𝑦) .
𝑥∈𝑑 (𝑦)
B - 3
1
C A 4 2 Etape 1 : 0 +2 = 2
D Etape 2: 0 + 3 = 3
D B 2 3 E1 F
0 6 7
Etape 3 : max{2+4; 3+2} = 6
E C, D 1 Etape F : 6+1=7
2
Le graphe PERT 1 3
correspondant est :
D 3 F
E1
Calcul des date au plus tard :
2
Etape 𝐹 : 𝑡2 (𝐹) = 𝑡1 (𝐹) (ici, 𝑡2 𝐹 = 7).
Etape 𝑥 : 𝑡2 (𝑥) = min 𝑡2 𝑦 − 𝑤(𝑥, 𝑦)
Sur le graphe, on constate bien que : +
𝑦∈𝑑 (𝑥)
Tâches Prédécesseurs Durées Les tâches de Niveau 2 sont celles dont les
prédécesseurs sont ceux de Niveau 1.
A - 5
Les tâches de Niveau 3 sont celles dont les
B D 3 prédécesseurs sont ceux de Niveau 2. Etc.
C D 6
D - 2 Tâches Prédécesseurs Niveaux Successeurs
E B, H 3 A - Niveau 1 G
1
F C 1 B D Niveau 2 E
G A 2 C D1 Niveau 2 F, H
H C 2 D - Niveau 1 B, C
2
E B, H3 Niveau 4 -
Remarque : A priori, ce projet peut durer 24 jours (la F C
2
Niveau 3 -
somme des durées.
G A1 Niveau 2 -
Solution : D’abord, on détermine les niveaux et les 2
successeurs de chaque tâche. H C Niveau 3 E
… 3) On ajoute les tâches de niveau 3, soient F et H
comme successeurs de C. Puis on ajoute E (niveau 6
Construction progressive du graphe PERT : 4) comme successeur de B et H.
1) On commence par les tâches de niveau1, soient
A et D, qu’on raccorde au sommet Départ (D).
D
B E F
D
H
H2
4
Attention : A chaque fois, on doit s’assurer que les tâches de
niveau k-1 soient connectées à leurs successeurs de niveau k.
… • Une étape critique 𝑥 vérifie 𝑡1 (𝑥) = 𝑡2 (𝑥) 7
• La marge 𝑚(𝑢) d’une tâche 𝑢 comprise entre les
Calcul des dates au plutôt (𝒕𝟏 ) : étapes 𝑥 et 𝑦 est : 𝑚(𝑢) = 𝑡2 (𝑦) − 𝑤(𝑢) − 𝑡1 (𝑥)
Etape D : 0 1
Etape 1 : 0 +5 = 5 5 La tâche 𝑢 commence au plutôt à 𝑡1 (𝑥), et au plus tard à
𝑡2 (𝑥). Elle se termine au plutôt à 𝑡1 (𝑦), et au plus tard à
𝑡2 (𝑦). 1
D
3 E3 F 5 11
0 B3
10 13
2
2 D
Etape 2: 0 + 2 = 2 3 E3 F
H2 0 0 B3
Etape 4 : 2 + 6 = 8 10 10 13 13
2
Etape 3 : max{2+3; 8+2} = 10 4 2 2
Etape F : max{5+2; 10+3; 8+1} = 13 8 H2
Calcul des marges :
4
Calcul des dates au plus tard (𝒕𝟐 ) : 𝑚 𝐴 = 11 − 5 − 0 = 6
8 8
𝑚 𝐷 =2−2−0=0
Etape F : 13
Etape 1 : 13 - 2 = 11 𝑚 𝐺 = 13 − 2 − 5 = 6 𝑚 𝐻 = 10 − 2 − 8 = 0
1 𝑚 𝐵 = 10 − 3 − 2 = 5
Etape 3 : 13 - 3 = 10 𝑚 𝐸 = 13 − 3 − 10 = 0
5 11
𝑚 𝐶 =8−6−2=0 𝑚 𝐹 = 13 − 1 − 8 = 4
D Interprétation :
0 0 3 E3 F
B3 o La durée minimale du projet est 13 jours.
10 10 13 13
2 o Le chemin critique est composé des tâches D, C, H, E.
2 2 o Un retard sur ces tâches va retarder tout le projet.
H2
Etape 4 : min{13-1; 10-2} = 8 o La tâche non critique A (resp G, B, F) peut être retarder
Etape 2 : min{10-3; 8-6} = 2 4 de 6 jours (resp 6, 5, 4 jours) sans impacter la durée du
Etape D : min{11-5; 2-2} = 0 8 8 projet.
… 8
Exemple 3 : Utiliser la méthode PERT pour optimiser Solution :
la gestion du projet suivant:
Tableau des niveaux et des successeurs :
Tâches Prédécesseurs Durées Tâches Prédécesseurs Niveaux Successeurs
A - 6 A - Niveau 1 C, E, G
B - 2 B - Niveau 1 G
C A 3 C A1 Niveau 2 D, F
D C 4 D C2 Niveau 3 I
E A 1 E A1 Niveau 2 F
2
F C, E 7 F C, E 2 Niveau 3 I
G A, B 2 G A,1 B1 Niveau 2 H
H G 3 H G2 Niveau 3 -
I D, F 4 I D,3 F 3 Niveau 4 -
F
D A’0
D
2) On passe aux tâches de niveau 2, c-à-d C, E et G. 4) On passe à la tâche I de niveau 4, qui est le
On a G successeur de A, on les lie par une tâche successeur de D et F.
fictive A’0.
C’0
F
A’0 D A’0
D
G G
Calcul des dates au plus tard (𝒕𝟏 ) : 10
… Etape F : 20 Etape 3 : min{16-4; 9-0} = 9
Etape 6 : 20 - 3 = 17 Etape 1 : min{9-3; 9-1; 15-0} = 6
5) On affiche les durées de chaque tâche, et on Etape 5 : 20 - 4 = 16 Etape D : min{6-6; 15-2} = 0
numérote les étapes. 3 Etape 4 : 16 - 7 = 9 3
Etape 2 : 17 - 2 = 15 9 9
1 5 1 5
C’0 C’0 16 16
6 6
4 F 4 F
D A’0 D A’0
9 9 20 20
0 0
2 G2 6 2 G2 6
6 15 8 17
Tâche A
A
Tâche B
Tâche C B
Tâche D
C
Tâche E
Temps D
A A, 6
1 5
6 6
C’0 16 16 B B, 2
C C, 3
4 F
D A’0 D D, 4
9 9 20 20
0 0 E E, 1
F F, 7
2 G2 6
6 15 G G, 2
8 17
H H, 3
Considérons que le projet démarre le 01/03/2017. I I, 4
La date de Début de chaque tâche correspond à 𝑡2
de l’étape qui la précède.
Tâches Prédécesseurs Durées 𝑡2 Débuts
La tâche critique A doit absolument démarrer le
A - 6 0 01/03/2017 01/03/2017 pour éviter un retard au projet.
B - 2 0 01/03/2017 La tâche non critique B peut commencer à
C A 3 6 07/03/2017 n’importe quel jour, l’essentiel est qu’elle se
D C 4 9 10/03/2017 termine au plus tard le 07/03/2017 afin d’éviter
E A 1 6 07/03/2017
tout retard au projet.
F C, E 7 9 10/03/2017
G A, B 2 15 16/03/2017
H G 3 17 18/03/2017
I D, F 4 16 17/03/2017