Théorie des graphes : la bibliothèque $\mathtt{NetworkX}$

Retour au tutoriel général

La bibliothèque $\mathtt{NetworkX}$ permet de travailler avec des graphes. Une brève présentation est disponible à l'adresse https://networkx.org/documentation/stable/

Une présentation plus détaillée des fonctionnalités est disponible à l'adresse https://networkx.org/documentation/stable/reference/index.html

Définition et tracé des graphes

Les mêmes fonctions existent en remplaçant $\mathtt{add}$ par $\mathtt{remove}$.

Pour le tracé, on peut spécifier la position des sommets soit par un calcul automatique (la liste des positionnement est disponible à l'adresse https://networkx.org/documentation/stable/reference/drawing.html#module-networkx.drawing.layout)

ou en spécifiant manuellement les positions par un dictionnaire sommet / position

On peut aussi construire un graphe à partir d'un dictionnaire : les clés sont les sommets, les valeurs sont la liste des sommets pointés par la clé.

On peut aussi construire un graphe à partir de sa matrice d'adjacence.

Si besoin, on peut renommer les noeuds (notamment si on utilise la définition via la matrice d'adjacence). Pour cela on utilise la méthode $\mathtt{relabel\_nodes}$. Les noeuds sont renommés en utilisant un dictionnaire dont les clés sont les anciens noeuds et les valeurs les nouveaux noeuds.

 Graphes orientés

 Graphes valués

Attention, pour la définition via un dictionnaire on utilise ici un dictionnaire de dictionnaires pour indiquer les valuations

Pour récupérer les poids (sous forme de dictionnaire) on utilise la fonction $\mathtt{get\_edge\_attributes}$ (déjà utilisée pour l'affichage)

Propriétés des graphes

Exemple de boucle sur les sommets

Quelques algorithmes

De nombreux algorithmes sont implémentés pour l'étude des graphes dans la bibliothèque $\texttt{NetworkX}$ : https://networkx.org/documentation/stable/reference/algorithms/index.html

On présente ici simplement les fonctions de parcours en largeur (et en profondeur) ainsi que la recherche de plus court chemin.

Cas d'un graphe non orienté

Cas d'un graphe valué

Quelques commentaires supplémentaires pour la visualisation

A des fins de visualisation on pourra préférér l'utilisation de $\mathtt{PyGraphviz}$. Cette bibliothèque repose sur Graphivz (sudo apt-get install graphviz) et doit être installée (pip install pygraphviz). Pour ne surcharger ce tutoriel, le reste des graphes sera affiché avec la fonction $\mathtt{draw}$ de $\mathtt{NetworkX}$.

Pour afficher les poids d'un graphe pondéré on ajoute l'attribut $\mathtt{label}$