Vous êtes sur la page 1sur 3

Algorithmes dans les graphes Université Paris-Dauphine – L3 MIAGE App

TP 2: Parcours en profondeur par un robot


Adapté d’un sujet de M. Liedloff.

Un robot appelé Oscar cherche un cookie caché dans une grille. Pour explorer cette grille, et donc trouver le cookie,
il utilise un parcours en profondeur. Votre mission est d’implémenter ce parcours pour rendre Oscar intelligent !

Description de la grille
Oscar se trouve sur une grille, entourée de murs. Celle-ci est composée de murs, d’herbes et d’un cookie. Initiale-
ment Oscar est sur l’une des cellules de la grille. À chaque étape, il se déplace sur l’une des cellules voisines (au
nord, à l’ouest, au sud ou à l’est) à condition qu’il n’y ait pas de mur sur cette cellule.

La grille est décrite en python par une liste de listes. Ainsi, la cellule grille[i][j] correspond à la cellule de
la i-ième ligne et de la j-ième colonne. La cellule en haut à gauche est celle indicée (0, 0).
Chaque cellule contient l’une des valeurs suivantes :
— wall si la cellule contient un mur ;
— grass si la cellule contient de l’herbe ;
— cookie si la cellule contient le cookie ;
— robot si la cellule contient le robot Oscar.
Dans un premier temps, cette grille vous est fournie ainsi que la position initiale d’Oscar. Cela vous évitera de
parcourir la grille pour trouver le robot. Pour lire le fichier grille.json contenant ces données, nous utilisons
le module json dans la fonction creer_grille() :
import json
...
def creer_grille (l,c):
with open(" grille .json", "r", encoding ="utf −8") as fichier :
(grille , p) = json.load( fichier )
return grille , (p[0],p[1])
Pour ce TP, récupérer les fichiers situés à cette adresse https://www.lamsade.dauphine.fr/~sikora/
ens/graphes/dfs/ et les enregistrer dans un même répertoire.
Algorithmes dans les graphes page 2

Interface Graphique
Pour afficher la grille à l’écran nous utiliserons la bibliothèque graphique tkinter ; son utilisation est masquée
par la classe GUI qui vous est fournie. Grâce à une fonction que nous détaillerons plus tard, le robot pourra être
déplacé à l’écran.
Sachez que cette interface réagit aux touches q (quitter l’interface), + (accélérer les déplacements d’Oscar) et −
(ralentir Oscar).

Exercice 1 : Rendre Oscar intelligent

Le but final de l’exercice est d’écrire la fonction ParcoursRobot qui implémente un parcours en profondeur
afin qu’Oscar puisse explorer la grille. Oscar devra s’arrêter lorsqu’il aura atteint la cellule contenant le cookie,
ou à défaut lorsqu’il aura exploré toute la grille sans pouvoir atteindre le cookie. Cela peut arriver si le cookie est
entouré de murs et donc inaccessible.
Q 1.1 Écrire une fonction voisins(G,pos) qui attend en paramètres :
— une grille G comme définie précédemment ;
— une position pos, contenant un couple (i, j) représentant une cellule de la grille.
Cette fonction retourne un ensemble contenant les coordonnées (i0 , j 0 ) des cellule voisines sans mur de la position
pos sur la grille G.
Q 1.2 Vous pouvez maintenant implémenter la fonction qui réalise le parcours en profondeur :
ParcoursRobot(G, depart, gui). On préférera une version itérative de ce parcours. Cette fonction attend
en paramètres :
— une grille G ;
— la position initiale du robot stocké dans le paramètre depart qui est un couple (i,j) ;
— l’interface graphique gui (pour Graphic User Interface)
Pour l’affichage des déplacements d’Oscar dans l’interface graphique, il y a une fonction à utiliser :
gui.deplacer_oscar(chemin).
chemin est une liste de positions représentant le chemin dans l’arbre DFS entre la racine et la position où vous
souhaitez déplacer Oscar. Lors de l’ajout d’un sommet dans la pile, vous devrez stocker le chemin ayant permis
d’atteindre ce sommet.
Écrire la fonction ParcoursRobot(G, depart, gui) pour que le robot puisse enfin explorer cette grille et
s’arrêter lorsqu’il trouvera le cookie, c’est-a-dire lorsque G[i][j]=="cookie".
Pour vous aider, voici une version itérative de l’algorithme du parcours en profondeur (wikipedia) :
Algorithmes dans les graphes page 3

Indication : on stockera plutôt des couples (sommet, chemin entre départ et sommet).

Exercice 2 : Génération

Maintenant qu’Oscar est pleinement opérationnel, écrire une fonction creer_grille(l,c) qui crée une grille
aléatoire de dimension l × c (c’est-à-dire, l lignes et c colonnes). Votre fonction doit créer des murs sur les bords
de la grille, y placer des murs aléatoirement (pas trop pour que le robot puisse circuler sur la grille), un cookie et
Oscar ! Les cellules ne contenant ni murs, ni cookie, ni robot devront être recouvertes d’herbe.
Cette fonction creer_grille(l,c) retourne deux objets (return G, (i,j)) :
— la grille G générée ;
— un couple (i,j) contenant la position initiale du robot.
Pour placer à la position (i, j) l’un des objets mur, herbe, cookie, Oscar :
— M[i][j] = ’wall’
— M[i][j] = ’grass’
— M[i][j] = ’cookie’
— M[i][j] = ’robot’
Pour obtenir un entier aléatoire entre a (inclus) et b (inclus), vous pouvez utiliser la fonction random.randint(a, b).

Vous aimerez peut-être aussi