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
© Copyright 2024 Paperzz