• Aucun résultat trouvé

Partiel LI260 2011: groupe 2

N/A
N/A
Protected

Academic year: 2022

Partager "Partiel LI260 2011: groupe 2"

Copied!
3
0
0

Texte intégral

(1)

Partiel LI260 2011: groupe 2

Téléphones portables éteints, formulaire de 8 pages autorisé

Comme
il
en
a
été
convenu
en
TD,
vous
utiliserez
comme
base
de
travail
les
fonctions
présentes
dans
votre
 projet
afin
de
simplifier
la
résolution
des
problèmes
posés.



La
lisibilité
du
code
produit
sera
prise
en
compte
dans
la
notation.



Toutes
les
questions
sont
indépendantes,
ne
restez
pas
coincés
!


1. Construction de terrain 

Au
lieu
de
charger
un
fichier,
nous
allons
générer
un
terrain.
Ce
terrain
 aura
 la
 forme
 de
 celui
 de
 la
 figure
 ci‐contre.
 Les
 questions
 suivantes
 permettent
une
génération
en
plusieurs
étapes.


Dans
 toutes
 les
 questions
 suivantes,
 on
 considère
 que
 l’utilisateur
 donne
des
valeurs
de
paramètre
raisonnable
et
on
ne
fait
pas
de
test
sur
 les
arguments.


1.1. Positionnement dans le projet 

La
classe
que
nous
allons
écrire
permet
de
créer
un
circuit.
Où
la
placer
 dans
 l’arborescence
 des
 packages
?
 Quelle
 classe
 remplace­t­elle
 (par
rapport
au
main)
?
Proposer
un
nom
de
classe
pour
ce
fichier.


1.2. Signature, attributs et constructeur 

Le
constructeur
prend
en
argument
la
hauteur
(en
X),
la
largeur
(en
Y)
 et
 la
 taille
 de
 la
 bordure.
 Les
 sens
 de
 départ
 et
 d’arrivée
 sont
 fixés
 à
 (0,1),
comme
d’habitude.


Donner
la
signature,
les
attributs
et
le
constructeur
de
la
classe.



NB
:
 il
 peut
 être
 utile
 de
 garder
 une
 ligne
 pour
 compléter
 la
 liste
 des
 attributs
 au
 cours
 des
 questions
 suivantes.


1.3. Initialisation 

La
méthode
void
init(Terrain[][]
track)
prend
en
argument
un
tableau
de
Terrain
(déjà
instancié,
pas
de
new
 ici),
l’initialise
avec
de
l’herbe
sur
les
bords
et
du
goudron
au
milieu.


Donner
le
code
de
cette
méthode.


1.4. Point de départ et ligne d’arrivée 

Le
 point
 de
 départ
 est
 tiré
 aléatoirement
 dans
 un
 carré
 dont
 les
 dimensions
 et
 le
 positionnement
 sont
 donnés
sur
la
figure.
La
ligne
d’arrivée
se
trouve
en
bas
à
droite
de
l’image,
elle
est
parallèle
à
l’axe
X,
touche
 la
bordure
et
fait
une
hauteur
de
40
pixels.


Donner
le
code
de
la
méthode
void
initDepartArrivee(Terrain[][]
track)


NB
:
dans
la
classe
Random
(constructeur
sans
argument),
la
méthode
méthode
int
nextInt(i)

retourne
un
 entier
entre
0
et
i‐1
(bornes
incluses).
La
méthode
nextDouble()
retourne
un
réel
entre
0
et
1.


Bordure X

10 40 Y

(2)

1.5. Ajout de bruit 

Afin
de
rendre
ce
circuit
plus
compliqué,
on
ajoute
de
l’herbe
aléatoirement
suivant
le
processus
suivant
:
 chaque
case
de
goudron
à
1
chance
sur
10
de
se
transformer
en
herbe.


Donner
le
code
de
la
méthode
void
ajoutBruit(Terrain[][]
track).


Avec
ce
genre
de
stratégie,
il
y
a
toujours
un
risque
de
blocage
si
on
n’a
pas
de
chance…



Proposer
une
solution
(simple)
pour
éviter
les
blocages
(en
quelques
phrases,
pas
de
code)


1.6. Méthode build() 

Enfin,
la
méthode
build()
regroupe
les
appels
aux
méthodes
précédentes.



Quel
est
le
type
de
retour
de
build()
?


Comment
 choisir
 l’accessibilité
 (public,
 protected,
 private)
 des
 méthodes
 précédentes
?
 Justifier
 rapidement
votre
choix.


Donner
le
code
de
la
méthode
build().


1.7. Sauvegarde du circuit 

Il
est
intéressant
de
sauvegarder
les
circuits
créés.



Dans
 quelle
 classe
 effectuer
 cette
 opération
 (la
 même
 ou
 une
 autre)
?
 Quelle
 solution
 technique
 utiliser
(serializable,
fichier
ASCII…)
?
Justifier
chacune
de
vos
2
réponses
précédentes.


1.8. Création de circuit à partir d’une image 

Il
est
souvent
plus
agréable
de
travailler
sous
Photoshop
ou
Gimp
pour
créer
des
images/circuits.



Quelles
seraient
les
contraintes
de
création
de
l’image
pour
que
l’importation
se
fasse
facilement
?
 Au
