Université de Bordeaux Licence Informatique, 3e année
Année 2016-2017 TD/TP: feuille 4
Techniques Algorithmiques et Programmation
Complément sur l’algorithme A*
On rappelle l’algorithme A* vu en cours :
Algorithme A* (du cours)
Entrée : un graphe G, potentiellement asymétrique, arête-valué par une fonction de poids
ωtelle que ω(e)>0,s, t V(G), et une heuristique h(x, y)>0estimant la distance
entre les sommets xet ydans G.
Sortie : un chemin entre set tdans G, une erreur s’il n’a pas été trouvé.
1. Poser P:= ,Q:= {s},cout[s] := 0,parent[s] := ,f[s] := cout[s] + h(s, t)
2. Tantque Q6=:
(a) Choisir uQtel que f[u]est minimum
(b) Si u=t, alors renvoyer le chemin de sàtgrâce à la relation parent[u]:tparent[t]
parent[parent[t]] → · · · → s
(c) Ajouter uàP
(d) Pour tout voisin v /Pde u:
i. Poser c:= cout[u] + ω(u, v)
ii. Si v /Q, ajouter vàQ
iii. Sinon, si c>cout[v]continuer la boucle
iv. cout[v] = c,parent[v] = u,f[v] = c+h(v, t)
3. Renvoyer l’erreur : « le chemin n’a pas été trouvé »
On dit que l’heuristique hest monotone si h(x, t)6ω(x, y) + h(y, t)pour tout voisin yde x. On
dit que l’heuristique hsous-estime la distance si h(x, y)6distG(x, y)pour tous sommets x, y tels
que h(x, y)est définie.
Dans le cours on a vu la propriété suivante qu’on admettra : si hest monotone et sous-estime la
distance alors l’algorithme A* calcule un plus court chemin entre set t(s’il existe).
Question 1. Montrer que si hvérifie l’inégalité triangulaire et sous-estime la distance, alors l’algo-
rithme A* calcule correctement un plus court chemin entre set t(s’il existe).
Question 2. Construisez un exemple où hne sous-estime pas la distance et A* ne trouve pas le plus
court chemin entre set t, alors qu’il existe.
L’algorithme présenté dans le cours est en fait une variante de l’algorithme A* original. Dans sa
version originale, A* peut modifier cout[u]pour un sommet de udéjà dans Pet le remettre dans Q.
L’analyse de sa complexité est alors plus complexe. On peut montrer que l’algorithme original A*
calcule toujours un court chemin entre set tdès que hsous-estime la distance.
Question 3. Construisez un exemple où l’algorithme A* vu en cours ne calcule pas correctement le
plus court chemin entre set t(qui existe par ailleurs) alors que hsous-estime la distance.
1 En TP
Télécharger les fichiers correspondant au TP à partir de la page de l’UE disponible ci-après :
http://dept-info.labri.fr/~gavoille/UE-TAP.html
Compléter le fichier a_star.c et modifier à votre gré mygrid.txt. A priori vous n’avez à modifier
que ces fichiers là. Tester correctement votre algorithme en prennant des exemples pertinents qui
différencient Dijkstra de A* (avec l’heuristique vol d’oiseau), en prennant éventuellement des exemples
qui font échouer A* (comme les cellules V_TUNNEL de poids <1). Programmer les améliorations
proposées.
Dans un deuxième temps, on désire implémenter une version de A* (A_star2(G,h)) qui construit
en parallèle un chemin de sàtet un chemin de tàs. Pour comparer les performances de A_star(G,h)
et A_star2(G,h)il faudra afficher le nombre de sommets marqués en fin de traitement, c’est-à-dire le
nombre de sommets dont la marque est différente de la marque M_NULL.
L’idée est d’exécuter A* depuis set depuis t. On notera Psl’ensemble Pclassique lorsque A*
s’exécute depuis s, et Ptl’ensemble Plorsque A* s’exécute depuis t. Le tas Qquant à lui est commun
aux deux exécutions. Lorsqu’on extrait un noeud du tas il sera le plus proche soit de ssoit de t, et
on l’ajoutera alors soit à Pssoit à Pt.
Plus précisément :
1. Ajouter un champ int source;à la structure node indiquant si un noeud a été exploré à partir
de s(=1) ou de t(=0).
2. Ajouter dans l’enum du fichier variables.h un nouveau type de marque, disons M_USED2,in-
diquant que le noeud a été ajouté dans Pt. Pour des raisons techniques, il sera préférable de
l’ajouter à la toute fin de l’enum. Vous utiliserez l’ancienne marque M_USED pour indiquer qu’il
est dans Ps.
3. Dans le fichier utils.c ajouter une couleur au tableau color[], toujours en fin de tableau, par
exemple {0x66,0x12,0x66}pour distinguer les ensembles Pset Pt.
4. Lorsque vous ajoutez un noeud à Qfaite attention de marquer le sommet correspondant à
M_FRONT seulement s’il n’est pas déjà marqué, ce qui est rendu possible maintenant à cause des
deux ensembles Pset Pt, et de leur marquage.
L’algorithme s’arrête lorsqu’un noeud extrait du tas Qcorrespond à un sommet déjà marqué mais
par une autre origine. Cela arrive par exemple, si l’origine du noeud uest s(u->source=1) alors que
la marque du sommet qu’il représente est M_USED2 (donc est dans Pt). Pour reconstruire le chemin
complet vous pourrez chercher un noeud du tas dont le père vest un noeud correspondant au même
sommet que umais issu de l’autre origine.
1 / 2 100%