• Aucun résultat trouvé

Cours 3 : Stratégie Radar

N/A
N/A
Protected

Academic year: 2022

Partager "Cours 3 : Stratégie Radar"

Copied!
68
0
0

Texte intégral

(1)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Cours 3 : Stratégie Radar

Vincent Guigue

UPMC - LIP6

(2)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Lignes/colonnes dans les fichiers trk

Comment est formé le .trk ?

fichier classique : 1024

768

gggggg...

1024 caractères par lignes ...

768 lignes

matrice à créer, de la même forme que le fichier : Terrain[][] mat = new Terrain[768][1024]

Très important de respecter ce format

- Les coordonnées de la voiture seront toujours réfléchies par rapport à l’image

- La voiture se déplace dans un pixel : attention à l’origine du repère !

(3)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Lignes/colonnes dans les fichiers trk

Comment est formé le .trk ?

fichier classique : 1024

768

gggggg...

1024 caractères par lignes ...

768 lignes

matrice à créer, de la même forme que le fichier : Terrain[][] mat = new Terrain[768][1024]

Très important de respecter ce format

- Les coordonnées de la voiture seront toujours réfléchies par rapport à l’image

- La voiture se déplace dans un pixel : attention à l’origine du repère !

(4)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Lignes/colonnes dans les fichiers trk

Comment est formé le .trk ?

fichier classique : 1024

768

gggggg...

1024 caractères par lignes ...

768 lignes

matrice à créer, de la même forme que le fichier : Terrain[][] mat = new Terrain[768][1024]

Très important de respecter ce format

- Les coordonnées de la voiture seront toujours réfléchies par rapport à l’image

- La voiture se déplace dans un pixel : attention à l’origine du repère !

(5)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Problème : matrice vs image Proposition :

Notre référence : la matrice de terrain

- Ne pas modifier les directions proposées jusqu’ici - Image = simple représentation

Herbe Route Route Route

Herbe

Herbe

Herbe Route

Route Herbe Matrice de Terrain

I

J I

J

Direction = (0,1)

(6)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Solution basique

Synchronisation

basique

des indices :

Dès que je dois afficher qqch en (i,j)

je change le pixel (i,j)

1 p u b l i c s t a t i c B u f f e r e d I m a g e i m a g e F r o m C i r c u i t ( C i r c u i t t r a c k ) {

2 B u f f e r e d I m a g e im =

3 new B u f f e r e d I m a g e (track.getHeight(),track.getWidth(),

4 B u f f e r e d I m a g e . TYPE_4BYTE_ABGR ) ;

5

6 f o r(i n t i =0; i <t r a c k . g e t H e i g h t ( ) ; i ++)

7 f o r(i n t j =0; j <t r a c k . g e t W i d t h ( ) ; j ++)

8 im . setRGB (i, j, t e r r a i n T o R G B ( t r a c k . g e t T e r r a i n (i, j) ) ) ;

9

10 r e t u r n im ;

11 }

◦ Alternative

possible :

(i,j)

je change le pixel

(j,i), image horizontale

- Pour nous, c’est la matrice qui compte toujours (vous faîtes ce que vous voulez avec l’image)

- Attention aux dimensions de l’image créée

(7)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Affichage inversé

1 A r r a y L i s t <Commande> coms = new A r r a y L i s t <Commande > ( ) ;

2 f o r(i n t i =0; i <50; i ++) coms . add (new Commande ( 1 , 0 ) ) ;

3 // a c c e l a f o n d

4 f o r(i n t i =0; i <50; i ++) coms . add (new Commande ( 1 , 0 . 1 ) ) ;

5 // a c c e l a f o n d + r o t a t i o n p o s i t i v e

6 f o r(i n t i =0; i <50; i ++) coms . add (new Commande ( 1 , 0 ) ) ;

7 // a c c e l a f o n d

8 f o r(i n t i =0; i <50; i ++) coms . add (new Commande ( 1 ,0 . 1 ) ) ;

