Chap 4-Graphes

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 8

UEF212 : Algorithmique et Complexité 2ème Année Tronc Commun Ingénieur en Informatique - S3

CHAPITRE 4 : LES GRAPHES

Plan
1. Introduction aux graphes
2. Définitions
3. Représentation des graphes
4. Parcours des graphes
5. Problème des chemins optimaux

1. Introduction aux graphes


Les graphes sont actuellement l’outil privilégié pour modéliser des ensembles de structures complexes.
Ils sont indispensables pour représenter et étudier des relations entre les objets.

Les graphes sont utilisés en :


 Economie (diagramme d’organisation)
 Electronique (circuits intégrés)
 Base de données (liens entre informations)
 Communications (réseaux de télécommunications)
 Transport (réseaux routiers)
 Ordonnancement (structure des projets)
 Etc.

x3 x2
2. Définitions
x1
2.1 Graphes orientés (Directed Graphs)
x4 x5
- Un graphe 𝑮 est un couple (𝑿, 𝑼) où :
 𝑋 est un ensemble {𝑥1 , … , 𝑥𝑛 } de nœuds ou sommets.
 𝑈 = {𝑢1 , 𝑢2 , … , 𝑢𝑚 } est une famille de couples ordonnées de sommets appelées arcs.

- Un graphe est dit valué s’il  une application 𝐶 : 𝑈 → 𝑅, associant à chaque arc 𝑢 un réel 𝑐𝑢 .

- Une boucle est un arc reliant un nœud à lui-même.

- Chaque arc 𝑢 = (𝑥, 𝑦) a deux extrémités appelées initiale (𝑥) et terminale (𝑦). 𝑢 est dit incident
intérieurement à 𝑥 et incident extérieurement à 𝑦.

- Dans un arc de la forme (𝑥, 𝑦), 𝑥 est appelé prédécesseur de 𝑦 et 𝑦 est dit successeur de 𝑥.
𝑥 et 𝑦 sont appelés sommets voisins (ou adjacents).

- L’ensemble des successeurs de 𝑥 est noté 𝛤(𝑥) et celui de ses prédécesseurs est noté 𝛤 − (𝑥).

- Le nombre de successeurs de 𝑥 est appelé demi degré extérieur et est noté 𝑑𝐺+ (𝑥) = |𝛤(𝑥)|.
Le demi degré intérieur de 𝑥 est défini comme étant 𝑑𝐺− (𝑥) = |𝛤 − (𝑥)|. Le degré de 𝑥 est défini
comme suit : 𝑑𝐺 (𝑥) = 𝑑𝐺+ (𝑥) + 𝑑𝐺− (𝑥).

USTO MB – Faculté des Mathématiques & Informatique, Département Informatique 42


UEF212 : Algorithmique et Complexité 2ème Année Tronc Commun Ingénieur en Informatique - S3

- La densité d’un graphe est définie par le rapport 𝒎/𝒏² c'est-à-dire le nombre actuel d’arcs de 𝐺
divisé par le nombre maximum d’arcs que peut avoir 𝐺. La plupart des graphes rencontrés en
pratique ne sont pas très dense (à faible densité). Ils sont appelés creux (en Anglais sparse).

2.2 Graphes non orientés


Dans les applications où on s’intéresse uniquement aux paires de sommets reliées et non à leurs
orientations, on parle de graphes non orientés. Dans ce type de graphe, on parle d’une arête (edge en
Anglais) 𝑒 = [𝑥, 𝑦] au lieu de l’arc (𝑥, 𝑦). Un graphe non orienté est noté 𝐺 = (𝑋, 𝐸) où 𝐸 désigne une
famille d’arêtes. Les termes qui s’appliquent aux graphes orientés et sont indépendants de l’orientation
restent valables pour les graphes non orientés.

2.3 Parcours
- On appelle chemin 𝜇 de longueur 𝑝 toute suite de 𝑝 arcs (𝑢1 , … , 𝑢𝑝 ) telle que l’extrémité initiale
de 𝑢𝑖 est égale à l’extrémité terminale de 𝑢𝑖−1 ∀ 𝑖 > 1, et l’extrémité terminale de 𝑢𝑖 est égale à
l’extrémité initiale de 𝑢𝑖+1 ∀ 𝑖 < 𝑝.

