Graphes & Chemins
Temps de lecture25 minEn bref
Résumé de l’article
Dans cet article, vous apprendrez ce que sont les graphes et comment ils peuvent fournir un cadre mathématique unifié pour de nombreux problèmes. Vous découvrirez également la notion de chemins dans les graphes, qui sera centrale pour le projet.
Points clés à retenir
-
Les graphes sont des structures mathématiques composées de sommets et d’arêtes.
-
Ils peuvent être représentés graphiquement ou à l’aide d’une matrice d’adjacence.
-
Un chemin est une séquence ordonnée d’arêtes distinctes dans le graphe.
Contenu de l’article
Vidéo
Veuillez consulter la vidéo ci-dessous (en anglais, affichez les sous-titres si besoin). Nous fournissons également une traduction du contenu de la vidéo juste après, si vous préférez.
Important
Certains « codes » apparaissent dans cette vidéo. Veuillez garder à l’esprit que ce sont des pseudo-codes, c’est-à-dire qu’ils ne sont pas écrits dans un langage de programmation réel. Ça ressemble à du Python, mais ça n’est pas du Python !
Leur but est simplement de décrire les algorithmes sans se soucier des détails de la syntaxe d’un langage de programmation particulier. Vous devrez donc effectuer un peu de travail pour les rendre pleinement fonctionnels en Python si vous souhaitez les utiliser dans vos programmes.
Information
Pour aller plus loin
Compter les marches entre deux sommets
Un problème intéressant en théorie des graphes est de compter le nombre de marches possibles d’une longueur fixe entre deux sommets choisis.
Pour simplifier, considérons un graphe sans poids ni arêtes orientées. Sa matrice d’adjacence ${\bf A}$ contient donc uniquement des 1 et des 0. Le résultat suivant s’applique :
Soit ${\bf M}^k$ la puissance matricielle $k$ d’une matrice ${\bf M}$, et notons ${\bf M}[u, v]$ l’entrée de la matrice ${\bf M}$ située à l’intersection de sa $u^{\text{ème}}$ ligne et de sa $v^{\text{ème}}$ colonne. Le nombre de marches de longueur $k$ allant du sommet $u$ au sommet $v$ est égal à ${\bf A}^k[u, v]$.
Démonstration
Le lemme des poignées de main
Le degré d’un sommet $v$, noté $\deg(v)$, est le nombre d’arêtes qui contiennent $v$. Par exemple, dans un labyrinthe, le degré d’une case est le nombre de cases voisines accessibles sans traverser de mur. Il vaut donc au plus 4.
Un résultat très simple, mais très utile, relie les degrés des sommets au nombre d’arêtes. Pour tout graphe $G = (V, E)$ :
$$\sum\limits_{v \in V} \deg(v) = 2|E|$$Ce résultat porte le nom de lemme des poignées de main : si plusieurs personnes se serrent la main lors d’une réunion, et que chacune compte le nombre de mains qu’elle a serrées, la somme de ces nombres est égale à deux fois le nombre de poignées de main échangées.
Démonstration
Ce lemme a une conséquence immédiate : dans tout graphe, le nombre de sommets de degré impair est pair. En effet, la somme des degrés est paire, et une somme d’entiers n’est paire que si elle contient un nombre pair de termes impairs.
C’est ce résultat qui intervient dans le problème des ponts de Königsberg évoqué dans la vidéo (voir aussi l’article précédent). Euler a montré qu’une promenade passant exactement une fois par chaque pont existe si et seulement si le graphe contient 0 ou 2 sommets de degré impair. Le lemme des poignées de main nous apprend qu’on ne peut jamais en trouver exactement 1 (ni 3).
Combien d’arêtes un graphe peut-il avoir ?
Pour un graphe d’ordre $n$, le nombre d’arêtes peut beaucoup varier selon sa structure. Voici trois cas utiles pour la suite du cours.
Le graphe complet
Un graphe complet d’ordre $n$ possède $\frac{n(n-1)}{2}$ arêtes. C’est le nombre maximal d’arêtes pour un graphe d’ordre $n$ dont les arêtes sont des paires.
Démonstration
Les arbres
Un arbre d’ordre $n$ possède exactement $n-1$ arêtes. C’est le nombre minimal d’arêtes pour qu’un graphe d’ordre $n$ soit connexe.
Démonstration
Vous rencontrerez des arbres très bientôt : les parcours de graphes que vous verrez dans cette séance construisent un arbre, dans lequel chaque sommet atteint (sauf le sommet de départ) est relié à un unique parent (voir l’article sur les tables de routage).
Les labyrinthes
Considérons un labyrinthe PyRat de largeur $w$ et de hauteur $h$, sans case manquante. Il contient $n = wh$ cases. Chaque ligne contient $w-1$ paires de cases voisines horizontalement, et chaque colonne contient $h-1$ paires de cases voisines verticalement. Le nombre d’arêtes est donc au plus :
$$h(w-1) + w(h-1) = 2wh - w - h < 2n$$Les murs ne peuvent que réduire ce nombre.
Par exemple, un labyrinthe de taille $15 \times 13$ (la taille par défaut dans PyRat) contient 195 cases, et au plus 362 arêtes. Un graphe complet de même ordre en aurait 18 915 !
On dit qu’un tel graphe est creux, car il contient très peu d’arêtes par rapport au maximum possible. Cette propriété est importante en pratique. Par exemple, la matrice d’adjacence d’un tel labyrinthe contient $195^2$, soit 38 025 cases, dont au plus $2 \times 362 = 724$ sont non nulles, soit moins de 2 %. Stocker tous ces zéros est un gaspillage de mémoire, et c’est pourquoi d’autres représentations sont souvent préférées pour ce type de graphe (voir l’article sur la représentation des graphes).
Pour aller encore plus loin
-
Cela est très proche de ce que nous ferons dans le projet.
-
Cela ne sera probablement pas utile pour gagner le défi, mais cela montre le lien fort entre la théorie des graphes et l’algèbre linéaire.


