9 // a c c e l a f o n d + r o t a t i o n n é g a t i v e

10 11

12 p o s i t i o n : ( 5 8 1 . 0 , 7 1 9 . 0 1 9 0 0 2 )

13 p o s i t i o n : ( 5 8 1 . 0 , 7 1 9 . 0 5 6 9 6 7 9 9 6 )

14 p o s i t i o n : ( 5 8 1 . 0 , 7 1 9 . 1 1 3 8 6 0 0 6 0 0 0 8 )

(8)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Explication

Coté modèle, je bouge de (0,1)

je change de colonne (vers la droite dans la matrice)

Coté image, je change le pixel (i,j+1)

Dans le repère image, cela signifie :

- Abscisse x=i inchangée

- Ordonnée y=j+1⇒plus bas

Sur les commandes passées :

- Rotation vers la gauche (trigo), sur un exemple :

- Un vecteur (0,1) devient (-EPS, 1-EPS) Application directe de la matrice de rotation

- Sur l’image BAS⇒BAS légèrement à droite

(9)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Retour sur la séance 2

VoitureImpl, VoitureFactory

- Où sont les attributs vmax, alpha, beta ? Qui caractérisent la voiture. Sont-ils static ?

- Où sont les valeurs numériques associées ? - Comment initialiser la Position de la voiture ?

- Représentation mémoire pour Voiture/Circuit/Factory - A quoi sert la méthode getMaxTurn(), que retourne-t-elle ? - A quoi correspondent les chiffresvmax etbraquage, quels

sont leur signification géométriques ?

Circuit/CircuitFactory

- Où mettre les directions de départ/arrivée par défaut ?

Color/int, comment ça marche ?

- Pour colorier le pixel(i,j)de imen rouge : - 1)Color c = Color.red;2)im.setRGB(i, j,

c.getRGB())

- Attention,setRGBattend(int,int,int): cast + color : getRGB()

(10)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Retour sur la séance 2

VoitureImpl, VoitureFactory

- Où sont les attributs vmax, alpha, beta ? Qui caractérisent la voiture. Sont-ils static ?

- Où sont les valeurs numériques associées ?

- Comment initialiser la Position de la voiture ?

- Représentation mémoire pour Voiture/Circuit/Factory - A quoi sert la méthode getMaxTurn(), que retourne-t-elle ? - A quoi correspondent les chiffresvmax etbraquage, quels

sont leur signification géométriques ?

Circuit/CircuitFactory

- Où mettre les directions de départ/arrivée par défaut ?

Color/int, comment ça marche ?

- Pour colorier le pixel(i,j)de imen rouge : - 1)Color c = Color.red;2)im.setRGB(i, j,

c.getRGB())

- Attention,setRGBattend(int,int,int): cast + color : getRGB()

(11)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Retour sur la séance 2

VoitureImpl, VoitureFactory

- Où sont les attributs vmax, alpha, beta ? Qui caractérisent la voiture. Sont-ils static ?

- Où sont les valeurs numériques associées ? - Comment initialiser la Position de la voiture ?

- Représentation mémoire pour Voiture/Circuit/Factory - A quoi sert la méthode getMaxTurn(), que retourne-t-elle ? - A quoi correspondent les chiffresvmax etbraquage, quels

sont leur signification géométriques ?

Circuit/CircuitFactory

- Où mettre les directions de départ/arrivée par défaut ?

Color/int, comment ça marche ?

- Pour colorier le pixel(i,j)de imen rouge : - 1)Color c = Color.red;2)im.setRGB(i, j,

c.getRGB())

- Attention,setRGBattend(int,int,int): cast + color : getRGB()

(12)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Retour sur la séance 2

VoitureImpl, VoitureFactory

- Où sont les attributs vmax, alpha, beta ? Qui caractérisent la voiture. Sont-ils static ?

- Où sont les valeurs numériques associées ? - Comment initialiser la Position de la voiture ?

- Représentation mémoire pour Voiture/Circuit/Factory

- A quoi sert la méthode getMaxTurn(), que retourne-t-elle ? - A quoi correspondent les chiffresvmax etbraquage, quels

sont leur signification géométriques ?

Circuit/CircuitFactory

- Où mettre les directions de départ/arrivée par défaut ?

Color/int, comment ça marche ?

- Pour colorier le pixel(i,j)de imen rouge : - 1)Color c = Color.red;2)im.setRGB(i, j,

c.getRGB())

- Attention,setRGBattend(int,int,int): cast + color : getRGB()

(13)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Retour sur la séance 2

VoitureImpl, VoitureFactory

- Où sont les attributs vmax, alpha, beta ? Qui caractérisent la voiture. Sont-ils static ?

- Où sont les valeurs numériques associées ? - Comment initialiser la Position de la voiture ?

- Représentation mémoire pour Voiture/Circuit/Factory - A quoi sert la méthode getMaxTurn(), que retourne-t-elle ?

- A quoi correspondent les chiffresvmax etbraquage, quels sont leur signification géométriques ?

Circuit/CircuitFactory

- Où mettre les directions de départ/arrivée par défaut ?

Color/int, comment ça marche ?

- Pour colorier le pixel(i,j)de imen rouge : - 1)Color c = Color.red;2)im.setRGB(i, j,

c.getRGB())

- Attention,setRGBattend(int,int,int): cast + color : getRGB()

(14)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Retour sur la séance 2

VoitureImpl, VoitureFactory

- Où sont les attributs vmax, alpha, beta ? Qui caractérisent la voiture. Sont-ils static ?

- Où sont les valeurs numériques associées ? - Comment initialiser la Position de la voiture ?

- Représentation mémoire pour Voiture/Circuit/Factory - A quoi sert la méthode getMaxTurn(), que retourne-t-elle ? - A quoi correspondent les chiffresvmax etbraquage, quels

sont leur signification géométriques ?

Circuit/CircuitFactory

- Où mettre les directions de départ/arrivée par défaut ?

Color/int, comment ça marche ?

- Pour colorier le pixel(i,j)de imen rouge : - 1)Color c = Color.red;2)im.setRGB(i, j,

c.getRGB())

- Attention,setRGBattend(int,int,int): cast + color : getRGB()

(15)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Retour sur la séance 2

VoitureImpl, VoitureFactory

- Où sont les attributs vmax, alpha, beta ? Qui caractérisent la voiture. Sont-ils static ?

- Où sont les valeurs numériques associées ? - Comment initialiser la Position de la voiture ?

- Représentation mémoire pour Voiture/Circuit/Factory - A quoi sert la méthode getMaxTurn(), que retourne-t-elle ? - A quoi correspondent les chiffresvmax etbraquage, quels

sont leur signification géométriques ?

Circuit/CircuitFactory

- Où mettre les directions de départ/arrivée par défaut ?

Color/int, comment ça marche ?

- Pour colorier le pixel(i,j)de imen rouge : - 1)Color c = Color.red;2)im.setRGB(i, j,

c.getRGB())

- Attention,setRGBattend(int,int,int): cast + color : getRGB()

(16)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Retour sur la séance 2

VoitureImpl, VoitureFactory

- Où sont les attributs vmax, alpha, beta ? Qui caractérisent la voiture. Sont-ils static ?

- Où sont les valeurs numériques associées ? - Comment initialiser la Position de la voiture ?

- Représentation mémoire pour Voiture/Circuit/Factory - A quoi sert la méthode getMaxTurn(), que retourne-t-elle ? - A quoi correspondent les chiffresvmax etbraquage, quels

sont leur signification géométriques ?

Circuit/CircuitFactory

- Où mettre les directions de départ/arrivée par défaut ?

Color/int, comment ça marche ?