- On appelle circuit tout chemin fermé, c'est-à-dire un chemin tel que 𝑢1 = 𝑢𝑝 .

- Un arc est un chemin de longueur 1 et une boucle est un circuit de longueur 1 aussi.

- Si le graphe est non orienté, on parle de chaine au lieu de chemin, et de cycle au lieu de circuit.

- Un parcours est un élément de l’ensemble des chemins, circuits, chaînes et cycles.

2.4 Graphes particuliers


- Un graphe orienté 𝐺 = (𝑋, 𝑈) est dit symétrique si (𝑥, 𝑦) ∈ 𝑈 ⇒ (𝑦, 𝑥) ∈ 𝑈. Les graphes non
orientés peuvent être représentés par des graphes orientés symétriques.

- Le graphe complémentaire de 𝐺 = (𝑋, 𝑈) est le graphe 𝐻 = (𝑋, 𝑋 2 − 𝑈).

- Un graphe est dit complet si toute paire de sommets est connectée par un arc ou une arête.

3. Représentation des graphes

3.1 Matrice d’adjacence


Considérons un graphe orienté 𝐺 = (𝑋, 𝑈) dont le nombre de sommets est 𝑛 et celui des arcs étant 𝑚.
Une matrice d’adjacence est une matrice 𝑀 (𝑛 × 𝑛) dont les éléments sont booléens indiquant si les
sommets correspondants sont reliés.

Un graphe valué 𝐺 = (𝑋, 𝑈, 𝑊) peut être représenté par une matrice 𝑊 (𝑛 × 𝑛) qui donne à la fois les
coûts des arcs et fait fonction de la matrice d’adjacence. Les matrices d’adjacence permettent de
détecter les boucles, la symétrie ainsi que la connectivité. On peut facilement à l’aide de cette structure
de données obtenir la liste des successeurs d’un sommet ainsi que celle de ses prédécesseurs.
Cependant, ces structures ne sont pas adéquates pour les graphes dont la densité est faible.

USTO MB – Faculté des Mathématiques & Informatique, Département Informatique 43


UEF212 : Algorithmique et Complexité 2ème Année Tronc Commun Ingénieur en Informatique - S3

Exemple : Le graphe donné en exemple à la section 2.1. est représenté par la matrice d’adjacence M :
𝑥1 𝑥2 𝑥3 𝑥4 𝑥5
𝑥1 0 0 0 0 0
𝑥2 1 0 1 0 0
𝑥3 0 0 1 1 0
𝑥4 0 0 1 0 1
𝑥5 0 0 0 0 0

3.2 Listes d’adjacence

a. Listes Contigües
Les listes d’adjacence implémentent la structure 𝐺 = (𝑋, 𝛤) où les sommets sont rangés
consécutivement dans des tableaux ou bien dans des listes chaînées. Dans le cas des tableaux, on note
par Succ le tableau dont les éléments sont les listes des successeurs des sommets 0,1, … , 𝑛 − 1 dans
l’ordre, c'est-à-dire 𝛤(0), 𝛤(1), … , 𝛤(𝑛 − 1). Le nombre d’éléments de Succ est donc le nombre d’arcs
du graphe à savoir 𝑚. Pour délimiter ces listes successives des successeurs, on fait usage d’une structure
Tête sous forme de tableau à 𝑛 éléments, qui donne pour chaque sommet l’indice dans le tableau Succ
où commence ses successeurs. En effet, les successeurs d’un sommet 𝑦 sont rangés dans Succ de
Tete[y] à Tete[y+1]-1. Dans le cas où un sommet 𝑦 n’a pas de successeurs, on pose Tete[y]=Tete[y+1].

Les graphes non orientés sont codés comme des graphes orientés symétriques. Si [𝑥, 𝑦] est une arête, 𝑥
apparaît dans la liste des successeurs de 𝑦, et 𝑦 dans celle de 𝑥. Dans le cas d’un graphe valué 𝐺 =
(𝑋, 𝑈, 𝑊), on fait usage d’un tableau de poids W en regard du tableau Succ.