niveau
architecture,
quelle
classe
faudrait­il
créer
pour
importer
des
images
en
tant
que
circuit
?
 Proposer
 un
 nom
 pour
 la
 classe,
 préciser
 si
 le
 constructeur
 prend
 des
 arguments
 ou
 pas
 et
 le(s)quel(s).



Où
trouver
les
méthodes
d’importation
d’images
dans
JAVA
selon
vous
?


(3)

2. StrategieMixte 

Les
 stratégies
 basées
 sur
 l’algorithme
 Dijkstra
 sont
 globalement
 très
 efficaces.


Cependant,
parfois
un
virage
est
pris
trop
court
et
on
sort
dans
l’herbe
à la corde  (1).
D’autres
fois,
on
sort
du
virage
trop
vite
et
on
sort
du
goudron
à
l’extérieur
du
 virage
(2).


• Pour
éviter
le
cas
1,
on
propose
d’ajouter
des
points
de
passage
obligés
:
si
 la
voiture
voit
un
point,
elle
doit
aller
vers
lui.



• Pour
 éviter
 le
 cas
 2,
 on
 ajoute
 des
 points
 warning
:
 dans
 une
 zone


circulaire
de
rayon
10
pixels
autour
de
ces
points,
la
voiture
passe
en
stratégie
prudente
et
avance
 plus
lentement.


Nous
disposons
de
3
stratégies
:
StrategieDijkstra,
StrategiePrudente,
StrategieAllerVers1Point.


La
voiture
voit
un
point
de
passage
si
les
conditions
suivantes
sont
réunies:



• la
trajectoire
entre
la
voiture
et
le
point
est
réalisable
(il
n’y
a
pas
d’herbe
sur
la
trajectoire)


• le
point
se
trouve
devant
la
voiture


1.1. Point réalisable 

Dans
 la
 classe
 ToolsTerrain,
 on
 écrit
 le
 code
 de
 boolean
 estVisible(Voiture
 v,
 Vecteur
 cible,
 Circuit
 track).


L’algorithme
est
dérivé
du
radar
:



1. Construire
le
vecteur
direction
entre
la
position
de
la
voiture
et
la
cible
 2. Si
la
cible
est
derrière
la
voiture
Alors,
return
false


3. Partir
de
la
position
de
la
voiture


4. Tant
que
l’on
se
trouve
à
plus
de
1
pixel
de
la
cible
:
 a. ajouter
epsilon*direction
à
la
position
 b. Si
on
rencontre
de
l’herbe,
return
false
 5. A
la
fin
de
la
méthode,
return
true


Donner
le
code
de
la
fonction,
faites
attention
à
la
signature
de
la
méthode.


NB
:
 on
 part
 du
 principe
 que
 la
 classe
 Vecteur
 dispose
 d’une
 méthode
 distance(Vecteur
 B)
 calculant
 la
 distance
en
pixel
entre
l’instance
du
vecteur
et
le
vecteur
B.


1.2. Strategie 

Donner
la
signature
de
la
classe
StrategieMixte
 Donner
le
code
de
la
classe
entière


NB
:
les
deux
listes
de
points
(passage
et
warning)
sont
données
lors
de
la
création
des
objets
stratégies.



NB2
:
pour
simplifier
la
programmation,
tous
les
points
sont
testés
systématiquement
et
un
ancien
point
ne
 vient
jamais
poser
de
problème…
Bref,
tout
se
passe
pour
le
mieux
!


NB3
:
il
n’y
a
pas
d’interférence
entre
les
points
(tout
se
passe
encore
pour
le
mieux)


3. Pour ceux qui ont fini en avance… 

Lorsque
deux
itinéraires
sont
possibles
avec
1
optimal
au
sens
de
Dijkstra
et
1
plus
long
mais
plus
simple
 (comme
dans
le
circuit
8),
comment
faire
pour
choisir
le
plus
simple
?


Proposer
des
idées
les
illustrer
et
les
discuter.


Références

Documents relatifs

La structure de ce circuit devra être itérative (du type de celle proposée sur la Figure 1.b) de manière à pouvoir l’étendre aisément à des mots de plus de 4 bits. Le système

La commutation entre les deux modes ne doit en aucun cas modifier l’état du compteur (comptage / décomptage à partir de l’état en cours).. Pour réaliser ce système, on

Donner une formule logique qui pour un ensemble de cours E traduit le fait que tous les cours de cet ensemble apparaissent bien dans l’emploi du temps..

3142-81 du Code du travail, alinéa 1er du Code du travail, selon lequel « le droit au congé ou à une période de travail à temps partiel pour création ou reprise d'entreprise ou

La création d’entreprise et, d’une façon plus large, l’entrepreneuriat sont aujourd’hui unanimement reconnues comme étant des phénomènes vitaux pour la

Attention, pour que cette classe soit facilement utilisable dans le main, il faut qu’elle impl´ emente l’interface Circuit (pour qu’elle soit consid´ er´ ee comme un Circuit

Q 4.2 Donner les quelques lignes du main qui permettent de brancher la t´ el´ em´ etrie sur la course ` a jouer Q 4.3 Comparer les deux approches : laquelle vous semble la plus

Q 4.1 Donner le code de la classe OptimisationGradient qui, ` a partir des ´ el´ ements n´ ecessaires, d’un jeu de param` etres par d´ efaut p d et d’un pas d’exploration associ´