- Pour colorier le pixel(i,j)de imen rouge : - 1)Color c = Color.red;2)im.setRGB(i, j,

c.getRGB())

- Attention,setRGBattend(int,int,int): cast + color : getRGB()

(17)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Retour sur la séance 2

VoitureImpl, VoitureFactory

- Où sont les attributs vmax, alpha, beta ? Qui caractérisent la voiture. Sont-ils static ?

- Où sont les valeurs numériques associées ? - Comment initialiser la Position de la voiture ?

- Représentation mémoire pour Voiture/Circuit/Factory - A quoi sert la méthode getMaxTurn(), que retourne-t-elle ? - A quoi correspondent les chiffresvmax etbraquage, quels

sont leur signification géométriques ?

Circuit/CircuitFactory

- Où mettre les directions de départ/arrivée par défaut ?

Color/int, comment ça marche ?

- Pour colorier le pixel(i,j)de imen rouge :

- 1)Color c = Color.red;2)im.setRGB(i, j, c.getRGB())

- Attention,setRGBattend(int,int,int): cast + color : getRGB()

(18)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Retour sur la séance 2

VoitureImpl, VoitureFactory

- Où sont les attributs vmax, alpha, beta ? Qui caractérisent la voiture. Sont-ils static ?

- Où sont les valeurs numériques associées ? - Comment initialiser la Position de la voiture ?

- Représentation mémoire pour Voiture/Circuit/Factory - A quoi sert la méthode getMaxTurn(), que retourne-t-elle ? - A quoi correspondent les chiffresvmax etbraquage, quels

sont leur signification géométriques ?

Circuit/CircuitFactory

- Où mettre les directions de départ/arrivée par défaut ?

Color/int, comment ça marche ?

- Pour colorier le pixel(i,j)de imen rouge : - 1)Color c = Color.red;2)im.setRGB(i, j,

c.getRGB())

- Attention,setRGBattend(int,int,int): cast + color : getRGB()

(19)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Retour sur la séance 2

VoitureImpl, VoitureFactory

- Où sont les attributs vmax, alpha, beta ? Qui caractérisent la voiture. Sont-ils static ?

- Où sont les valeurs numériques associées ? - Comment initialiser la Position de la voiture ?

- Représentation mémoire pour Voiture/Circuit/Factory - A quoi sert la méthode getMaxTurn(), que retourne-t-elle ? - A quoi correspondent les chiffresvmax etbraquage, quels

sont leur signification géométriques ?

Circuit/CircuitFactory

- Où mettre les directions de départ/arrivée par défaut ?

Color/int, comment ça marche ?

- Pour colorier le pixel(i,j)de imen rouge : - 1)Color c = Color.red;2)im.setRGB(i, j,

c.getRGB())

- Attention,setRGBattend(int,int,int): cast + color : getRGB()

(20)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Corrections automatiques Eclipse

Lorsque anomalie (Exception) est détectée

- Fichier absent

- Commande impossible - ...

A vous de définir le comportement adéquat

- Affichage erreur + retour null (éventuellement)

· Pas très propre...

- Délégation au niveau supérieur

· Plutot une bonne idée

Remplacement de la valeur manquante par une valeur par défaut

- Intéressant mais dangereux (bug incompréhensible souvent créé)

(21)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Eclipse

Import

- Vérifier toujours (même rapidement) la solution proposée - S’il y aplusieurs possibilitésd’import (plusieurs classes

homonymes) : l’ordre des propositions n’est pas intelligent

Proposition de cast, proposition de création de variable

- Fiable à 80/90

Utiliser les

générateurs de code

automatique

- Bonne chose : cela évite les petites fautes bêtes qui sont dures à débugger

Connaitre la touche F3 de eclipse (démo) + F4

Raccourci sysout

(22)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Radar : Fonctionnement

Principe

Le radar permet de se diriger à la manière d’un sous-marin, en envoyant des échos dans différentes directions.

P

Ensemble des faisceaux