L’avantage majeur de ce codage étant sa compacité. En effet, un graphe consomme 𝑛 + 𝑚 + 1 mots


mémoire qui est bien moins que 𝑛² mots d’une matrice dans le cas où 𝐺 n’est pas dense.

Exemple : (Graphe section 2.1)

1 2 3 4 5 6
1 1 3 5 7 7 Tete

1 3 3 4 3 5 Succ
1 2 3 4 5 6

b. Listes Chaînées
Le même principe peut être appliqué en utilisant des listes chaînées comme suit :
Tete
1 null

2 1 3 null

3 3 4 null

4 3 5 null

5 null

Là aussi, il y a lieu d’ajouter pour chaque bloc une case supplémentaire dans le cas de graphe valué pour
stocker le poids de l’arc.

USTO MB – Faculté des Mathématiques & Informatique, Département Informatique 44


UEF212 : Algorithmique et Complexité 2ème Année Tronc Commun Ingénieur en Informatique - S3

4. Parcours des graphes


4.1 Construction des listes de prédécesseurs
a. Représentation en matrice d’adjacence
Soit 𝑀 la matrice d’adjacence d’un graphe G d’ordre 𝑛. Les successeurs d’un sommet quelconque 𝑖
peuvent être obtenus en parcourant la ligne 𝑖 de la matrice 𝑀 en 𝑂(𝑛) opérations. Les prédécesseurs
sont obtenus en parcourant la colonne 𝑖 également en 𝑂(𝑛).

b. Représentation en listes d’adjacence


Pour les graphes de faible densité, il est avantageux de coder le graphe par des structures linéaires
représentant les listes d’adjacence. En effet, la structure nécessite seulement 𝑂(𝑚 + 𝑛) mots-mémoire
et la liste des successeurs ne nécessite que 𝑂(𝑑 + (𝑖)) opérations. Cependant, les listes d’adjacence ne
peuvent pas être manipulées efficacement pour retrouver la liste des prédécesseurs d’un sommet 𝑖.
Pour retrouver la liste des prédécesseurs, il faut balayer tout le graphe pour détecter les sommets dont 𝑖
est successeur et ceci nécessite 𝑂(𝑚) opérations et 𝑂(𝑛𝑚) opérations pour construire les listes des
prédécesseurs de tous les sommets. Dans le cas où la liste des prédécesseurs est requise fréquemment,
il est plus avantageux, en termes de complexité temps, de construire le graphe inverse 𝐺 − de 𝐺 où les
listes des successeurs ne sont autres que les listes de prédécesseurs dans 𝐺. Dans ce cas on consomme
2(𝑚 + 𝑛) mots pour les deux graphes, mais c’est nettement inférieur à 𝑛² pour les graphes de faible
densité.

4.2. Exploration des Graphes


L’exploration consiste à déterminer l’ensemble des descendants d’un sommet 𝑠, c'est-à-dire l’ensemble
des sommets situés sur des chemins d’origine s. Le principe de l’exploration d’un graphe peut être décrit
comme suit : Au début on marque le sommet s, ensuite à chaque fois qu’on rencontre un arc (𝑥, 𝑦) avec
𝑥 marqué et 𝑦 non marqué, on marque alors 𝑦.

a. Exploration en largeur (BFS : Breadth-First Search)


Dans ce type d’exploration, on implémente l’ensemble des sommets marqués comme étant une file 𝐹.
Les sommets sont marqués par ordre de nombre d’arcs croissant à s : on commence par les successeurs
de s, puis les successeurs des successeurs de s, etc. Un sommet 𝑥 en tête de la file 𝐹 reste tant que ses
successeurs ne sont pas examinés. Pendant ce temps, tout successeur de 𝑥 non marqué est marqué et
rangé en fin de 𝐹.

Algorithme :
Marquer s ; Enfiler(F,s)
Repeter …………………………………………………………………………………………………………………N
x = Defiler(F)
pour tout successeur y non marqué de x ……………………………d+(i) = M
Enfiler(F,y)
Marquer y
Finpour
Jusqu’à FileVide(F)

