les graphes
1) introductionâïž
Imaginez un rĂ©seau social ayant 6 abonnĂ©s (A, B, C, D, E et F) oĂč :
- A est ami avec B, C et D
- B est ami avec A et D
- C est ami avec A, E et D
- D est ami avec tous les autres abonnés
- E est ami avec C, D et F
- F est ami avec E et D
La description de ce rĂ©seau social, malgrĂ© son faible nombre d'abonnĂ©s, est dĂ©jĂ quelque peu rĂ©barbative, alors imaginez cette mĂȘme description avec un rĂ©seau social comportant des millions d'abonnĂ©s !
Il existe un moyen plus "visuel" pour reprĂ©senter ce rĂ©seau social : on peut reprĂ©senter chaque abonnĂ© par un cercle (avec le nom de l'abonnĂ© situĂ© dans le cercle) et chaque relation "X est ami avec Y" par un segment de droite reliant X et Y ("X est ami avec Y" et "Y est ami avec X" Ă©tant reprĂ©sentĂ© par le mĂȘme segment de droite).
Voici ce que cela donne avec le réseau social décrit ci-dessus :
2) notion de graphesâïž
Ce genre de figure s'appelle un graphe. Les graphes sont des objets mathĂ©matiques trĂšs utilisĂ©s, notamment en informatique. Les cercles sont appelĂ©s des sommets et les segments de droites qui relient 2 sommets des arĂȘtes.
Plus formellement on dira qu'un graphe G est un couple G = (V,E) avec V un ensemble de sommets et E un ensemble d'arĂȘtes.
Autre utilisation possible des graphes : les logiciels de cartographie (ces logiciels sont souvent utilisĂ©s couplĂ©s Ă des rĂ©cepteurs GPS). Ces logiciels de cartographie permettent, connaissant votre position grĂące Ă un rĂ©cepteur GPS, d'indiquer la route Ă suivre pour se rendre Ă un endroit B. Comment modĂ©liser l'ensemble des lieux et des routes ? Simplement Ă l'aide d'un graphe ! Chaque lieu est un sommet et les routes qui relient les lieux entre eux sont des arĂȘtes.
Soit les lieux suivants : A, B, C, D, E, F et G.
Les différents lieux sont reliés par les routes suivantes :
- il existe une route entre A et C
- il existe une route entre A et B
- il existe une route entre A et D
- il existe une route entre B et F
- il existe une route entre B et E
- il existe une route entre B et G
- il existe une route entre D et G
- il existe une route entre E et F
Ici aussi, la représentation sous forme de graphe s'impose :
ProblÚme : avec cette représentation du réseau routier sous forme de graphe, il est impossible de tenir compte des routes en sens unique (par exemple il est possible d'aller de A vers D mais pas de D vers A)
Voici de nouvelles contraintes :
- il existe une route entre A et C (double sens)
- il existe une route entre A et B (sens unique B->A)
- il existe une route entre A et D (sens unique A->D)
- il existe une route entre B et F (sens unique B->F)
- il existe une route entre B et E (sens unique E->B)
- il existe une route entre B et G (double sens)
- il existe une route entre D et G (double sens)
- il existe une route entre E et F (double)
Pour tenir compte de ces nouvelles contraintes, on utilisera un graphe orienté :
Dans un graphe orientĂ©, les arĂȘtes possĂšdent une orientation. Ces "arĂȘtes orientĂ©es" sont souvent appelĂ©es "arcs". On dira qu'un graphe orientĂ© G est un couple G = (V,A) avec V un ensemble de sommets et A un ensemble d'arcs.
Parfois il est intĂ©ressant d'associer aux arrĂȘtes ou aux arcs des valeurs, on parle alors de graphes pondĂ©rĂ©s. Si nous revenons Ă notre "graphe cartographie", il est possible d'associer Ă chaque arĂȘte la distance en Km entre les 2 lieux :
Il est aussi possible d'associer Ă chaque arĂȘte la durĂ©e du trajet entre 2 points :
En fonction du choix fait par le conducteur (trajet le plus court "en distance" ou trajet le plus court "en temps"), l'algorithme permettant de déterminer le "chemin le plus court entre 2 points" travaillera sur le graphe "graphe pondéré (Km) cartographie" ou sur le graphe "graphe pondéré (minutes) cartographie". à noter que le "graphe pondéré (minutes) cartographie" peut évoluer au cours du temps en fonction du trafic routier : une application comme Waze utilise les données en provenance des utilisateurs de l'application afin de mettre à jour en temps réel leur "graphe pondéré (minutes) cartographie".
Pour terminer avec ces généralités sur les graphes, voici 2 définitions qui nous seront utiles par la suite :
- Une chaine est une suite d'arĂȘtes consĂ©cutives dans un graphe, un peu comme si on se promenait sur le graphe. On la dĂ©signe par les lettres des sommets qu'elle comporte.
- Un cycle est une chaine qui commence et se termine au mĂȘme sommet.
3) implĂ©mentation des graphesâïž
Il existe deux méthodes permettant d'implémenter un graphe : les matrices d'adjacences et les listes d'adjacences.
a) implĂ©mentation d'un graphe Ă l'aide d'une matrice d'adjacenceâïž
Une matrice est un tableau à double entrée :
La matrice A ci-dessus est constituĂ© de 5 lignes et 4 colonnes. On appelle matrice carrĂ©e une matrice qui comporte le mĂȘme nombre de lignes et de colonnes. Les matrices d'adjacences sont des matrices carrĂ©es.
Reprenons l'exemple du "graphe cartographie" :
Voici la matrice d'adjacence de ce graphe :
Comment construire une matrice d'adjacence ?
Il faut savoir qu'Ă chaque ligne correspond un sommet du graphe et qu'Ă chaque colonne correspond aussi un sommet du graphe. Ă chaque intersection ligne i-colonne j (ligne i correspond au sommet i et colonne j correspond au sommet j), on place un 1 s'il existe une arĂȘte entre le sommet i et le sommet j, et un zĂ©ro s'il n'existe pas d'arĂȘte entre le sommet i et le sommet j.
- Il existe une arĂȘte entre le sommet E et le sommet F, nous avons donc placĂ© un 1 Ă l'intersection de la ligne E et de la colonne F (il en est de mĂȘme Ă l'intersection de la ligne F et de la colonne E)
- Il n'existe pas d'arĂȘte entre le sommet D et le sommet C, nous avons donc placĂ© un 0 Ă l'intersection de la ligne D et de la colonne C (il en est de mĂȘme Ă l'intersection de la ligne C et de la colonne D)
Il est aussi possible d'Ă©tablir une matrice d'adjacence pour un graphe orientĂ©. Le principe reste le mĂȘme : si le sommet i (ligne) est liĂ© au sommet j (colonne), nous avons un 1 Ă l'intersection (0 dans le cas contraire).
Il est aussi possible d'utiliser une matrice d'adjacence pour implémenter un graphe pondéré : on remplace les 1 par les valeurs liées à chaque arc.
Il est assez simple d'utiliser les matrices d'adjacence en Python grùce aux tableaux de tableaux vus l'année derniÚre :
#matrice d'ajacence
m = [[0, 1, 1, 1, 0, 0, 0],
[1, 0, 0, 0, 1, 1, 1],
[1, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 1],
[0, 1, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 1, 0, 0],
[0, 1, 0, 1, 0, 0, 0]]
b) implĂ©mentation d'un graphe Ă l'aide de listes d'adjacenceâïž
Pour commencer, on définit une liste des sommets du graphe. à chaque élément de cette liste, on associe une autre liste qui contient les sommets lié à cet élément :
Reprenons l'exemple du "graphe cartographie" :
Voici la liste d'adjacence de ce graphe :
Pour les graphes orientés, il est nécessaire de définir 2 listes : la liste des successeurs et la liste des prédécesseurs. Soit un arc allant d'un sommet A vers un sommet B (flÚche de A vers B). On dira que B est un successeur de A et que A est un prédécesseur de B.
liste d'adjacence successeurs du graphe orienté cartographie :
liste d'adjacence prédécesseurs du graphe orienté cartographie :
Il est possible de travailler avec des listes d'adjacences en Python en utilisant les dictionnaires :
#liste d'ajacence
l = {'A':('B','C','D'), 'B':('A', 'E', 'F', 'G'), 'C':('A'), 'D':('A', 'G'), 'E':('B', 'F'), 'F':('B', 'E'), 'G':('B', 'D')}
c) matrice d'adjacence ou liste d'adjacence ?âïž
Comment choisir l'implémentation à utiliser (matrice d'adjacence ou liste d'adjacence) ?
- le choix se fait en fonction de la densitĂ© du graphe, c'est-Ă -dire du rapport entre le nombre d'arĂȘtes et le nombre de sommets. Pour un graphe dense on utilisera plutĂŽt une matrice d'adjacence.
- certains algorithmes travaillent plutÎt avec les listes d'adjacences alors que d'autres travaillent plutÎt avec les matrices d'adjacences. Le choix doit donc aussi dépendre des algorithmes utilisés (nous aurons trÚs prochainement l'occasion d'étudier plusieurs de ces algorithmes).