(23)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Radar : un peu plus de détails

Partir de la voiture

Dans la direction

D

Avancer d’un pas EPS

Recommencer tant qu’il n’y a pas d’obstacle

Renvoyer le nombre de pas effectués

Appliquer une rotation sur

D

et

recommencer

P

Ensemble des faisceaux 8 pas jusqu'à l'herbe

(24)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Radar : Cahier des charges

Interface de définition d’un radar

- Obtenir les scores de chaque branche

NB : score le plus grand = le meilleur

- Connaître la distance associée à chaque branche - Obtenir la meilleure branche

- Récupérer les angles associés à chaque branche

1 p u b l i c i n t e r f a c e R a d a r {

2 p u b l i c d o u b l e[ ] s c o r e s ( ) ; // s c o r e de c h a q u e b r a n c h e

3 p u b l i c d o u b l e[ ] d i s t a n c e s I n P i x e l s ( ) ; // p o u r l ’ o b s e r v e r

4 p u b l i c i n t g e t B e s t I n d e x ( ) ; // m e i l l e u r i n d i c e

5 p u b l i c d o u b l e[ ] t h e t a s ( ) ; // a n g l e s de c h a q u e f a i s c e a u

6 }

(25)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Radar : conseils d’implémentation

Donner au constructeur :

- le faisceau d’angles - la voiture

- le circuit

Commencer à implémenter la méthode :

public double[] scores() qui délègue la partie de calcul d’un faisceau à :

private double calcScore(double angle)

(26)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Radar : algorithme de base

Data: Voiture v, Circuit c, EPSILON

Result: cpt (score, plus c’est grand, plus c’est intéressant) begin

P ←−v.position;

D←−v.direction;

cpt←−

0 ;

whileCicuirt.getTerrain(P) != Herbe && P dans le circuit do

cpt++;

P ←−P +D∗EPSILON end

end

Ensemble des faisceaux 8 pas jusqu'à l'herbe

(27)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Radar : Piège d’implémentation

Attention aux copies de surfaces ! ! !

Suivant les implémentations précédentes, on retourne parfois directement la position/direction de la voiture... Gare aux modifications !

Même phénomène avec le point de départ du circuit dans la

voiture

(28)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Radar : piège géométrique

Il ne faut pas prendre EPSILON trop petit : temps de calcul...

Il ne faut pas prendre EPSILON trop grand :

P

8 pas jusqu'à l'herbe

Ensemble des faisceaux

(29)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Radar : piège géométrique

Erreur classique :

1 d o u b l e d = r a d a r . t h e t a ( ) [ 3 ] ;

2 Commande c = new Commande ( a c c , d ) ;

Attention :

la commande n’accepte pas un angle mais un pourcentage de braquage :

Pour tourner d’un angle alpha quelle commande fournir ?

Comment faire si la commande est <-1 ou >1 ?

Règle d’or :

toujours BIEN comprendre ce que vous êtes en train

de faire

(30)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Explications détaillées sur les fonctions

1 p u b l i c i n t e r f a c e R a d a r {

2 // s c o r e de c h a q u e b r a n c h e

3 p u b l i c d o u b l e[ ] s c o r e s ( ) ;

4 // p o u r l ’ o b s e r v e r

5 p u b l i c d o u b l e[ ] d i s t a n c e s I n P i x e l s ( ) ;

6 // m e i l l e u r i n d i c e

7 p u b l i c i n t g e t B e s t I n d e x ( ) ;

8 // a n g l e s de c h a q u e f a i s c e a u

9 p u b l i c d o u b l e[ ] t h e t a s ( ) ;

10 }

1 2 3

4 5

(31)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Explications détaillées sur les fonctions (2) Sur cet exemple :

dans le main :

theta= [π3 π6,

0,

π6, −π3]

Appel à scores,

récupération d’un tableau :

s =

[102,

403, 612, 196, 198]

Appel à getBestIndex : retourne 2

