IN201 : 5 – Algorithme de Dijkstra
Public : SUPAERO 2A
Date :
Résumé
Ce TP sert de récapitulatif aux quatre premières séances du cours IN201. Il consiste à concevoir et implanter un
système permettant de trouver un plus court chemin dans un graphe en utilisant l’algorithme de Dijkstra.
1 Objectifs
Les objectifs de ce TP sont les suivants :
– vérifier que vous êtes capable de proposer une solution de conception simple en utilisant le langage UML ;
– vérifier que vous êtes capable d’implanter une classe en respectant les principes énoncés en cours ;
– vérifier que vous êtes capable de tester une classe via JUnit.
2 Présentation du problème
Si une des grandes questions existentielles qui vous taraudent est de savoir comment touver un chemin minimal de votre
chambre au Batens histoire de profiter au maximum de votre lit douillet tout en évitant d’arriver en retard, ça tombe bien,
ce TP est pour vous.
Les problèmes de recherche de plus court chemin sont des problèmes bien connus en mathématiques et en informatique
depuis très longtemps. La représentation du chemin à parcourir se fait classiquement en utilisant un graphe composé de
nœuds représentant des points géographiques. Les nœuds peuvent être reliés entre eux deux par deux par des arcs, la
présence d’un arc entre deux nœuds signifiant que l’on peut passer d’un nœud à l’autre. On place sur chaque arc un poids,
représenté par un réel positif, qui représente le coût de passage d’un nœud à l’autre par ce chemin.
En utilisant cette modélisation, il existe de nombreux algorithmes permettant de trouver un plus court chemin dans un
graphe : algorithme de Dijkstra, A*, algorithmes de programmation dynamique etc [1]. La plupart de ces algorithmes
partent d’un nœud de départ et cherchent les nœuds accessibles à partir de ce dernier en suivant les arcs.
Notre application a pour but de trouver le plus court chemin entre la R3 et le CI d’après le graphe présenté sur la figure 1.
3 Conception d’une solution
On va chercher à modéliser le problème en utilisant une conception orientée objet. On ne s’intéresse absolument pas à
l’aspect algorithmique du problème pour l’instant. On propose d’utiliser les classes suivantes pour résoudre le problème :
– une classe Noeud qui modélise les nœuds du graphe ;
– une classe Arc qui modélise les arcs du graphe ;
– une classe Probleme qui modélise un problème particulier, i.e. un graphe avec un nœud de départ et un nœud d’arrivée ;
– une classe Solver qui permet de résoudre des problèmes grâce à un algorithme particulier.
1. dans un premier temps, écrire un diagramme UML représentant les différentes relations qui existent entre ces classes ;
2. affiner ce diagramme en utilisant des navigabilités et visibilités et en proposant une vue plus «implantation »de votre
solution. On supposera que pour les besoins de l’algorithme de résolution, on a besoin étant donné un nœud donné de
connaître les arcs qui partent de ce nœud ;
3. proposer enfin un diagramme de classe UML détaillé faisant apparaître attributs et opérations pour les classes Noeud,
Arc,Probleme et Solver. On supposera que les objets créés n’ont pas besoin d’être modifiés au cours du programme.
Dans ces diagrammes détaillés, on ne fera pas apparaître les éventuels détails d’implantation en ce qui concerne les
multiplicités de type *(choix d’un tableau, d’un objet de type ArrayList etc.). On utilisera la syntaxe UML suivante :
nomAttribut : TypeAttribut [n]
qui précise que nomAttribut est un attribut «contenant »nobjets de type TypeAttribut (cette syntaxe n’impose
pas que cet attribut soit ensuite implanté sous la forme d’un tableau).
Revision b81747b, Wed Oct 31 23:03:40 2012 +0100, Christophe Garion. 1/4