Complexité : O(N+M)  O(M)

b. Exploration en Profondeur (DFS : Depth-First Search)


Il s’agit cette fois ci d’implémenter l’ensemble des sommets marqués comme étant une pile 𝑃 et
l’exploration progresse en se déplaçant le plus loin possible le long d’un chemin dont 𝑠 est l’origine
avant de rebrousser chemin. La pile 𝑃 contient les sommets explorés et permet à la procédure de
rebrousser chemin.

USTO MB – Faculté des Mathématiques & Informatique, Département Informatique 45


UEF212 : Algorithmique et Complexité 2ème Année Tronc Commun Ingénieur en Informatique - S3

Algorithme :
Marquer s ; Empiler(P,s)
Repeter
Tant qu’il y a un successeur y à TetePile(P) et non marqué faire
Marquer y
Empiler(P,y)
Fintq
x = Depiler(P)
Jusqu’à PileVide(P)

Idem pour la complexité que BFS.

c. Exemple
Soit un graphe G orienté, dont les sommets sont (s1, s2, s3, s4, s5, s6) représenté par la matrice
d’adjacence suivante. Donner les ordres de parcours en largeur BFS et en profondeur DFS, à partir du
sommet s1.
0 1 1 0 0 1
1 1 0 1 1 0
1 0 0 1 1 0
𝐴=
0 1 1 1 0 1
0 1 1 0 0 1
[0 0 0 1 1 1]

BFS :
s5
s6 s4 s5
File
s3 s6 s4 s5 File
s1 s2 s3 s6 s4 s5 Vide
Sommets Marqués s1 s2,s3,s6 s4,s5

Ordre de défilement : s1,s2,s3,s6,s4,s5

DFS :

s6
s5 s5 s5
Pile s3 s3 s3 s3 s3
s4 s4 s4 s4 s4 s4 s4
s2 s2 s2 s2 s2 s2 s2 s2 s2 Pile
s1 s1 s1 s1 s1 s1 s1 s1 s1 s1 s1 Vide
Sommets Marqués s1 s2 s4 s3 s5 s6

Ordre de dépilement : s6,s5,s3,s4,s2,s1

USTO MB – Faculté des Mathématiques & Informatique, Département Informatique 46


UEF212 : Algorithmique et Complexité 2ème Année Tronc Commun Ingénieur en Informatique - S3

5. Problème des chemins optimaux


5.1. Typologie, algorithmes et applications des problèmes des chemins optimaux
Soit 𝐺 = (𝑋, 𝐴, 𝑊) un graphe orienté valué et considérons le coût d’un chemin comme étant la somme
des coûts de ses arcs. Les principaux problèmes consistent à trouver des chemins de coût minimal. Dans
ce contexte, il y a lieu de distinguer les trois problèmes suivants :

1. Soient s, t deux sommets, trouver un plus court chemin de s à t.


2. Trouver un plus court chemin de s vers tout autre sommet de 𝐺.
3. Trouver un plus court chemin entre tout couple de sommets.

Dans cette section, on s’intéressera au second problème en calculant pour chaque sommet 𝑥 la valeur
du plus court chemin du sommet de départ vers 𝑥 ; V[x], appelée aussi étiquette ou label.
Il existe une famille d’algorithmes qui calculent V[x] d’une manière définitive pour chaque sommet 𝑥.
Ces algorithmes sont appelés à fixation d’étiquettes et le plus répandu de cette classe est l’algorithme
de Dijkstra. D’autres algorithmes affinent jusqu'à la dernière itération l’étiquette de chaque sommet x.
Cette classe est appelée à correction d’étiquettes. Il y a lieu de distinguer les cas suivants :

- Cas 𝑊 constante. Le problème se réduit à celui de la recherche des chemins contenant le plus
petit nombre d’arcs qui peut être résolu par une exploration en largeur.

- Cas 𝑊 ≥ 0. Le problème peut être résolu par l’algorithme de Dijkstra qui est du type à fixation
d’étiquettes et dont la complexité est 𝑂(𝑛²). Il existe une implémentation en structure de tas
dont la complexité est 𝑂(𝑛 𝑙𝑜𝑔 𝑛) .

