Cours 4 : Dijkstra

Polymorphisme
Dijkstra
Gestion listes
Usage
Cours 4 : Dijkstra
Vincent Guigue
UPMC - LIP6
Vincent Guigue
LI260 - Course de Voiture
1/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Date limite pour jouer les premières courses
◦ En fin de TME 4 vous devez avoir un code fonctionnel sur :
-
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
LI260 - Course de Voiture
2/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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
LI260 - Course de Voiture
3/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Généralités sur le polymorphisme
◦ Evolutivité (+réutilisation), sécurisation ?
◦ Classe abstraite (ou Interface)
- Pas d’implémentation possible
1
2
CAbs a = new CAbs() ;
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
LI260 - Course de Voiture
4/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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
LI260 - Course de Voiture
5/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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
LI260 - Course de Voiture
6/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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
LI260 - Course de Voiture
7/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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
LI260 - Course de Voiture
7/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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
LI260 - Course de Voiture
7/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Dijkstra : exemple
Vincent Guigue
LI260 - Course de Voiture
8/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Dijkstra : exemple
Vincent Guigue
LI260 - Course de Voiture
8/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Dijkstra : exemple
Vincent Guigue
LI260 - Course de Voiture
8/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Dijkstra : exemple
Vincent Guigue
LI260 - Course de Voiture
8/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Dijkstra : algorithme
Soit en entrée :
◦ G = (V , E ) : graphe (noeuds & arc),
- chaque noeud contient la distance à l’arrivée Vi ,
- chaque arc contient une distance Eij
◦ A : ensemble des noeuds d’arrivée
1
Initialisation : distances infinies (sauf pour les noeuds
d’arrivée)
- ∀i ∈ G , Vi = ∞,
2
3
∀i ∈ A, Vi = 0
Q ← V (liste des noeuds à traiter)
Tant que Q non vide
1
2
3
s = min(Q) noeud de score le plus faible
Q = {Q/s} on retire s de Q
Pour tous les voisins de s : Vi ∈ Vois(s)
· Mettre à jour Vi
Vincent Guigue
LI260 - Course de Voiture
9/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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
LI260 - Course de Voiture
10/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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 dans Q
Vincent Guigue
LI260 - Course de Voiture
11/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Adaptation détaillée (2)
2
Tant que Q non vide
1
2
s = min(Q) noeud de score le plus faible
Q = {Q/s} on retire s de Q
Tous les points sont dans Q sauf s
Vincent Guigue
LI260 - Course de Voiture
12/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Adaptation détaillée (3)
2
...
1
2
3
Pour tous les voisins de s : Vi ∈ Vois(s)
· Mettre à jour Vi
Identification des voisins
Vincent Guigue
LI260 - Course de Voiture
13/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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 :
~
~ >0
◦ Critère d’élimination : OV · sens
Vincent Guigue
LI260 - Course de Voiture
14/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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
si d[vi ] > d[s] + Poids(s, vi ) alors
d[vi ] := d[s] + Poids(s, vi )
Vincent Guigue
LI260 - Course de Voiture
15/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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
LI260 - Course de Voiture
16/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Améliorations (1)
◦ L’objet dijkstra stocke une matrice de distances initialisées à
Double.POSITIVE_INFINITY
1
2
3
double [ ] [ ] d i s t a n c e =
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 ( ) ] ;
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 dans Q : gros
gain d’efficacité
- NB : ils ne peuvent pas être candidat pour pour le score min
◦ Nouvelles règles de gestion de Q
- On ajoute les voisins qui avaient un score infini
- On n’ajoute pas les points non roulables ou du mauvais coté
de la ligne d’arrivée
Vincent Guigue
LI260 - Course de Voiture
17/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Améliorations (2)
Utilisation des fonctions avancées sur les listes :
◦ Dans la classe Collections il existe la méthode :
1
2
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 ,
Comparator <? s u p e r T> comp )
◦ Une ArrayList extends Collection
◦ Mais qu’est ce qu’un Comparator ?
Vincent Guigue
LI260 - Course de Voiture
18/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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
2
// p o u r un p i x e l x , y
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
LI260 - Course de Voiture
19/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Comparator
Les fonctions classiques sur les listes (tri, min, max, ...) sont déjà
implémentées dans la classe Collections... Mais ces fonctions
demande une comparaison entre objets :
◦ Soit les objets implements Comparable :
1
public int
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 qui implémente l’interface Comparator et
contient donc la méthode suivante :
1
public int
compare (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
LI260 - Course de Voiture
20/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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
LI260 - Course de Voiture
21/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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[][] distance dans le
Comparator...
Mais cet objet doit être mis à jour au fur et à mesure de
l’algorithme
Vincent Guigue
LI260 - Course de Voiture
21/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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[][] distance dans 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
LI260 - Course de Voiture
21/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Implémentation
1
2
3
public c l a s s ComparatorDijk
implements Comparator<V e c t e u r > {
p r i v a t e double [ ] [ ] d i s t ;
4
p u b l i c ComparatorDijk ( double [ ] [ ] d i s t ) {
this . dist = dist ;
}
ComparatorDijk
p u b l i c i n t compare ( V e c t e u r o1 ,
- double[][] distance
+ int compare(Vecteur v1, Vecteur v2)
V e c t e u r o2 ) {
i n t x1 = ( i n t ) o1 . getX ( ) ;
double[][]
i n t y1= ( i n t ) o1 . getY ( ) ;
i n t x2 = ( i n t ) o2 . getX ( ) ;
i n t y2= ( i n t ) o2 . getY ( ) ;
i f ( d i s t [ x1 ] [ y1 ] > d i s t [ x2 ] [ y2 ] )
return 1;
Dijkstra
e l s e i f ( d i s t [ x1 ] [ y1 ] == d i s t [ x2 ] [ y2 ] )
- double[][] distance
return 0;
- ...
r e t u r n −1;
+ void optimize()
}
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Comparator<Vecteur> <<INT>>
+ int compare(Vecteur v1, Vecteur v2)
}
Vincent Guigue
LI260 - Course de Voiture
22/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Syntaxe d’usage
Attention
Code indicatif...
1
2
3
4
// d a n s d i j k s t r a
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 ( ) ] ;
q = new A r r a y L i s t <V e c t e u r > ( 1 0 0 0 ) ;
comp = new C o m p a r a t o r D i j k ( d i s t ) ;
5
6
7
8
9
10
11
12
13
// i n i t i a l i s a t i o n de d i s t
f o r ( i n t i =0; i <d i s t . l e n g t h ; i ++)
f o r ( i n t j =0; j <d i s t [ 0 ] . l e n g t h ; j ++)
d i s t [ i ] [ j ] = D o u b l e . POSITIVE_INFINITY ;
f o r ( Vecteur p : a r r i v e e s ){
d i s t [ ( i n t ) p . getX ( ) ] [ ( i n t ) p . getY ( ) ] = 0 ;
q . add ( p ) ;
}
14
15
16
17
18
// r e c h e r c h e du min :
V e c t e u r s = C o l l e c t i o n s . min ( q , comp ) ;
// e l i m i n a t i o n
q . remove ( s ) ;
Vincent Guigue
LI260 - Course de Voiture
23/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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
LI260 - Course de Voiture
24/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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, une implémentation standard est disponible : la
PriorityBlockingQueue. Elle remplace alors l’arraylist pour la
gestion de Q. On utiliser les méthodes offer, poll et remove
pour gérer les Vecteur du tas... Pour le reste se référer à la javadoc.
Vincent Guigue
LI260 - Course de Voiture
24/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Recherche locale à partir de la voiture
◦ Usage local : cherche sur les
pixels voisins, le score le plus
faible
- Ca se programme assez
facilement
- Ca ne tient pas compte de
l’inertie
· On rentre dans l’herbe
à tous les coups !
- Chercher une meilleure
stratégie ?
Vincent Guigue
LI260 - Course de Voiture
25/27
Polymorphisme
Dijkstra
Gestion listes
Usage
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
LI260 - Course de Voiture
26/27
Polymorphisme
Dijkstra
Gestion listes
Usage
Proposition d’architecture
Vincent Guigue
LI260 - Course de Voiture
27/27