• Aucun résultat trouvé

Cours 4 : Dijkstra

N/A
N/A
Protected

Academic year: 2022

Partager "Cours 4 : Dijkstra"

Copied!
35
0
0

Texte intégral

(1)

Cours 4 : Dijkstra

Vincent Guigue UPMC - LIP6

Vincent Guigue 2i013 - Course de Voiture 1/27

(2)

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

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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

(8)

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

(9)

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

(10)

Dijkstra : exemple

Vincent Guigue 2i013 - Course de Voiture 8/27

(11)

Dijkstra : exemple

Vincent Guigue 2i013 - Course de Voiture 8/27

(12)

Dijkstra : exemple

Vincent Guigue 2i013 - Course de Voiture 8/27

(13)

Dijkstra : exemple

Vincent Guigue 2i013 - Course de Voiture 8/27

(14)

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)

- ∀iG, Vi=∞, ∀iA, 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: ViVois(s)

· Mettre à jourVi

Vincent Guigue 2i013 - Course de Voiture 9/27

(15)

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

(16)

Adaptation détaillée (1)

1 Initialisation : distances infinies (sauf pour les noeuds d’arrivée)

- ∀iG, Vi=∞, ∀iA, Vi =0

Tous les points sont dansQ

Vincent Guigue 2i013 - Course de Voiture 11/27

(17)

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

(18)

Adaptation détaillée (3)

2 ...

1 2

3 Pour tous les voisins des: ViVois(s)

· Mettre à jourVi

Identification des voisins

Vincent Guigue 2i013 - Course de Voiture 13/27

(19)

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

(20)

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

(21)

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

(22)

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

(23)

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

(24)

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

(25)

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

(26)

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

(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

(28)

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

(29)

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

(30)

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

(31)

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

(32)

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

(33)

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

(34)

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

(35)

Proposition d’architecture

Vincent Guigue 2i013 - Course de Voiture 27/27

Références

Documents relatifs

• Une fois que ce cours a été validé, vous pouvez poursuivre votre parcours en vue du diplôme Gemmologue de Carrière ou du diplôme Gemmologue Diamant.. • Ce parcours se fait

Compiler un programme signifie traduire le fichier le contenant en un langage compréhensible et exécutable par la machine cible4. On compile un fichier Prog.c par

Exit, voice and loyalty a ainsi pour objectif d’étudier les conditions de développement, conjoint ou non, des deux modes d’action, leur efficacité respective dans

TP « Le chimpanzé n’est pas l’ancêtre de l’homme : l’histoire de la lignée humaine » Premier problème - Mise en situation et recherches à mener.. Lors du précédent TP

La m´ethode toString() retourne la repr´esentation d’un objet sous forme de chaˆıne de caract`eres (par d´efaut le nom de la classe suivi de son hashCode) :.

La répartition par sexe montre que : chez la femme, le taux brut d’incidence de cancers est de 162,9 pour 100 000 habitants, avec un taux standardisé de 195,4 pour 100

L’approche Langage de Programmation par Composants (COLs - Component-Oriented Languages) Propose de nouveaux langages qui sont ` a la fois des langages de descriptions

L’évaluation de l’activité antioxydante in vitro des extraits a été réalisée par différentes méthodes, à savoir, le piégeage du radical libre DPPH• et le pouvoir