- Cas 𝑊 quelconque. Il existe un algorithme dû à Bellman du type à correction d’étiquettes et dont


le principe repose sur la programmation dynamique. La complexité étant 𝑂(𝑛𝑚) qui peut être
réduite à 𝑂(𝑚) lorsque le graphe G ne contient pas de circuits.

Les applications des problèmes des chemins optimaux sont nombreuses et diverses. Dans le domaine
des transports, par exemple, on s’intéresse aux chemins optimaux d’une ville 𝑥 à une autre ville 𝑦. Dans
le routage du trafic réseau, on parle des protocoles OSPF (open shortest path first).

5.2. Algorithme de DIJKSTRA


Il fait partie des algorithmes à fixation d’étiquettes et ne peut être appliqué que pour les graphes à
valuations positives. L’algorithme fixe l’étiquette de chaque sommet x à chaque itération en mettant à
jour un tableau de booléens.

Lors de sa phase d’initialisation, l’algorithme initialise un tableau V à ∞, P à zéros et D à faux. Pour un


sommet donné s, on initialise V[s] à zéro et P[s] à s. L’itération principale de l’algorithme est constituée
de deux boucles. La première consiste à trouver un sommet non encore fixé de l’ensemble V qui est
minimal. Pour cela, la valeur ∞ est d’abord affectée à Vmin, ensuite pour tout y allant de 1 à 𝑛 dont D[y]
est faux et V[y] strictement inférieure à la valeur Vmin, l’algorithme conserve y dans une variable x et
affecte V[y] à Vmin. Dans le cas où Vmin n’est pas ∞, D[x] est remplacé par vrai. La seconde boucle
consiste à parcourir tous les sommets k successeurs de x pour mettre à jour la liste des successeurs. Si
V[x] +W[k] est inférieur à V[y] alors V[x] + W[k] est affectée à V[y]. Finalement, x est affecté à P[y].

USTO MB – Faculté des Mathématiques & Informatique, Département Informatique 47


UEF212 : Algorithmique et Complexité 2ème Année Tronc Commun Ingénieur en Informatique - S3

Algorithme de Dijkstra
s : sommet de départ
Initialiser le tableau V à +∞ //Valeur des plus court chemins
Initialiser le tableau P à 0 //Détail des chemins (Path)
V[s]=O
P[s]=s
Répéter
// Chercher sommet non fixé de V minimal
Vmin=+
Pour i=1 à n faire
Si (i non fixé et V[i]<Vmin) alors x=i; Vmin=V[i] fsi
Finpour
Si Vmin<+
Fixer x
// Mise à jour des successeurs
Pour chaque successeur y de x faire
Si V[x]+W[x][y] < V[y]
V[y] = V[x]+W[x][y];
P[y] = x
Fsi
Finpour
Fsi
Jusqu’à Vmin=+

La complexité de l’algorithme de Dijkstra dans le pire des cas est 𝑂(𝑛²). Elle peut être améliorée en
O(nlogn) en utilisant un tas pour représenter le tableau V.

Exemple : Soit le graphe orienté valué représenté par la figure suivante. Dérouler l’algorithme de
Dijkstra en prenant comme sommet de départ 1.

USTO MB – Faculté des Mathématiques & Informatique, Département Informatique 48


UEF212 : Algorithmique et Complexité 2ème Année Tronc Commun Ingénieur en Informatique - S3

Tableau V (Values)
Sommets
1 2 3 4 5 6
Marqués
0 ∞ ∞ ∞ ∞ ∞ 1
4 1 2 ∞ ∞ 3
4 2 5 7 4
4 5 7 2
5 7 5
6 6
Résultat
0 4 1 2 5 6
Final

Tableau P (Paths)
1 2 3 4 5 6
1 0 0 0 0 0
1 1 1 3 3
5

On en déduit que les chemins optimaux à partir du sommet 1 sont :


1→1 0
1→2 4
1→3 1
1→4 2
1→3→5 5
1→3→5→6 6

USTO MB – Faculté des Mathématiques & Informatique, Département Informatique 49

Vous aimerez peut-être aussi