150 likes | 289 Views
PrOJET C : LAGER IG3 2009-2010. DREYER Quentin JAMBET Pierre NGYUEN Michael. LAGER : LAGER Ain’t a Graph Explorer for Rookies. Sommaire Présentation générale Structures utilisées Algorithmes principaux Conclusion Remerciements. LAGER : LAGER Ain’t a Graph Explorer for Rookies.
E N D
PrOJET C : LAGERIG3 2009-2010 DREYER QuentinJAMBET PierreNGYUEN Michael 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies Sommaire Présentation générale Structures utilisées Algorithmes principaux Conclusion Remerciements 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies • Présentation générale • Langage : C++ • Nomination : Anglais (Commentaires : Français) • Outils annexes : • SubVersion (SVN) • Valgrind • Google Test • Respect de la charte de programmation / normalisation ANSI • Application semi-portable • Makefile complet • Acronyme récursif ! 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies Structures utilisées Utilisation de 5 classes : • Classe maîtresse : Graph • Double représentation : Matrices d’adjacences / Liste d’adjacence => Comparaison Vitesse / Espace mémoire • 1 classe par représentation : AdjMat / AdjList => Clarté • Classe auxiliaire : Summit • Classe de génération : Generator 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies Algorithmes principaux Fonctionnement de LAGER : • Récupération de données Facebook OU • Génération aléatoire • Chargement du fichier • Analyse du fichier • (Optionnel) Affichage des résultats 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies Algorithmes principaux void Graph::initGraph(string&fileNameIn) Ouverture du fichier (fopen) Parsing des données (fscanf) => Personnes / Relations / Questions Fermeture du fichier (fclose) 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies Algorithmes principaux vector <s_summit> AdjMat::initSCC() Premier parcours en profondeur (DFS) Tri des sommets dans l’ordre décroissant de leur temps de fin respectifs Deuxième parcours en profondeur du graphe dual (DFSD) Tri des sommets dans l’ordre croissant de leur temps de début respectifs Renvoie du vector 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies Algorithmes principaux voidAdjMat::DFS () Initialisation de la variable int temps à 0 Appel sur DFSHidden(i, temps) pour chaque sommet non déjà parcouru 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies Algorithmes principaux voidAdjMat::DFSHidden(inti, int& t) : Algorithme récursif Changement du statut du sommet (Atteint) Augmentation de 1 du temps Enregistrement du temps de début Appel sur DFSHidden(j, t) si j représente un successeur non atteint Augmentation de 1 du temps Enregistrement du temps de fin 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies Algorithmes principaux void Graph::searchSCC() Appel a initSCC() // Remplit le tableau t des temps d et f Initialisation : d = t[0].d, f = t[0].f; Pour tous les sommets faire • Si d est inférieur à t[i].d ET f est supérieur à t[i].f alors 0 et i sont dans la même CFC • Sinon d = t[i].b, f = t[i].f, on débute une nouvelle CFC 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies Algorithmes principaux vector <s_summit> AdjMat::initDist(intx) : Algorithme de Dijkstra Initialisation des temps d’accès à INT_MAX (Equivalent ∞) Initialisation du tableau des parents à -1 Initialisation du temps d’accès de x à 0 Tant qu’il reste des sommets faire • Extraire le sommet ayant le plus petit temps d’accès • Mettre à jour les temps d’accès de ses successeurs : d(j) = min( d(j), d(i) + j.freq); // i sommet actuel, j un successeur • Mettre à jour le tableau des parents : π(j) = i; Renvoie du vector 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies Algorithmes principaux voidGraph::searchDistances() Pour chaque point de départ distinct x faire • Appel à initDist(x) // Remplit les tableaux d et π - Pour chaque question x -> y faire • t_min = d(y) dans le tableau de x // Affichage du chemin : - Afficher y • Tant que π(y) != -1 faire • y = π(y) • Afficher y 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies Algorithmes principaux boolAdjMat::isImportant(intx) : Algorithme de NGUYEN Traitement des cas simples : Source / Puits / Point isolé => Non important Traitement des fils de x : • Si un des fils de x de la même CFC n’a pas d’autres père de la même CFC => X est important Traitement des pères de x : • Si un des pères de x de la même CFC n’a pas d’autres fils dans la même CFC => X est important 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies Conclusion Projet bénéfique • Travail en groupe • Application de notions vu en Théorie des graphes • Découverte des Unit Test, de la STL, … Utilisation d’une librairie externe De nombreux problèmes rencontrés, mais surmontés ! 24/05/2010
LAGER : LAGER Ain’t a Graph Explorer for Rookies Remerciements Nos professeurs, sans qui ce projet n’aurait pu exister Google, pour toutes ses applications qui nous ont été fortes utiles : (Google SearchEngine, Google Code, Google Test, Google Docs, …) - Mathieu Triay ! Merci de votre attention 24/05/2010