Graphes et algorithmes - TP 3

Michel Couprie, Gilles Bertrand


Préliminaires

Avant tout, récupérez le fichier graphestp3.tar.gz et décompressez-le :

    gunzip graphestp3.tar.gz
    tar xvf graphestp3.tar
    rm graphestp3.tar
    cd GraphesTp3; ls
Cette archive contient des programmes C pour manipuler des graphes, la documentation de ces programmes se trouve ici :

Documentation

Rappel du premier TP : description des structures de données utilisée pour représenter un graphe sous la forme Γ (application successeurs). Pensez également à vous référer à la documentation du code source, en particulier :


Ballades dans le métro

La RATP propose à ses usagers un service interactif qui trouve le plus court trajet entre deux stations du métro au choix de l'utilisateur. Notre but dans ce TP sera de réaliser une version simplifiée d'un tel logiciel, et de réfléchir aux stratégies les plus efficaces pour résoudre des problèmes du mêeme type.


0. Les données

Vous trouverez dans le fichier metro_complet.graph un graphe valué construit de la façon suivante :

Visualisez le graphe du métro parisien grâce au programme graphe2ps.exe :
    make graphe2ps.exe
    graphe2ps.exe metro_complet.graph
    display metro_complet.graph.eps


1. Dijkstra dans le métro

Implémentez l'algorithme de Dijkstra étudié en cours. Voici une courte description de la fonction demandée :

/* ====================================================================== */
/*! \fn void Dijkstra(graphe * g, int i)
    \param g (entrée) : un graphe pondéré. La pondération de chaque arc doit 
                        se trouver dans le champ v_arc de la structure cell .
    \param i (entrée) : un sommet de g.
    \brief calcule, pour chaque sommet x de g, la longueur d'un plus court
           chemin de i vers x. Cette longueur est stockée dans le champ
           v_sommets de g .
*/
/* ====================================================================== */

Testez votre programme sur un graphe de taille réduite de votre choix (celui-ci par exemple), puis sur le graphe du métro.

Fonctions et données utiles :


2. Plus court chemin

Implémentez un algorithme de recherche de plus court chemin d'un sommet d vers un sommet a, qui se base sur les valeurs calculées par Dijkstra. Voici une courte description de la fonction demandée :

/* ====================================================================== */
/*! \fn graphe * PCC(graphe * g, int d, int a)
    \param g (entrée) : un graphe pondéré. La pondération de chaque arc doit 
                        se trouver dans le champ v_arc de la structure cell .
    \param d (entrée) : un sommet (départ).
    \param a (entrée) : un sommet (arrivée).
    \return un plus court chemin de d vers a dans g , représenté par un graphe.
    \brief retourne un plus court chemin de d vers a dans g .
*/
/* ====================================================================== */

On pourra améliorer le temps de calcul en stoppant l'algorithme de Dijkstra dès que le sommet a est atteint.

Testez votre programme sur un graphe de taille réduite de votre choix, puis sur le graphe du métro. Visualisez (voir EPSGraphe) le plus court chemin obtenu ainsi que l'ensemble des sommets explorés, pour quelques exemples de trajets dans le métro.

Fonctions et données utiles :


3. Amélioration de Dijkstra

Dans l'algorithme de Dijkstra, les sommets n'appartenant pas à S peuvent se diviser en deux sous-ensembles :

Dans la version la plus simple de Dijkstra, on recherche le sommet de valuation minimale dans [T union U]. Il est possible d'améliorer significativement l'algorithme en introduisant une variable qui représente l'ensemble T (sous la forme d'une liste) pour limiter la recherche à cet ensemble.

Implémentez cette amélioration et testez-la.

Fonctions et données utiles :


Bonus (travail personnel après le TP)

4. Amélioration de l'estimation du temps de trajet

Dans ce qui précède, nous ne prenons pas en compte les temps arrêts du métro à chaque station. On désire rajouter à l'estimation du temps total de trajet une attente moyenne de 20s par arrêt. Pour ce faire il existe deux types de solutions :

Expliquez dans chacun des cas comment procéder (aucune implémentation n'est demandée).


5. Approche A*

5.1 On désire maintenant résoudre le même problème par une approche A*. Définissez un graphe de résolution de problème et proposez une ou plusieurs heuristiques A*, sans tenir compte des temps d'arrêt aux stations.

5.2 Il suffit maintenant de modifier légèrement l'algorithme de Dijkstra (variante de la question 3) pour implémenter la stratégie A* pour ce problème. Réalisez cette implémentation, et visualisez (voir EPSGraphe) l'ensemble des sommets explorés pour quelques exemples de trajets. Comparez le nombre de ces sommets avec le nombre de sommets explorés par Dijkstra.

Fonctions et données utiles :

5.3 Proposez une heuristique A*, tenant compte des temps d'arrêt aux stations.


Remerciements

Nous tenons à remercier la RATP pour les données mises à disposition sur son site Web, ainsi que L. Granboulan et L. Mauborgne de l'ENS, auteurs d'un TP sur la recherche de plus courts chemins dans le métro dont nous nous sommes librement inspirés.


Dernière mise à jour :  par Michel Couprie.