TUTORIEL ALGO/METHODES 
Expliquez-moi...Les graphes
Méthode générale de rangement de données, qui s'applique autant à des problèmes purement mathématiques qu'à des questions de la vie de tous les jours. (28/10/2005)
Les données ne sont pas gérées par un programme de manière aléatoire, mais bien au sein d'une structure, qui permet de les traiter de manière d'autant plus pertinentes que cette structure est adaptée à l'algorithme utilisé.

Une structure de graphe représente un exemple de ces agencements de données, avec les tableaux, les listes, piles et files (lire notre article du 08/04/2004), et les arbres (lire notre article du 26/07/2005).

Survol
Au sein d'une structure en graphe, les données sont reliées sans ordre particulier. Pour reprendre le concept classique du noeud, où une valeur correspond à un noeud, un graphe correspond à un agencement où les noeuds sont reliés entre eux de manière non linéaire. Il se démarque en cela des autres structures abordées précédemment. Précisons qu'un arbre est une forme particulière de graphe, connexe, non orienté et acyclique.

Il existe en effet plusieurs formes de graphes, et notamment deux grandes catégories : les graphes orientés et les graphes valués. C'est ici que s'impose le fait que le graphe tient son nom de l'importance de sa représentation graphique. Un graphe orienté présente les liaisons internodales avec des flèches, indiquant le sens du parcours de l'information. Dans le cas d'un graphe valué, le sens de la liaison entre deux noeuds se découvre via leur valeur respective, donnant un poids à chacun. Un graphe peut parfaitement être à la fois orienté et valué.

Un graphe se définit par nombre de mots-clefs, permettant de préciser ses spécificités. Ainsi, la liaison entre deux noeuds est un "arc", le nombre d'arcs entre et sortant d'un noeud correspond à son "degré", une suite de noeuds est appelée une "chaîne", la "longueur" de cette dernière correspondant au nombre d'arcs qui la constituent.

Une "matrice d'adjacence" est un tableau comprenant autant de lignes et de colonnes que le graphe a de noeuds. Chaque case indique la distance entre deux noeuds, calculées par la valeur prise par l'arc (si le graphe est valué), ou 0 s'ils ne sont pas liés. Si le graphe est non valué, la matrice ne contient que des 0 et des 1.

En pratique
De manière très terre-à-terre, l'aspect général des graphes autorise la modélisation de nombreux environnements disparates : interconnexions routières, liaisons au sein d'un circuit électronique, plan d'une ville...

  Forum

Réagissez dans les forums de JDN Développeurs

L'application la plus connue d'un graphe est le calcul du plus court chemin pour aller d'un point à un autre. Les mathématiciens ont pour cela développé nombre d'algorithmes, dont le plus connu est celui de Dijkstra.

Celui-ce travaille avec un graphe orienté et connexe (chaque paire de noeuds est reliée par une chaîne), avec arcs valués, en répartissant les données en trois groupes :
  - examiné : l'ensemble des noeuds pour lesquels on connaît le plus court chemin de la source aux noeuds de cet ensemble.
  - courant : l'ensemble des noeuds voisins d'un noeud examiné, mais pas encore examinés eux-mêmes.
  - inconnu : l'ensemble des autres noeuds.

Wikipedia propose une implémentation en pseudocode permettant de comprendre le fonctionnement de cet algorithme.

Dijkstra(noeuds, fils, distance, debut, fin)
  Pour n parcourant noeuds
    n.parcouru := infini   // Peut être implémenté avec -1
    n.precedent := 0
  Fin pour
  debut.parcouru := 0
  DejaVu := liste vide
  PasEncoreVu := noeuds
  Tant que PasEncoreVu != liste vide
    n1 := minimum(PasEncoreVu)   // Le noeud dans PasEncoreVu avec parcouru le plus petit
    DejaVu.ajouter(n1)
    PasEncoreVu.enlever(n1)
    Pour n2 parcourant fils(n1)   // Les noeuds reliés à n1 par un arc
      Si n2.parcouru > n1.parcouru + distance(n1, n2)   // distance correspond au poids de l'arc reliant n1 et n2
        n2.parcouru := n1.parcouru + distance(n1, n2)
        n2.precedent := n1   // Dis que pour aller à n2, il faut passer par n1
      Fin si
    Fin pour
  Fin tant que
  chemin := liste vide
  n := fin
  Tant que n != debut
    chemin.ajouterAvant(n)
    n := n.precedent
  Fin tant que
Renvoyer chemin
 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages