Graphes et algorithmes - TP 2


Préliminaires

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

    gunzip graphestp2.tar.gz
    tar xvf graphestp2.tar
    rm graphestp2.tar
    cd GraphesTp2; ls

Si vous êtes sous Linux, tapez :

    cp makefile.linux makefile

Si vous êtes sous HP-UX, tapez :

    cp makefile.hpux makefile
Cette archive contient des programmes C pour manipuler des graphes, la documentation de ces programmes se trouve ici :

Documentation


Analyse de trajectoires dans une chambre à bulles

L'image ci-dessus à gauche est extraite d'une photographie de chambre à bulles (source CERN). A droite, l'image a été seuillée pour détecter les régions les plus claires (image bs0). Le fichier bs0.list contient les coordonnées des barycentres de ces régions (la première ligne du fichier indique le nombre de points). Deux autres images sont à votre disposition : bs1 et bs2, dont les fichiers de coordonnées sont respectivement bs1.list et bs2.list. Notre but dans ce TP est de reconstituer au mieux les trajectoires des particules (ensembles de points plus ou moins alignés) en négligeant les points isolés.


1. Ecrire un programme qui lit un fichier de points, et construit un graphe antisymétrique(1) sans boucle(2) tel que : Ce graphe sera représenté en mémoire, à la fois sous la forme ``successeurs'' et sous la forme ``liste d'arcs''. De plus, les valeurs associés aux arcs seront les distances entre les points correspondant aux extrémités. Les coordonnées des sommets seront stockées dans les champs x et y de la structure graphe.

Visualiser les graphes obtenus pour différentes valeurs de d. Peut-on trouver une valeur qui permette d'isoler les ``points de bruit'' des ``trajectoires de particules'', dans les trois images bs0, bs1, bs2 ?

(1) : G est un graphe antisymétrique si pour tout sommet x et pour tout sommet y de G, [ (x,y) arc de G ] implique [ (y,x) non arc de G ].

(2) : G est un graphe sans boucle (ou antiréflexif) si pour tout sommet x de G, (x,x) n'est pas un arc de G.


2. Quelle est (approximativement) la valeur minimale dmin de d telle que le graphe obtenu à partir de bs0.list soit connexe ?

Proposez (sans l'implémenter) une méthode pour trouver la valeur exacte de dmin pour un ensemble quelconque de points. Complexité de la méthode ?


3. On suppose que les trajectoires se coupent entre elles et ne forment pas de cycle. Calculez sur le graphe valué par les distances un arbre de poids minimum. Pour cela, il faut implémenter un des algorithmes étudiés en cours (Kruskal 1, 2). Les fonctions pour effectuer le tri et le test de connexité sont disponibles, ainsi que les fonctions de base pour ajouter ou retirer un arc, initialiser un nouveau graphe, etc.

Commentez les résultats obtenus sur les trois images bs0, bs1, bs2, en particulier : quels sont les défauts de la méthode ? Illustrez ces défauts par des exemples précis.


4. On voit sur certaines configurations qu'il est nécessaire de tenir compte du fait que des points appartenant à une même trajectoire sont approximativement alignés.

On se propose de redéfinir la nature des poids associés aux arcs, de façon à favoriser la sélection des arcs qui non seulement sont courts, mais sont également alignés avec des arcs adjacents. De plus, cette définition devra être relativement simple à implémenter.

Proposez plusieurs idées, confrontez-les avec celles de vos voisins et soumettez-les au professeur responsable du TP. Retenez la meilleure et implémentez-la. Résultat ?


5. Proposez et implémentez une stratégie pour éliminer les points de bruit, c'est-à-dire les points qui ne font clairement partie d'aucune trajectoire.


Exemples d'opérations de lecture de fichiers en C :

  int ns; double x;
  fd = fopen(argv[1], "r"); // ouverture fichier dont le nom est dans argv[1]
  if (!fd)
  {
    fprintf(stderr, "cannot open file: %s\n", argv[1]);
    exit(0);
  }
  fscanf(fd, "%d", &ns);    // lit un nombre de type "int" dans le fichier
  fscanf(fd, "%lf", &x);    // lit un nombre de type "double" dans le fichier
  fclose(fd);


Dernière mise à jour :  par Michel Couprie.