Avec

=

0.1 : distancesInPixels

d =

[10.2,

40.3, 61.2, 19.6, 19.8]

Il s’agit d’une fonction dédiée à l’affichage

1 2 3

4 5

(32)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Proposition d’implémentation

◦ public double[] scores() - Boucle for sur les angles du radar

- Appel à une fonction privée pour le calcul de chaque faisceau (i)

- Stockage de la distance en pixels dansdistPix[i]

- Stockage de l’indice du meilleur faisceau dans un attribut bestIndex

◦ public double[] distancesInPixels() - RetournedistPix[i]

◦ public int getBestIndex() - RetournebestIndex

◦ public double[] thetas() - Retourne l’attributangles

(33)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Radar : Stratégie

Un radar n’est

pas une stratégie...

Il faut (par exemple) un

système expert :

Si le faisceau le plus long est ... alors la commande est ...

Si ...

...

NB : la meilleure solution n’est pas la même pour tous les circuits.

(34)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Radar : Stratégie & architecture

Paramétrage

Les paramètres doivent être fixés par le Main de manière générale...

Et pour le radar en particulier ! Rôle du main :

1

Définition des paramètres

2

Définition Voiture, Circuit...

3

Création du radar (à partir du faisceau, Voiture, Circuit)

4

Création de la stratégie (à partir du radar)

(35)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Serialization des Strategy

Une stratégie spécialisée par course...

Beaucoup de tests à faire !

Penser à un système de sauvegarde

Serialization

Si vos stratégies sont Serializable... Vos radars doivent l’être aussi !

Ca commence à devenir intéressant pour garder la trace des

meilleures courses...

(36)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Radar : limites

Le radar, ça marche bien, mais pas tout le temps...

(37)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Simulateur de référence

Vous pouvez maintenant jouer des courses... Commençons à comparer les performances !

Téléchargeable sur le site, lien compétition

Usage : le simulateur s’utilise avec 2 arguments (minimum)

1 j a v a −j a r s i m u l a t e u r . j a r −t t r a c k . t r k −c l i s t e _ c o m m a n d e s . com

2 [−d 1 −oimg o u t p u t _ i m a g e . png −o l o g o u t p u t . l o g ]

3 −t : nom du f i c h i e r t r a c k

4 −c : nom du f i c h i e r commande

5 −oimg : nom du f i c h i e r s a u v e g a r d e i m a g e ( non o b l i g a t o i r e )

6 −o l o g : nom du f i c h i e r l o g ( non o b l i g a t o i r e )

- le fichier circuit

- le fichier de commandes

- Le fichier de commandes doitêtre normalisé

(38)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Sorties optionnelles

1

Le fichier log

1 P o s i t i o n D i r e c t i o n V i t e s s e

2

3 ( 5 8 1 . 0 , 7 1 9 . 0 0 4 8 0 0 1 ) ( 0 . 0 , 1 . 0 ) 0 . 0 0 4 8 0 0 1

4 ( 5 8 1 . 0 , 7 1 9 . 0 1 4 3 9 7 8 9 9 9 5 ) ( 0 . 0 , 1 . 0 ) 0 . 0 0 9 5 9 7 7 9 9 9 5

5 ( 5 8 1 . 0 , 7 1 9 . 0 2 8 7 9 1 0 0 1 0 0 0 1 ) ( 0 . 0 , 1 . 0 ) 0 . 0 1 4 3 9 3 1 0 1 0 5 0 0 2 5

6 ( 5 8 1 . 0 , 7 1 9 . 0 4 7 9 7 7 0 0 5 4 9 9 5 ) ( 0 . 0 , 1 . 0 ) 0 . 0 1 9 1 8 6 0 0 4 4 9 9 4 9 9 9 8 6

7 . . .

2

Le fichier image

(39)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Fichier de commandes normalisé

Code pour générer un fichier standard compatible :

