Université Paris-Nord L3 Info Algorithmique des graphes : Projet Langage de programmation : C. À faire en binôme. Le projet comprend plusieurs étapes : 1. Lire un graphe dans un fichier 2. Afficher un graphe grâce à la syntaxe DOT 3. Calculer les plus courts chemins dans un graphe à partir d’un sommet donné . Utiliser l’algorithme le mieux adapté au graphe en entrée 4. Afficher les valeurs des plus courts chemins obtenus et l’arborescence correspondante 5. Calculer le nombre d’opérations élémentaires effectuées par votre programme 6. Tester votre programme sur des exemples Attention : Dans ce qui suit, les objets apparaissant entre crochet, tels <mongraphe.txt>, </Chemin_menant_au_fichier.txt>, <algorithme choisi>, <mon_sommet>, . . . seront remplacés par les valeurs appropriées lors de l’exécution de votre programme. 1 Lecture de graphe Les graphes à traiter par l’algorithme seront stockés dans des fichiers texte. Avant de pouvoir appliquer l’algorithme à un graphe, il faut donc commencer par lire les données dans le fichier correspondant, et les stocker ensuite dans une structure appropriée. On vous demande donc ici d’implémenter une méthode permettant d’effectuer cette opération. Il faut commencer par lire les données du fichier. Les fichiers représentant les graphes auront le format suivant : – La première ligne contiendra une seule information, le nombre n de sommets du graphe. – La deuxième ligne contiendra une seule information, le nombre m d’arcs du graphe. – Chacune des m lignes suivantes contiendra la description d’un arc du graphe : sa première extrémité, sa deuxième extrémité, et son poids. Sur chacune des m dernières lignes, ces trois informations sont séparées par des virgules. Un exemple de graphe à quatre sommets et cinq arcs est donné par le fichier texte suivant, de nom <mongraphe.txt> : 4 5 1,2,10 1,3,41 1,4,3 2,3,15 3,4,7 Le graphe ainsi décrit contient cinq arcs : un arc du sommet 1 vers le sommet 2, un arc de 1 vers 3, un arc de 1 vers 4, un arc de 2 vers 3, et un arc de 3 vers 4. Ces arcs ont pour poids respectifs 10, 41, 3, 15, et 7. Vous devez ensuite définir une structure dans laquelle stocker ces informations. Vous pouvez choisir une représentation parmi les trois évoquées en cours : liste d’adjacence, matrice d’adjacence ou matrice d’incidence. Précisez ci-dessous quelle structure vous avez choisie, et éventuellement pour quelle(s) raison(s). Attention : Pensez à adapter les structures vues en cours pour prendre en compte les poids des arcs du graphe ! Structure choisie : 2 Affichage de graphe Pour afficher un graphe, on utilisera la syntaxe DOT. Celle-ci consiste à écrire le graphe dans un fichier .dot en suivant la syntaxe expliquée, par exemple, aux adresses ci-dessous : – https://fr.wikipedia.org/wiki/DOT_%28langage%29 – http://cyberzoide.developpez.com/graphviz/#LV Vous devrez donc, à partir d’un graphe stocké dans la structure que vous avez choisie dans la Partie 1, créer un fichier .dot contenant votre graphe décrit dans la syntaxe DOT. Dans les salles TP, sur les machines du sercal, le fichier .dot ainsi produit peut être affiché en utilisant le logiciel dot. Ainsi, votre fichier <exemple.dot> peut être affiché via la ligne de commande dot -Tpdf <exemple.dot> qui produit un pdf contenant le graphe correspondant. 3 Plus courts chemins dans le graphe 3.1 Quel algorithme utiliser ? Avant d’exécuter Bellman, Dijkstra ou Ford-Bellman pour déterminer les plus courts chemins dans notre graphe, il convient de déterminer lequel parmi ces algorithmes est le plus adapté : si plusieurs d’entre eux s’appliquent, il faut choisir le plus rapide ! Rappelez ici les cas où chaque algorithme s’applique : . Bellman : . Dijkstra : . Ford-Bellman : Proposez une méthode qui détermine, selon les propriétés du graphe, quel algorithme de plus courts chemins utiliser : Programmez cette méthode : l’utilisateur devra voir s’afficher ce qui suit sur la console, où les noms entre crochets <...> seront remplacés par ce qui convient : Entrez le nom du fichier contenant votre graphe: </Chemin_menant_au_fichier.txt> L’algorithme de plus courts chemins choisi est: <algorithme choisi> 3.2 Implémentation de l’algorithme L’utilisateur vous précisera à partir de quel sommet il souhaite calculer les plus courts chemins dans son graphe. À partir de quel sommet souhaitez-vous calculer les plus courts chemins ? <mon_sommet> À vous ensuite d’implémenter les algorithmes du cours : Bellman, Dijkstra et Ford-Bellman. Vous appliquerez alors l’algorithme choisi grâce à la Partie 3.1 au graphe donné par l’utilisateur, en partant du sommet <mon_sommet>. 4 Affichage du résultat Une fois les plus courts chemins calculés, affichez comme suit dans la console les valeurs des plus courts chemins à partir du sommet <mon_sommet> vers tous les autres sommets : Les plus courts chemins à partir de <mon_sommet> ont les valeurs suivantes: de <mon_sommet> au sommet 1: 42 de <mon_sommet> au sommet 2: -11 (...) de <mon_sommet> au sommet n: 5 Créez un fichier .dot contenant l’arborescence des plus courts chemins correspondants. Affichez cette arboresence. 5 5.1 Complexité Nombre d’opérations Modifiez votre programme afin qu’il calcule le nombre d’opérations élémentaires effectuées au cours de son exécution. Après son exécution, affichez comme suit dans la console le nombre d’opérations élémentaires ainsi calculé. L’exécution du programme pour votre graphe a nécessité: <nombre_opérations> opérations Rappel : les opérations élémentaires sont : addition, soustraction, multiplication, division, affectation, comparaison. . . 5.2 Test Testez votre programme sur des exemples de différentes tailles et reportez vos résultats ci-dessous. Ces résultats correspondent-ils à vos attentes ? Nombre d’arêtes Nombre de sommets Algorithme choisi Nombre d’opérations