Introduction à la théorie des graphes
La théorie des graphes concerne de nombreux domaines d'application, leurs objectifs sont différents mais le langage utilisé est le même. Les graphes sont utilisés pour modéliser des ensembles structurés, complexes, avec de nombreuses applications, telles que la modélisation dans le temps (en économie ou automatique) ou dans des réseaux divers (électrique, routier, adduction d'eau, ...). La théori des graphes est née en 1736 quand Euler démontra qu'il était impossible de traverssr chacun des 7 ponts de la ville russe de Könisberg (KalininGrad) une fois exactement et de revenir au point de départ :
De manière général, un graphe permet de représenter simplement la structure, les cheminements possibles dans un grand nombre de situations en expriment les relations et les dépendances entre les éléments. Par exemple dans un réseau férroviaire, un arbre généalogique, le diagramme de succession de tâche en gestion .... etc. En plus de son existence purement mathématique, le graphe est aussi une structure de données en informatique, les applications sont nombreuses et indispenssable pour résoudre bon nombres de problèmes d'optimisation.
Concepts orientés
Dans beaucoup d'applications, les relations entre les éléments d'un ensemble sont orientées. Un élément
- Un ensemble fini
dont les éléments sont appelés sommets (ou noeud)
si possède éléments distincts, le graphe sera dit d'ordre n - Un ensemble finit
dont les éléments sont des couples ordonnées de sommets appelés arcs.
U est donc une famille du produit cartésion - Pour un arc
, est le noeud initial/origine et le noeud final/destination
Un P-graphe est un graphe dans le quel il n'existe jamais plus de p arcs de la forme
Applications multivoques
L'application
est le successeur de si le couple
L'ensemble des successeurs de est noté est le prédécesseur de si le couple
L'ensemble des prédécesseurs de est noté
Graphes non orientés
Lors de l'étude de certaines propriétés il arrive que l'orientation des arcs ne joue aucun rôle. On s'intéresse uniquement à l'existence d'arcs entre deux sommets sans que l'ordre ne soit précisé. On appel arrête tout arc sans orientation. L'ensemble
- On dit que
est incidente au sommet pour une arrête - Pour les graphes non orientés au lieu de noter
et , on préfère souvent et - Un multi-graphe
est un graphe dans lequel il existe plusieurs arrêtes entre deux sommets - Un graphe
est simple s'il n'est pas multi-graphe et s'il n'existe pas de boucles est un sous-graphe de ou est l'enssemble des arcs ayant leurs extremites dans
Proprietes de certain graphe
- Graphe reflexif
- tous les sommets comportent une boucle
- Graphe irreflexif
- aucune boucle local
- Graphe symetrique
- tout sommet lies entre eux est lies dans les deux sens
- Graphe asymetrique
- pas plus d'un arc entre deux sommet, pas de boucle
- Graphe antisymetrique
- pas plus d'un arc entre deux sommet,boucle possible
- Graphe transitif
- s'il existe un chemin
alors il existe aussi un chemain
- s'il existe un chemin
- Graphe complet
- s'il n'existe pas de sommet isole
- Graphe simple
- si tout les arcs sont distincs et s'il n'y a pas de boucles
- Clique
- C'est un sous-graphe de
telque tout couple de sommets distincts de est relie par un arc ou une arrete de
- C'est un sous-graphe de
- Tournoi
- C'est un graphe complet et asymetrique
Representation d'un graphe
Il existe plusieurs types de représentation pour décrire un graphe. On distingue principalement la représentation par matrice d'adjacence, par matrice d'incidence sommet-arcs et par liste d'adjacences.
Matrice d'adjacence
Pour un 1-graphe, la matrice d'adjacence fait correspondre les sommets origines des arcs (classes en ligne dans la matrice) au sommets destination (classes en colonnes dans la matrice). Dans un formalisme matrices booléenne, l'existence d'un arc
donc par exemple on peu simplement utiliser une matrice numpy pour ce type de representation :
n = 4 # number_of_nodes connection = np.zeros((n,n)) connection[0,0] = 1 # boucle sur x_1 connection[0,2] = 1 # arc de x_1 -> x_3 # etc ....
Matrice d'incidence sommet-arc
Pour établir cette matrice, les lignes sont constituées des sommets du graphe et les connes sont constituées des arcs. On pose la valeur
encore une fois une simple matrice numpy peu etre utilise, mais ce type de representation est moin flexible a la modification (ajout / suppression d'arc plus couteux)
n = 2 # number_of_nodes m = 1 # number_of_arcs connection = np.zeros((n,m)) connection[0,0] = -1 # arc de x_1 connection[1,0] = 1 # vers x_2
Liste d'adjacence
L'objectif ici est de représenter chaque arc par sont extréminée finale, l'extrémintée initial étant défini implicitement. On pose alors que tout les arcs émanant d'un même sommet sont liés entre eux dans une liste. A chaque arc sont associés le sommet de destination et le pointeur au prochain sommet de la liste. Pour un 1-graphe, il y a un avantage à utiliser la représentation par liste d'adjacence grâce à l'application
La représentation par liste d'adjacence nécéssite la création de deux tableaux. Un premier nommé
dans le cas orienté dans le cas non-orienté identique
Cette représentation revient à décrire le graphe par sont application multivoque
- On construit
par - On construit
qui donne pour tout sommet l'indice dans ou commence la liste des successeurs. - Pour le sommet
, son premier suivant est et le second
L'enssemble ce situe dans les border et du tableau - Si un sommet
n'a pas de successeur, on pose .
C'est à dire une liste coincée entre les successeurs de et .
La place mémoire utilisé est
nodes = [[] for _ in range(nomber_of_nodes)] nodes[0] = [1] # liste des successeurs de x_1 nodes[1] = [0,2] # liste des successeurs de x_2 nodes[2] = [0,1,4] nodes[3] = [2] nodes[4] = [5] nodes[5] = [2,5] # boucle local
Par contre ce type de représentation ne permet pas de modéliser le poids des arcs, il faut donc rajouter un autres tableau similaire a
Voir aussi jerryyin.info