Cours 4 : Dijkstra
Vincent Guigue UPMC - LIP6
Vincent Guigue 2i013 - Course de Voiture 1/27
Date limite pour jouer les premières courses
◦ En fin de TME 4 vous devez avoir un code fonctionnelsur : - Circuit (Construction, Gestion, Image...)
- Voiture (Construction, Moteur Physique...) - Simulation
- Radar (simple)
- Strategy (dont une basée sur le Radar)
◦ Extension possible à dimanche soir
◦ A partir de cette semaine : - Appel en TME
- Groupes (presque) figés
Vincent Guigue 2i013 - Course de Voiture 2/27
Retour sur la séance 3
◦ NullPointerException
◦ Organisation main/autres classes
◦ Throws / try catch
◦ intérêt de la simulation
◦ maxTurn strategy radar
◦ radar et ligne d’arrivée
Vincent Guigue 2i013 - Course de Voiture 3/27
Généralités sur le polymorphisme
◦ Evolutivité (+réutilisation), sécurisation ?
◦ Classe abstraite (ou Interface) - Pas d’implémentation possible
1 CAbs a = new CAbs() ;
2 CAbs a = new C H e r i t a g e C o n c r e t ( ) ;
- On accède seulement aux méthodes de CAbs (cf role du compilateur)
◦ Tableaux de classe abstraite - Implémentation possible
1 CAbs [ ] a = new CAbs [ 1 0 ] ; //OU A r r a y L i s t <CAbs> a = new . . .
- On peut mettre tous les objets qui héritent (ou implémentent) CAbs.
Vincent Guigue 2i013 - Course de Voiture 4/27
Généralités sur le polymorphisme (2)
◦ Mettre des objets de type différent dans une même structure de données
- PGCD : plus grand commun dénominateur
- Sur la liste en question, nous souhaitons faire un nombre limité d’opérations... Qui sont communes à plusieurs objets
◦ Exemples :
- Envoyer/recevoir un signal pour plusieurs interfaces graphiques - Tous les observeurs se dessinent
- Toutes les voitures se conduisent - Tous les boutons s’écoutent
- LI230 : toutes les figurent géométriques sont dans le dessin global
Vincent Guigue 2i013 - Course de Voiture 5/27
Architecture de base figée
Tous les éléments principaux ont été vus :
◦ Moteur physique : complètement opérationnel et fiable
◦ Sortie graphique
◦ Architecture générale : pas grand chose à ajouter
◦ Algorithmique radar qui permet de jouer des courses Objectifs :
◦ Jouer les courses les plus difficiles
◦ Améliorer les temps de parcours
◦ Améliorer la présentation du projet (temps réel...)
Vincent Guigue 2i013 - Course de Voiture 6/27
Dijkstra : principe
◦ Le radar est intéressant mais limité ?
◦ L’information qui nous intéresse est la distance à l’arrivée
◦ L’algorithme pour la calculer est Dijkstra
Vincent Guigue 2i013 - Course de Voiture 7/27
Dijkstra : principe
◦ Le radar est intéressant mais limité ?
◦ L’information qui nous intéresse est la distance à l’arrivée
◦ L’algorithme pour la calculer est Dijkstra
Vincent Guigue 2i013 - Course de Voiture 7/27
Dijkstra : principe
◦ Le radar est intéressant mais limité ?
◦ L’information qui nous intéresse est la distance à l’arrivée
◦ L’algorithme pour la calculer est Dijkstra
Vincent Guigue 2i013 - Course de Voiture 7/27
Dijkstra : exemple
Vincent Guigue 2i013 - Course de Voiture 8/27
Dijkstra : exemple
Vincent Guigue 2i013 - Course de Voiture 8/27
Dijkstra : exemple
Vincent Guigue 2i013 - Course de Voiture 8/27
Dijkstra : exemple
Vincent Guigue 2i013 - Course de Voiture 8/27
Dijkstra : algorithme Soit en entrée :
◦ G = (V,E) : graphe (noeuds & arc),
- chaque noeud contient la distance à l’arrivéeVi, - chaque arc contient une distanceEij
◦ A : ensemble des noeuds d’arrivée
1 Initialisation : distances infinies (sauf pour les noeuds d’arrivée)
- ∀i∈G, Vi=∞, ∀i∈A, Vi =0
2 Q ←V (liste des noeuds à traiter)
3 Tant que Q non vide
1 s=min(Q)noeud de score le plus faible
2 Q={Q/s}on retires deQ
3 Pour tous les voisins des: Vi∈Vois(s)
· Mettre à jourVi
Vincent Guigue 2i013 - Course de Voiture 9/27
Dijkstra : adaptation au projet
◦ Propagation de l’information de distance à partir de la cible :
- Liste des points à traiter Q
- Sélection du plus proche de l’arrivée - Récupération des voisins
- Mise à jour des voisins
- Itération tant que Q n’est pas vide
◦ NB : cet algorithme ne tient pas compte du modèle de déplacement de la voiture, il ne caractérise que les cases du plateau de jeu.
Vincent Guigue 2i013 - Course de Voiture 10/27
Adaptation détaillée (1)
1 Initialisation : distances infinies (sauf pour les noeuds d’arrivée)
- ∀i∈G, Vi=∞, ∀i∈A, Vi =0
Tous les points sont dansQ
Vincent Guigue 2i013 - Course de Voiture 11/27
Adaptation détaillée (2)
2 Tant que Q non vide
1 s=min(Q)noeud de score le plus faible
2 Q={Q/s}on retires deQ
Tous les points sont dansQ sauf s
Vincent Guigue 2i013 - Course de Voiture 12/27
Adaptation détaillée (3)
2 ...
1 2
3 Pour tous les voisins des: Vi∈Vois(s)
· Mettre à jourVi
Identification des voisins
Vincent Guigue 2i013 - Course de Voiture 13/27
Adaptation détaillée (4) : voisinage de la ligne d’arrivée
Cas très particulier
Lorsque le point de référence est sur la ligne d’arrivée
◦ Résolution d’un problème sur la ligne d’arrivée : mise à jour partielle
Avant : Après :
◦ Critère d’élimination :OV~ ·sens~ >0
Vincent Guigue 2i013 - Course de Voiture 14/27
Adaptation détaillée (5) :
◦ Ne pas mettre à jour les cases non roulables (évidemment)
◦ Mise à jour des distances (souvent en valeurs entières) :
ATTENTION : mise à jour est conditionnelle sid[vi]>d[s] +Poids(s,vi)alors
d[vi] :=d[s] +Poids(s,vi)
Vincent Guigue 2i013 - Course de Voiture 15/27
Adaptation détaillée (6) : résultat
◦ Pour chaque voisin, on cherche la meilleure distance à l’arrivée :
- Pour le point vert bas de score 0
· Soit le score est 0 (pré-établi)
· Soit le score est 0 + 10 (venant de la case violette)
· On garde 0
◦ Pour les points sans score, on fait la mise à jour :
- Voisin direct : +10 (=1 * 10) - Voisin diag : +14 ( racine 2 * 10)
◦ Supprimer le point violet de Q
◦ Itérer le processus
Vincent Guigue 2i013 - Course de Voiture 16/27
Améliorations (1)
◦ L’objet dijkstra stocke une matrice de distances initialisées à Double.POSITIVE_INFINITY
1 d o u b l e[ ] [ ] d i s t a n c e =
2 new d o u b l e[ c i r c u i t . g e t H e i g h t ( ) ] [ c i r c u i t . g e t W i d t h ( ) ] ;
3 f o r( i . . . ) f o r( j . . . ) d i s t a n c e [ i ] [ j ] = D o u b l e . POSITIVE_INFINITY ;
◦ La liste Q est une liste de Vecteur
◦ La liste Qest simplifiée :
- Les points de scores infinis ne sont pas stockés dansQ : gros gain d’efficacité
- NB : ils ne peuvent pas être candidat pour pour le score min
◦ Nouvelles règles de gestion deQ
- On ajoute les voisins qui avaient un score infini
- On n’ajoute pas les points nonroulables ou du mauvais coté de la ligne d’arrivée
Vincent Guigue 2i013 - Course de Voiture 17/27
Améliorations (2)
Utilisation des fonctions avancées sur les listes :
◦ Dans la classe Collectionsil existe la méthode :
1 s t a t i c <T> T min ( C o l l e c t i o n <? e x t e n d s T> c o l l ,
2 C o m p a r a t o r <? s u p e r T> comp )
◦ Une ArrayListextends Collection
◦ Mais qu’est ce qu’un Comparator?
Vincent Guigue 2i013 - Course de Voiture 18/27
Debbuggage = affichage
Pour corriger certains bugs, le plus simple est d’afficher le résultat dans une image à la taille du terrain avec un code couleur
particulier :
1 // p o u r un p i x e l x , y
2 new C o l o r ( (i n t) ( d i j k . g e t D i s t ( x , y ) % 2 5 5 . ) , 0 , 0 ) ;
Vincent Guigue 2i013 - Course de Voiture 19/27
Comparator
Les fonctions classiques sur les listes (tri, min, max, ...)sont déjà implémentées dans la classeCollections... Mais ces fonctions demande une comparaison entre objets :
◦ Soit les objets implements Comparable:
1 p u b l i c i n t compareTo (T o ) // r e t o u r n e +1/0/−1
◦ Soit on construit un Comparator dans une classe à part. C’est à dire un objet quiimplémente l’interface Comparator et contient donc la méthode suivante :
1 p u b l i c i n t comp are (T o1 , T o2 ) ;
Capacité de comparaison
Si on est capable de comparer 2 objets, de nouvelles opérations deviennent possibles sur les listes.
Vincent Guigue 2i013 - Course de Voiture 20/27
Cas non trivial
L’application à notre projet n’est pas simple :
◦ La liste Q contient des coordonnées (Vecteur)
◦ Le critère qui nous intéresse est : la distance d’un point à l’arrivée
- L’information n’est pas contenu dans l’objet (Vecteur)
◦ Comment gérer le problème ?
Vincent Guigue 2i013 - Course de Voiture 21/27
Cas non trivial
L’application à notre projet n’est pas simple :
◦ La liste Q contient des coordonnées (Vecteur)
◦ Le critère qui nous intéresse est : la distance d’un point à l’arrivée
- L’information n’est pas contenu dans l’objet (Vecteur)
◦ Comment gérer le problème ?
Ajouter un attribut double[][] distancedans le Comparator...
Mais cet objet doit être mis à jour au fur et à mesure de l’algorithme
Vincent Guigue 2i013 - Course de Voiture 21/27
Cas non trivial
L’application à notre projet n’est pas simple :
◦ La liste Q contient des coordonnées (Vecteur)
◦ Le critère qui nous intéresse est : la distance d’un point à l’arrivée
- L’information n’est pas contenu dans l’objet (Vecteur)
◦ Comment gérer le problème ?
Ajouter un attribut double[][] distancedans le Comparator...
Mais cet objet doit être mis à jour au fur et à mesure de l’algorithme
Si on gère bien les références, pas de problème
Vincent Guigue 2i013 - Course de Voiture 21/27
Implémentation
1 p u b l i c c l a s s C o m p a r a t o r D i j k
2 implements C o m p a r a t o r <V e c t e u r > {
3 p r i v a t e d o u b l e[ ] [ ] d i s t ;
4
5 p u b l i c C o m p a r a t o r D i j k (d o u b l e[ ] [ ] d i s t ) {
6 t h i s. d i s t = d i s t ;
7 }
8 p u b l i c i n t comp are ( V e c t e u r o1 ,
9 V e c t e u r o2 ) {
10 i n t x1 = (i n t) o1 . g e t X ( ) ;
11 i n t y1= (i n t) o1 . g e t Y ( ) ;
12 i n t x2 = (i n t) o2 . g e t X ( ) ;
13 i n t y2= (i n t) o2 . g e t Y ( ) ;
14 i f( d i s t [ x1 ] [ y1 ] > d i s t [ x2 ] [ y2 ] )
15 r e t u r n 1 ;
16 e l s e i f ( d i s t [ x1 ] [ y1 ] == d i s t [ x2 ] [ y2 ] )
17 r e t u r n 0 ;
18 r e t u r n −1;
19 }
20 }
+ void optimize() - double[][] distance - ...
Dijkstra double[][]
+ int compare(Vecteur v1, Vecteur v2) Comparator<Vecteur> <<INT>>
+ int compare(Vecteur v1, Vecteur v2) - double[][] distance
ComparatorDijk
Vincent Guigue 2i013 - Course de Voiture 22/27
Syntaxe d’usage Attention
Code indicatif...
1 // d a n s d i j k s t r a
2 d i s t = new d o u b l e[ t r a c k . g e t H e i g h t ( ) ] [ t r a c k . g e t W i d t h ( ) ] ;
3 q = new A r r a y L i s t <V e c t e u r > ( 1 0 0 0 ) ;
4 comp = new C o m p a r a t o r D i j k ( d i s t ) ;
5
6 // i n i t i a l i s a t i o n de d i s t
7 f o r(i n t i =0; i < d i s t . l e n g t h ; i ++)
8 f o r(i n t j =0; j < d i s t [ 0 ] . l e n g t h ; j ++)
9 d i s t [ i ] [ j ] = D o u b l e . POSITIVE_INFINITY ;
10 f o r( V e c t e u r p : a r r i v e e s ) {
11 d i s t [ (i n t) p . ge t X ( ) ] [ (i n t) p . ge t Y ( ) ] = 0 ;
12 q . add ( p ) ;
13 }
14
15 // r e c h e r c h e du min :
16 V e c t e u r s = C o l l e c t i o n s . min ( q , comp ) ;
17 // e l i m i n a t i o n
18 q . r e m o v e ( s ) ;
Vincent Guigue 2i013 - Course de Voiture 23/27
Optimisation
Les recherches de minimum sont coûteuses et il revient bien moins cher de maintenir une liste ordonnée des coordonnées... Cela correspond une structure de données particulière :
Vincent Guigue 2i013 - Course de Voiture 24/27
Optimisation
Les recherches de minimum sont coûteuses et il revient bien moins cher de maintenir une liste ordonnée des coordonnées... Cela correspond une structure de données particulière :le tas
PriorityBlockingQueue
En JAVA, uneimplémentation standardest disponible : la PriorityBlockingQueue. Elle remplace alors l’arraylist pour la gestion deQ. On utiliser les méthodes offer,pollet remove pour gérer les Vecteur du tas... Pour le reste se référer à la javadoc.
Vincent Guigue 2i013 - Course de Voiture 24/27
Recherche locale à partir de la voiture
◦ Usage local : cherche sur les pixels voisins, le score le plus faible
- Ca seprogramme assez facilement
- Ca ne tientpas compte de l’inertie
· On rentre dans l’herbe à tous les coups ! - Chercher une meilleure
stratégie ?
Vincent Guigue 2i013 - Course de Voiture 25/27
Solution : le radar Dijkstra
◦ Combiner un radar avec Dijkstra...
◦ Attention, ce n’est pas le bout du radar qui nous intéresse mais le meilleur score croisé
Vincent Guigue 2i013 - Course de Voiture 26/27
Proposition d’architecture
Vincent Guigue 2i013 - Course de Voiture 27/27