Aller au contenu

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 :

Python
#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 :

Python
#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).