IUT Charlemagne - Dept info 2012-2013
Compl´ement JAVA DUT 2A
TD 4 - Assertions et algorithme de Dijkstra
Dans ce sujet, vous allez ´ecrire un algorithme de recherche de plus court chemin afin
de permettre `a des personnages de se d´eplacer dans le graphe.
Vous serez amen´es `a
utiliser des assertions pour v´erifier que le comportement `a l’ex´ecution est conforme
`a vos attentes ;
utiliser des tests unitaires pour v´erifier que les solutions obtenues sont correctes ;
manipuler le debugger d’Eclipse pour analyser votre programme lorsque son fonc-
tionnement ne correspond pas au fonctionnement attendu.
1 Pr´esentation de l’algorithme de Dijkstra
L’algorithme de Dijkstra est un algorithme permettant de trouver le chemin le plus
court entre un point de d´epart et un point d’arriv´ee dans un graphe. Les algorithmes
de ce type (cf A*) sont classiquement utilis´es dans les jeux vid´eos car ils sont rapides
et tr`es efficaces.
Figure 1 – Principe : d´eveloppement progressif
Le principe de l’algorithme consiste `a partir du point de d´epart et `a regarder tous
les arcs qui en partent. On ´evalue la distance entre le nœud destination de chaque arc et
le point de d´epart. Cette distance fournit la distance minimale entre le point de d´epart
et les nœuds qui sont ses voisins directs.
On r´eit`ere l’op´eration `a partir de ces nouveaux nœuds d´ecouverts (cf figure 1) afin
d’´evaluer la distance minimale entre ces nouveaux nœuds voisins et l’´etat de d´epart.
En effectuant plusieurs fois cette op´eration, on atteint le nœud d’arriv´ee et on obtient
la distance la plus courte entre le nœud de d´epart et le nœud d’arriv´ee.
Cpt JAVA - TD 4 - Assertions et algorithme de Dijkstra 1
Ce principe de d´eveloppement progressif est `a la base de plusieurs algorithmes de
propagation comme Dijkstra ou A*.
Figure 2 – Choix du nœud `a d´evelopper : le nœud dont la distance au d´epart est la plus
faible semble le noeud le plus int´eressant pour trouver le chemin le plus court
A chaque pas de temps, l’algorithme Dijkstra consiste `a d´evelopper le nœud pour
lequel la distance au point de d´epart est la plus courte (cf figure 2). Ainsi, l’algorithme
peut ´eviter d’explorer tout le graphe puisqu’une fois qu’on d´eveloppe le nœud d’arriv´ee,
cela signifie qu’il n’existe pas de chemin plus court pour l’atteindre que ceux d´ej`a par-
courus (sinon il resterait un nœud avec une distance au d´epart plus faible).
L’algorithme de Dijkstra ne prend pas en compte le nœud `a atteindre pour d´eterminer
quel nouveau nœud d´evelopper, ce qui fait que l’algorithme va parfois explorer des
nœuds dans des directions oppos´ees `a la direction d’arriv´ee. D’autres algorithmes uti-
lisent la position du nœud d’arriv´ee pour acc´el´erer la recherche et seront abord´es dans
le TD 6 (algorithme A*)
2 Algorithme Dijkstra
L’algorithme en lui-mˆeme est bas´e sur
la liste ouverte des nœuds d´ej`a rencontr´es mais qui n’ont pas ´et´e d´evelopp´es ;
une liste ferm´ee des nœuds d´ej`a parcourus.
2.1 Description des listes
Les listes ne sont pas directement des liste de nœuds. Il faut stocker l’information
associ´ee `a chaque nœud, `a savoir
la distance qui le s´epare du point de d´epart (mise `a jour au fur et `a mesure des
d´eveloppements)
le nœud parent `a partir duquel on vient (pour pouvoir reconstruire le chemin
permettant d’arriver jusqu’`a ce nœud).
Cpt JAVA - TD 4 - Assertions et algorithme de Dijkstra 2
2.2 Initialisation
Au d´epart, la liste ferm´ee est vide (aucun nœud n’a ´et´e d´evelopp´e) et la liste ouverte
contient le nœud de d´epart (avec une distance parcourue de 0 et un nœud parent ´egal
`a null) correspondant au nœud `a d´evelopper.
2.3 D´eveloppement
Premi`ere ´etape, il faut choisir le nœud `a d´evelopper parmi les nœuds de la liste
ouverte. Cela consiste `a s´electionner le nœud pour lequel la distance parcourue depuis
le d´epart est la plus faible.
Seconde ´etape, il faut d´evelopper `a partir de ce nœud. Pour tous les arcs qui en
partent, on observe le nœud que l’on atteint.
si le nœud est d´ej`a dans la liste ferm´ee (cela signifie qu’on l’a trait´e), on ne s’en
occupe pas
si le nœud est dans la liste ouverte, on v´erifie si la distance pour l’atteindre est
plus faible (auquel cas, on met le nœud dans la liste ouverte `a jour puisque cela
signifie qu’on vient de trouver un meilleur chemin)
– si le nœud n’appartient `a aucune liste, on l’ajoute `a la liste ouverte (pour le
d´evelopper par la suite) en y associant sa distance et la valeur du nœud parent
(celui qu’on est en train de d´evelopper)
Troisi`eme ´etape, on supprime le nœud qu’on vient de d´evelopper de la liste ouverte
et on l’ajoute dans la liste ferm´ee.
Exemple
Ces it´erations sont pr´esent´ees dans la figure 4.
2.4 Fin de propagation
D`es que le point d’arriv´ee est trait´e et passe dans la liste ferm´ee, cela signifie qu’il
n’existe pas de meilleur chemin que ceux trouv´es permettant d’atteindre l’arriv´ee et on
peut arrˆeter l’algorithme.
Si `a un instant donn´e, la liste ouverte est vide, cela signifie qu’on a d´evelopp´e tous
les nœuds et que l’arriv´ee n’est pas atteignable.
Cpt JAVA - TD 4 - Assertions et algorithme de Dijkstra 3
Figure 3 – Deux it´erations de d´eveloppement
2.5 Construction du chemin
A la fin de l’ex´ecution de l’algorithme, on dispose de la liste ferm´ee. La liste ferm´ee
correspond `a une carte qui associe `a chaque point sa distance minimale au d´epart et le
noeud parent d’o`u l’on vient pour avoir cette distance minimale (cf figure 4.a).
Figure 4 – Carte de distance obtenue et construction du chemin optimal
Il faut alors utiliser l’attribut parent pour construire le chemin permettant d’acc´eder
au mieux `a l’arriv´ee (cf figure 4.b).
3 Classes `a construire
Pour le moment, n’´ecrivez aucune classe ! Lisez int´egralement le sujet
Cpt JAVA - TD 4 - Assertions et algorithme de Dijkstra 4
3.1 Classe Chemin
Dans un premier temps, avant d’´ecrire l’algorithme, on va s’int´eresser `a la classe
Chemin.
Un chemin est d´efini par une liste de Noeud mais rien ne dit que cette liste de
nœuds correspond `a un chemin valide. En effet, pour qu’un chemin qui contient les
nœuds cons´ecutifs n1et n2soit valide, il faut qu’il existe un arc allant de n1`a n2.
D´eclarer une m´ethode double distance(Reseau r) qui retourne la distance du
chemin si et seulement si le chemin est un chemin valide dans le r´eseau. Sinon, cette
m´ethode retourne -1 signifiant que le chemin n’est pas valide.
3.2 Classe NoeudAlgo
La classe NoeudAlgo a pour objectif de repr´esenter les nœuds avec leurs caract´eristiques
utiles `a l’algorithme de Dijkstra.
Cette classe poss`ede
un attribut Noeud n correspondant au nœud d´ecrit
un attribut double parcouru correspondant `a la distance d´ej`a parcourue `a partir
du d´epart pour atteindre ce nœud.
un attribut Noeud parent qui correspond au nœud d’o`u l’on vient pour atteindre
ce nœud.
3.3 Classe Dijkstra
Faites h´eriter la classe Dijkstra de la classe Algorithme.
Cette classe poss`ede les ´el´ements suivants
– une liste ArrayList<NoeudAlgo> ouvert contenant l’ensemble des nœuds qui
reste `a d´evelopper
– une liste ArrayList<NoeudAlgo> ferme contenant l’ensemble des nœuds d´ej`a
d´evelopp´es (et que l’on n’a plus `a consid´erer dans la propagation)
Les m´ethodes `a d´efinir sont les suivantes
une m´ethode void propagation() qui se charge de construire les listes ouvertes
et ferm´ees jusqu’`a atteindre le nœud d’arriv´ee. cette m´ethode utilisera les m´ethodes
suivantes
une m´ethode NoeudAlgo choisir() qui retourne le nœud `a d´evelopper ce tour-
ci (celui dans la liste ouverte avec la distance la plus courte au d´epart - en cas
d’´egalit´e, peu importe le nœud retourn´e)
une m´ethode void traiterNoeud(NoeudAlgo n) qui d´eveloppe le nœud net
fait les traitements adapt´es
une m´ethode int indiceOuvert(Noeud n) et int indiceFerme(Noeud n) qui
retourne l’indice du nœud dans la liste ouverte ou ferm´ee (-1 si le nœud n’est
pas pr´esent)
Cpt JAVA - TD 4 - Assertions et algorithme de Dijkstra 5
1 / 7 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !