Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Cours 3 : Stratégie Radar
Vincent Guigue
UPMC - LIP6
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 !
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 !
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 !
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)
Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Solution basique
◦
Synchronisation
basiquedes 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
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 )
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
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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éé)
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 codeautomatique
- 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
Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Radar : Fonctionnement
PrincipeLe radar permet de se diriger à la manière d’un sous-marin, en envoyant des échos dans différentes directions.
P
Ensemble des faisceaux
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
Det
recommencer
PEnsemble des faisceaux 8 pas jusqu'à l'herbe
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 brancheNB : 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 }
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)
Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Radar : algorithme de base
Data: Voiture v, Circuit c, EPSILONResult: 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
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
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
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
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
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
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
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.
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)
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...
Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Radar : limites
Le radar, ça marche bien, mais pas tout le temps...
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é
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
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 }
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
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
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...)
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
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
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
Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Dijkstra : exemple
Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Dijkstra : exemple
Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Dijkstra : exemple
Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Dijkstra : exemple
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
Qnon 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
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.
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
QPbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Adaptation détaillée (2)
2
Tant que
Qnon vide
1 s=min(Q)noeud de score le plus faible
2 Q={Q/s}on retires deQ
Tous les points sont dans
Qsauf
sPbs 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
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
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)
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
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
Qest 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
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 ?
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 ) ;
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.
Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Cas non trivial
L’application à notre projet n’est pas simple :
◦
La liste
Qcontient 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 ?
Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Cas non trivial
L’application à notre projet n’est pas simple :
◦
La liste
Qcontient 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
Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Cas non trivial
L’application à notre projet n’est pas simple :
◦
La liste
Qcontient 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
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
Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes
Syntaxe d’usage
AttentionCode 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 ) ;
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 :
Pbs divers Radar Strategy Radar Simulateur (réf) Dijkstra Gestion listes