1 p u b l i c s t a t i c v o i d s a v e L i s t e C o m m a n d e ( A r r a y L i s t <Commande> l i s t e ,

2 S t r i n g f i l e n a m e ) {

3 t r y {

4 D a t a O u t p u t S t r e a m o s =

5 new D a t a O u t p u t S t r e a m (new F i l e O u t p u t S t r e a m ( f i l e n a m e ) ) ;

6 f o r( Commande c : l i s t e ) {

7 o s . w r i t e D o u b l e ( c . g e t A c c ( ) ) ;

8 o s . w r i t e D o u b l e ( c . g e t T u r n ( ) ) ;

9 }

10 o s . c l o s e ( ) ;

11 } c a t c h ( I O E x c e p t i o n e ) {

12 e . p r i n t S t a c k T r a c e ( ) ;

13 }

14 }

(40)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Simulateur en ligne

Une fois que tout est au point, vous pouvez passer au simulateur en ligne :

Login = votre prénom, Password = numéro étudiant

(41)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Simulateur en ligne (2)

NB : il faut avoir un score sur le circuit 1 pour débloquer l’affichage de votre ligne

Seul le meilleur score est conservé pour chaque personne et chaque

circuit

(42)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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...)

(43)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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

(44)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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

(45)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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

(46)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Dijkstra : exemple

(47)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Dijkstra : exemple

(48)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Dijkstra : exemple

(49)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Dijkstra : exemple

(50)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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

(51)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Dijkstra : adaptation au projet

Propagation de l’information de distance à partir de la cible :

- Liste des points à traiter Q : uniquement la route (et on connait la distance à l’arrivée des points d’arrivée) - 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.

(52)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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

(53)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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 dans

Q

sauf

s

(54)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Adaptation détaillée (3)

2

...

1 2

3 Pour tous les voisins des: Vi∈Vois(s)

· Mettre à jourVi

Identification des voisins

(55)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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

(56)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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)

(57)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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 (≈√

2 * 10)

Supprimer le point violet de

Q

Itérer le processus

(58)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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 de

Q

- 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

(59)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

Améliorations (2)

Utilisation des fonctions avancées sur les listes :

Dans la classe Collections il 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 ArrayList extends Collection

Mais qu’est ce qu’un Comparator ?

(60)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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 ) ;

(61)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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 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 qui implé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.

(62)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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 ?

(63)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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

(64)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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

(65)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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

(66)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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 ) ;

(67)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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 :

(68)

Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes

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 BlockingQueue

En JAVA, une implémentation standard est disponible : la

BlockingQueue. 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.

Références

Documents relatifs

I. a) Les signaux sont en phase. Si on écarte le micro, le signal temporel capté se trouve retardé par rapport à la référence. Donc la petite sinusoïde se décalle vers la droite.

Même si 13 bibliothécaires interrogés considèrent que le nombre de revues québécoises a augmenté depuis leur abonnement à RADAR et que le répertoire a constitué un

good sou rce of info rma t io n on the ocean conditions, such M waveheight , wind directio n and etc&#34; they become the unwanted signals as far as target det ection is concern

In recent years&#34; ground wave Doppler.raaar s nave ,ga i~ed popul arlty i n remote: .se,nsi ng of ocean surface waves. T~e -theoret ic al fo~ula1:.j.on requtred to',analytp_the

L'effet Doppler est la variation de fréquence d'une onde mesurée entre l'émission et la réception, lorsque l'émetteur et le récepteur sont en mouvement relatif.. Pour déterminer

Unlike existing Kalman filter (KF) based target tracking algorithms used by nautical radar, these two proposed tracking methods both employ a kernel-based histogram model to

Le véhicule aborde à présent une côte formant un angle α=14° avec l’horizontale. Toujours en ligne droite, le conducteur souhaite maintenir la même

Two first order waves (black) interact th rough non-linear effects to produce a seco nd order wave (red dashed lines). ra da r cross section model. Ba rrick was the