Optimisation de man÷uvres d`évitement par la méthode des intervalles

Transcription

Optimisation de man÷uvres d`évitement par la méthode des intervalles
Optimisation de man÷uvres
d'évitement par la méthode des
intervalles
de
Morgan HERVE
1
TABLE DES MATIÈRES
Table des matières
1
2
L'arithmétique des intervalles
3
1.1
1.2
1.3
3
4
6
Petite introduction . . . . . . . . . . . . . . . . . . . . . . . .
Le principe mathématique . . . . . . . . . . . . . . . . . . . .
Avantages et inconvénients de l'arithmétique des intervalles .
L'optimisation de trajectoire
2.1
2.2
8
L'algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . .
Test de ces fonctions . . . . . . . . . . . . . . . . . . . . . . .
9
17
3
Organisation et conclusion
21
4
Bibliographie
21
2
1
1
1.1
L'ARITHMÉTIQUE DES INTERVALLES
L'arithmétique des intervalles
Petite introduction
La possibilité de réaliser des calculs à l'aide d'intervalles plutôt qu'avec
des nombres ottants fut soulevée pour la première fois vers le début des
années 1960. Mais cette technique de calcul reste assez peu pratiquée, probablement du fait qu'à cette époque, les moyens limités de l'informatique ne
lui permettait pas de perdre un facteur mémoire de 2 (un intervalle ayant
besoin de 2 ottants pour être déni) et d'avoir une vitesse de calcul divisée
par 4 (nous verrons dans la suite qu'un calcul tel que la multiplication entre
deux intervalles nécessite le calcul de 4 ottants, et non pas de 2).
Dans les années 1980, une norme IEEE vient spécier la façon dont il
faut travailler avec l'arithmétique des intervalles, notamment en donnant les
façons de réaliser les arrondis des bornes des intervalles avec lesquels on travaille ou résultats d'opération sur d'autres intervalles. À cette même époque,
IBM met au point un compilateur intégrant l'arithmétique des intervalles.
Il existe maintenant quelques bibliothèques permettant de travailler sur les
intervalles, par exemple Intlab sous Matlab, mais également en Pascal, en
C/C++...
Après un phase d'engouement, les méthodes utilisant les calculs par intervalles seront quelque peu délaissées. En eet, certains ont pensé qu'un
algorithme utilisant des ottants pourrait être directement transposé en un
algorithme utilisant des intervalles, an de vérier l'exhaustivité du calcul
(l'arithmétique des intervalle a l'avantage de donner des résultats garantis,
c'est-à-dire un ou des intervalles contenant toutes les solutions recherchées).
Ce n'est pas le cas, et l'exemple de ce PIR sera là pour le montrer.
3
1
1.2
L'ARITHMÉTIQUE DES INTERVALLES
Le principe mathématique
En arithmétique par intervalles, on ne manipule plus de de nombres ottants, mais des intervalles les encadrant. Par exemple, on pourait représenter
le nombre π qui ne peut être qu'approché avec les les nombres ottants par
un intervalle du type [π − ; π + ].
Les intervalles considérés sont des fermés bornés de <, qu'on peut généraliser en vecteurs intervalles inclus dans <n avec n un entier positif ou nul.
Le résultat d'un opération entre deux intervalles X et Y est le plus petit
intervalle au sens de l'inclusion qui contient tous les résultats de l'opération
donnée entre les nombres appartenant à X et les nombres appartenant à Y .
De la même façon, l'application d'une fonction f à un intervalle X renvoie
l'intervalle image de X par f . Ce qu'on peut écrire :
X •Y
= {x • y|x ∈ X, y ∈ Y }
f (X) = {f (x)|x ∈ X}
Cela nous permet de dénir les opération arithmétiques de base :
[a; b] + [c; d] = [a + c; b + d]
[a; b] + [c; d] = [a − d; b − c]
[a; b] × [c; d] = [min(a × c, a × d, b × c, b × d); max(a × c, a × d, b × c, b × d)]
[a; b]2 = [min(a2 , b2 ); max(a2 ; b2 )]
[a; b]−1 = [min(1/a; 1/b); max(1/a; 1/b)] si 0 6∈ [a; b]
[a; b]/[c; d] = [a; b] × [c; d]−1
Il apparaît facilement que ces opérations ne présentent pas toutes les
propriétés que leurs contreparties sur les ottant ont. Par exemple, si X =
[0; 2] alors nous avons :
X − X = [0; 2] − [0; 2] = [−2; 2]
Néanmoins, la valeur 0 est incluse dans cet intervalle résultat. On peut écrire
cette propriété :
X − X = {x − y|x ∈ X, y ∈ Y } ⊃ {x − x|x ∈ X} = {0}
D'autres exemple : la multiplication n'est pas l'inverse de la division et l'élévation au carré n'est pas équivalent à la multiplication d'un intervalle par
lui même :
4
1
L'ARITHMÉTIQUE DES INTERVALLES
[2; 3]/[2; 3] = [2; 3][1/3; 1/2] = [2/3; 3/2]
[−1; 1] × [−1; 1] = [−1; 1]
[−1; 1]2 = [0; 1]
On voit néanmoins que nous avons {0} ⊂ [ 23 ; 23 ]. Enn, il n'y a pas de
distributivité entre l'addition et la multiplication, ce qui sera montré par un
exemple dans la partie suivante. On peut également généraliser les fonctions
aux intervalles. Ainsi, si f est une fonction strictement croissante sur D alors
pour X = [a; b] ⊂ D on a :
f (X) = [f (a); f (b)]
Évidemment, on ne peut prendre de telles fonctions que sur des intervalles inclus dans leur domaine de dénition. Pour les cas de fonctions plus
compliquées (fonctions périodiques par exemple), il sut de se rappeler que
le résultat f (X) et tout simplement l'image de X par f pour f susament
régulière.
5
1
1.3
L'ARITHMÉTIQUE DES INTERVALLES
Avantages et inconvénients de l'arithmétique des intervalles
La principale force de l'arithmétique des intervalles est qu'elle permet de
calculer sur des ensembles. C'est cela qui a permis que cette méthode soit
utilisée dans des cas adaptés, et non pas simplement transposée depuis les
méthodes utilisant des calculs classiques sur les ottants.
Ainsi, on a vu qu'en décrivant deux grandeurs comme pouvant faire partie de deux intervalles, l'intervalle résultant d'une opération entre ces deux
premiers intervalles est l'ensemble des nombres susceptibles d'être atteint
par l'opération entre les deux nombres considérés en premier lieu. On peut
ainsi facilement montrer que certaines valeurs ne sont pas atteintes... Par
exemple, on peut vouloir savoir si un système risque de rentrer dans un domaine dangereux s'il est soumis à certaines conditions. Si l'évaluation directe
à l'aide de la méthode des intervalles, en donnant comme valeurs d'entrée
les conditions auxquelles est soumis le système, ne renvoie pas d'intervalle
contenant de valeur dangereuse, alors on sait que ce système ne courra aucun
risque sous ces conditions.
Un exemple plus parlant peut être la vérication d'un dénominateur d un
peu compliqué sur un intervalle I . Si en évaluant d sur I à l'aide de l'arithmétique des intervalles on ne trouve pas d'intervalle contenant 0, alors on
sait que sur tout l'intervalle I , on ne risque pas de diviser par 0.
L'arithmétique des intervalles a aussi l'avantage de pouvoir rendre des
résultats garantis, c'est-à-dire que l'on est capable d'avoir un ou des intervalles encadrant toutes les solutions du problème que l'on s'est posé. Il est
ainsi possible de retrouver tous les zéros d'une fonction sur unb intervalle I ,
ou tous ses minimums locaux.
Cette méthode des intervalles a quand même des inconvénients. Par
exemple, on a vu dans la partie précédente que le résultats d'un problème
dépendait de l'expression du problème. Ainsi, pour des ottants les expressions x(x + 1) et x2 + x sont équivalentes. Avec des intervalles, ces deux
expressions s'écrivent respectivement :
F (X) = X(X + [1; 1])
G(X) = X 2 + X
6
1
L'ARITHMÉTIQUE DES INTERVALLES
Et avec X = [−1; 1] on a les résultats suivants :
F ([−1; 1]) = [−1; 1] × [0; 2]
= [−2; 2]
G([−1; 1]) = [−1; 1]2 + [−1; 1]
= [0; 1] + [−1; 1]
= [−1; 2]
Il s'agit là du problème de surencadrement des résultats, qui est du à la
fois au wrapping eect et à la dépendance des données. On a déjà donné dans
la partie précédente que si X et Y sont deux intervalles et • une opération
entre les deux alors :
X • Y = {x • y|x ∈ X, y ∈ Y }
Ce qui nous donne que pour deux opérations • et ∗, et trois intervalles X ,
Y et Z on a :
X • (Y ∗ Z) = {x • (y ∗ z)|x ∈ X, y ∈ Y, z ∈ Z}
X • Y ∗ X • Z = {x • y ∗ x0 • z|x ∈ X, y ∈ Y, z ∈ Z, x0 ∈ X}
On voit que la dernière égalité ne tient en fait pas compte de l'égalité entre x
et x0 , et c'est pourquoi l'intervalle rendu dans le cas de la forme développée
sera plus large que dans le cas de la forme factorisée. Cette remarque est à
la base du théorème de Moore qui dit que si f est une fonction <n → <
dénie par une expression dans laquelle tous les xi apparaissent au plus une
fois, alors pour tout X ⊂ Ren l'évaluation par intervalles obtenue en remplançant xi par la composante correspondante de X est exactement égale
à f (X). C'est ce qui explique pourquoi les résultats précédents obtenus par
une forme factorisée sont plus petits au sens de l'inclusion.
Enn, pour expliquer le wrapping eect, il faut se rappeler que l'image
par une fonction f : <m → <n d'un pavé X de <m est de forme quelconque.
Or l'arithmétique par intervalles impose que le résultat calculé soit un pavé
à bords parallèles contenant toutes les valeurs de l'image de X par f . Donc
forcément, cet intervalle sera plus grand au sens de l'inclusion que le vrai
ensemble image.
7
2
2
L'OPTIMISATION DE TRAJECTOIRE
L'optimisation de trajectoire
Le but de ce PIR était d'utiliser l'arithmétique des intervalles appliquée
à l'algorithme du Branch and Bound pour optimiser la trajectoire lors de
man÷uvres d'évitement.
Lors d'un évitement classique, les avions doivent opérer un changement
de cap, tout en gardant leur vitesse nominale, an de pouvoir s'éviter. Mais
pour ce PIR, on s'est davantage intéressé au contrôle en vitesse des avions.
Ainsi, lors d'un évitement concernant deux avions, un des deux avions accélérera tandis que l'autre décélérera, ce qui leur permet de garder un distance
de sécurité susante.
Fig.
1 L'évitement classique
Tous le travail réalisé a été écrit en Ocaml. Les bibliothèques de fonctions
8
2
L'OPTIMISATION DE TRAJECTOIRE
permettant de travailler avec des intervalles ont été fournies par M. Alliot,
ainsi que d'autres bibliothèques dénissant des grandeurs telles que +∞ ou
−∞...
Les intervalles sont décrits par deux nombres ottants qui correspondent
à leur deux bornes. La syntaxe adoptée est que pour un intervalle X , on
aura les bornes inférieures et supérieures de ct intervalle qui seront notées
respectivement X.low et X.high. Le type avion contient la position initiale
de l'avion dans un plan (x, y), ainsi que sa vitesse initiale qui sera dénie
comme la vitesse nominale de tous les avions projetée dans la base (x, y).
Un avion est ainsi dénie par quatre grandeurs sous la forme d'intervalles.
Deux autres intervalles viennent compléter la description de la trajectoire
d'un avion : les intervalles de temps d et f . Ceux-ci correspondent respectivement à l'intervalle de temps pendant lequel l'avion commence sa man÷uvre
d'évitement, c'est-à-dire l'intervalle de temps où il change sa vitesse, et l'intervalle de temps pendant lequel l'avion retrouve sa vitesse nominale. Enn,
on dénit un pourcentage modication de vitesse maximal, ici 10 %, et la
vitesse nominale commune à tous les avions base_speed en n÷uds.
Fig.
2
Normalement, il faudra toujours que nous ayons les inégalités d.low ≤
f.low et f.high ≥ d.high.
2.1
L'algorithme
Pour pouvoir réaliser une optimisation, il nous faut avoir une fonction
pénalité, tenant compte du temps pendant lequel les avions n'auront pas leur
vitesse nominale et si il y a risque de collision entre les avions concernés. En
9
2
L'OPTIMISATION DE TRAJECTOIRE
eet, on souhaite bien sur éviter au maximum les collisions entre les avions,
mais également minimiser le temps pendant lequel les avions sont en man÷uvre.
Pour cela on commence par dénir un nombre d'avions à considérer appelé nb_aircraf t, et une durée d'expérience de 1200 secondes duration. Le
pourcentage maximal de modication de vitesse est noté max_modif , et la
distance de sécurité donnée en miles nautiques est norme.
On calcule alors un tableau appelé start_inter, contenant 3×nb_aircraf t
cases. La construction du tableau se fait de la manière suivante :
pour i allant de 0 à nb_aircraf t faire
si i mod 3 = 0 alors
start_inter(i) ← [−max_modif ; max_modif ]
sinon si i mod 3 = 1 alors
start_inter(i) ← [0.0; duration]
sinon start_inter(i) ← [0.0; duration]
n du si
n du pour
Le tableau contient donc successivement l'intervalle de modication de
vitesse et les intervalles de temps d et f correspondant aux avions considérés.
En fait, on a vu que l'on considère que tous les avions ont droit aux mêmes
modications de vitesses, le tableau a beaucoup de cases identiques.
Nous allons maintenant placer nos avions sur un arc de cercle de manière
régulière, en créant le tableau aircraf t contenant nb_aircraf t avions. Ce
tableau est réalisé de la manière suivante :
duration×base_speed
r←
2×3600
pour i allant de 0 à nb_aircraf t − 1 faire
i
heading ← π nb_avion
aircraf t(i).x_init ← rcos(heading + π)
aircraf t(i).y _init ← rsin(heading + π)
aircraf t(i).vx_init ← base_speedcos(heading)
aircraf t(i).vy _init ← base_speedsin(heading)
n du pour
10
2
L'OPTIMISATION DE TRAJECTOIRE
Les avions sont dénies pour qu'ils se heurtent au centre du demi-cercle
sur lequel ils sont placés.
Fig.
3
Il a fallu ensuite écrire une fonction permettant de calculer l'intervalle
d'arrivée d'un avion en connaissant sa situation initiale et les intervalles d et
f . Cette fonction appelée avance_I prend comme arguments :
• a l'avion considéré
• x et y les intervalles de position initiale de l'avion
• debut et n deux ottants donnant simplement le debut et la n du
mouvement considéré
• les intervalles d et f
• p et pmax des pourcentage de modication de vitesse
La fonction avance_I a comme algorithme :
si f in ≤ d.low ou debut ≥ f.high alors
p ← [0.0; 0.0]
sinon si debut ≥ d.high et f in ≤ f.low alors
p ← [−pmax; pmax]
sinon
p ← [min(0.0, −pmax); max(0.0, pmax)]
n du si
si a.vx_init(x.high − x.low) + a.vy _init(y.high − y.low) > 0 alors
x.low ← x.low + (f in − debut)a.initvx_init(1 + p.low/100)/3600
y.low ← y.low + (f in − debut)a.init_vy(1 + p.low/100)/3600
x.high ← x.high + (f in − debut)a.init_vx(1 + p.high/100)/3600
11
2
L'OPTIMISATION DE TRAJECTOIRE
y.high ← y.high + (f in − debut)a.init_vy(1 + p.high/100)/3600
else
x.low ← x.low + (f in − debut)a.init_vx(1 + p.high/100)/3600
y.low ← y.low + (f in − debut)a.init_vy(1 + p.high/100)/3600
x.high ← x.high + (f in − debut)a.init_vx(1 + p.low/100)/3600
y.high ← y.high + (f in − debut)a.init_vy(1 + p.low/100)/3600
n du si
vx ← [a.init_vx(1 + p.low/100); a.init_vx(1 + p.high/100)]
vy ← [a.init_vy(1 + p.low/100); a.init_vy(1 + p.high/100)]
retourner (x, y, vx, vy)
Le type avion ne décrit que les conditions initiales de la trajectoire de
notre avion, et la variable a ne varie donc pas au cours du temps.
Il faut maintenant écrire la fonction qui va retourner la pénalité correspondant au tableau start_inter, et qui va nous permettre d'appliquer
l'algorithme du Branch and Bound pour déterminer une solution optimale à
notre problème.
Les grandeurs suivantes vont intervenir dans la fonction :
• v le tableau start_inter pris en argument de la fonction
• debut et n avec la même signication que précédemment
• i et j les numéros dans la liste d'avion de deux avions considérés
• vr, vrx et vry respectivement vitesse relatative entre les deux avions,
et cette même vitesse projetée selon x et y
• vrscaldeb grandeur obtenue par le produit scalaire de la vitesse et de
la position
• penalv un ottant reétant la pénalité attribuée
• debx et deby position relative de deux avions en x et y
• liste une liste de temps constitué des bornes d'intervalles d et f
L'algorithme est alors le suivant :
pour i allant de 0 à nb_aircraf t − 1 faire
si v(3i + 1).low > v(3i + 2) ou v(3i + 1).high > v(3i + 2).high
sortir de l'algorithme
n du si
n du pour
penalv ← 0.0
pour i allant de 0 à nb_aircraf t − 1 faire
12
2
L'OPTIMISATION DE TRAJECTOIRE
p1 ← v(3i)
d1 ← v(3i + 1)
f 1 ← v(3i + 2)
penalv ← penalv + |p1.high|(f 1.high − d1.low)/3600
pour j allant de 0 à nb_aircraf t − 1 faire
p2 ← v(3j)
d2 ← v(3j + 1)
f 2 ← v(3j + 2)
remplir liste dans l'ordre avec duration et les bornes de d et f
debut ← 0.0
min_d ← [−∞; ∞]
x1 ← aircraf t(i).init_x
y1 ← aircraf t(i).init_y
x2 ← aircraf t(j).init_x
y2 ← aircraf t(j).init_y
pour n dans liste faire
debx ← x2 − x1
deby ← y2 − y1
(nx1, ny1, vx1, vy1) ← avance_I(aircraf t(i), x1, y1, debut, f in, d1, f 1)
(nx2, ny2, vx2, vy2) ← avance_I(aircraf t(j), x2, y2, debut, f in, d2, f 2)
vrx ← vx2 − vx1
vry ← vy2 − vy1
ax ← debx.low
bx ← debx.high
cx ← vrx.low
dx ← vrx.high
ay ← deby.low
by ← deby.high
cy ← vry.low
dy ← vry.high
vr2 ← min(cx2 , dx2 ) + min(cy 2 , dy 2 )
vrscaldeb ←
min(ax×cx, ax×dx, bx×cx, bx×dx)+min(ay ×cy, ay ×dy, by ×cy, by ×dy)
3600
t ← − vrscaldeb
vr2
si vr2 < 0.0001 ou t < 0 alors
dist2 ← debx2 + deby 2
sinon si t > f in − debut alors
f inx ← nx2 − nx1
f iny ← ny2 − ny1
dist2 ← f inx2 + f iny 2
13
2
L'OPTIMISATION DE TRAJECTOIRE
sinon
(xt1, yt1, vxt1, vyt1) ←
avance_I(aircraf t.(i), x1, y1, debut, debut + t, d1, f 1, p1)
(xt2, yt2, vxt2, vyt2) ←
avance_I(aircraf t.(i), x2, y2, debut, debut + t, d2, f 2, p2)
debxt ← xt2 − xt1
debyt ← yt2 − yt1
dist2 ← debxt2 + debyt2
n du si
si min_d.low > (sqrt(dist2)).low alors
min_d ← sqrt(dist2)
n du si
x1 ← nx1
x2 ← nx2
y1 ← ny1
y2 ← ny2
debut ← f in
n du pour f in dans la liste
si min_d.low < norme alors
penalv ← penalv + 100000.0(norme − mind.low)
n du si
n du pour
n du pour
retourner [−penalv; −penalv] ; ;
Cette fonction prendra donc un tableau similaire à start_inter en entrée.
Pour chaque avion de la liste aircraf t, la fonction enregistre ses modications maximales de vitesse en p1, de même pour ses temps d et f sous les
noms de variables d1 et f 1. On fait de même avec un avion plus loin dans
le tableau, on obtient alors les grandeurs p2, d2 et f 2. Après avoir vérié
que l'on a pas d'impossibilité sur les intervalles d1 et f 1, on met à jour la
pénalité, avec une pénalité d'autant plus grande que l'on change fortement
la vitesse de l'avion considéré pendant longtemps. On place les bornes des
intervalles d1, f 1, d2, f 2 et le temps duration dans une liste dans l'ordre
croissant. On fera ensuite avancer les avions à l'aide de la fonction avance_I
pour un temps compris entre deux valeurs successives de cette liste.
Il faut maintenant détailler le calcul de distance entre les deux avions,
an de savoir s'il y a un risque de collision ou non. La distance à l'instant t
entre les avions A et B est donné par la formule suivante :
14
2
L'OPTIMISATION DE TRAJECTOIRE
−−→
−−→
d2 = (AB + tvr)
~ 2 = AB 2 + 2tAB · vr
~ + t2 vr2
Le calcul sur les intervalles nous donne les résultats intermédiaires suivants :
AB 2 = debx2 + deby 2
= [min(debx.low2 , debx.high2 ); max(debx.low2 , debx.high2 )]
+ [min(deby.low2 , deby.high2 ); max(deby.low2 , deby.high2 )]
~ · vr
AB
~ = vrx × debx + vry × vry
= [min(vrx.low × debx.low, vrx.low × debx.high, vrx.high × debx.high, vrx.high × debx.hi
;
max(vrx.low × debx.low, vrx.low × debx.high, vrx.high × debx.high, vrx.high × debx.hig
+ [min(vry.low × deby.low, vry.low × deby.high, vry.high × deby.high, vry.high × deby.hig
;
vr
2
max(vry.low × deby.low, vry.low × deby.high, vry.high × deby.high, vry.high × deby.hig
= vrx2 + vry 2
= [min(vrx.low2 , vrx.high2 ; max(min(vrx.low2 , vrx.high2 )]
+ [min(vry.low2 , vry.high2 ; max(vry.low2 , vry.high2 )]
En injectant ces égalité dans d2 , nous nous retrouvons alors avec un
intervalle donnant toutes les valeurs que peut atteindre la distance entre les
avions élevée au carré. Pour savoir s'il y a collision, il faut savoir si la borne
inférieure de cet intervalle est susceptible de passer sous la valeur de sécurité.
Pour cela nous allons considérer cette borne comme une fonction du temps
que nous allons minimiser. Le temps que nous considérons s'écoule depuis
le temps appelée debut, et t est donc toujours positif. Or dans ce cas, la
dénition de la multiplication entre intervalles nous donne l'égalité :
[a; b] × t = [a; b] × [t; t] = [at; bt]
15
(1)
2
L'OPTIMISATION DE TRAJECTOIRE
Nous pouvons donc considérer que la borne gauche que nous allons minimiser est un polynôme en t, donc les coecients sont connus. En dérivant
cette borne de gauche, on trouve le t donnant la distance minimale grâce au
calcul qui appariat dans l'algorithme.
Nous sommes alors devant plusieurs cas. Si t < 0, on sait que les avions
s'éloignent, on va donc retourner la distance d2min comme étant debx2 +
deby 2 , c'est-à-dire la distance entre les avions à debut. Si t < f in − debut,
alors la distance minimale entre les avions est atteinte quelque part entre
debut et f in. On calcule alors la position des deux avions à ce temps t grâce
à la fonction avance_I , et on retourne la distance au carré calculée en ce
point. Si t > f in − debut, alors la formule n'est plus valable car après f in, la
vitesse d'un des deux avions est susceptible de changer. Néanmoins, on sait
que les avions sont en train de se rapprocher, et on retourne la distance au
carré calculé à la n du mouvement, c'est à dire en f in. Enn, on a considéré
que si vr2 < 0.0001, les avions avaient des vitesses parallèles, et on peut se
contenter de retourner la distance au carrée calculée en debut.
Ensuite, si la borne gauche de la racine de cette distance au carrée est
la plus petite rencontrée pour toutes les paires debut et f in de la liste, on
en prend la racine carrée et on la stocke dans min_d. Une fois toute les
opérations précédentes faites pour toutes les paires debut f in de la liste,
on connait la distance minimale entre nos deux avions entre le temps 0.0 et
duration. On met alors à jour la pénalité si la borne gauche de cette distance
minimale entre les avions est inférieure à la norme de sécurité. Tout ceci étant
fait pour toutes les paires d'avions, on a nalement une pénalité reétant à
la fois les distances entre avions et le temps que tous les avions passent sans
être à leur vitesse nominale. On peut alors espérer utiliser un algorithme
d'optimisation pour arriver à des man÷uvres les plus courtes possibles, mais
permettant tout de même aux avions de rester assez éloignés les uns des
autres.
16
2
2.2
L'OPTIMISATION DE TRAJECTOIRE
Test de ces fonctions
Vérions d'abord que notre fonction avance_I , indispensable à la suite
du programme, se comporte bien. On place un avion de manière certaine
en (0, 0), et on lui donne une vitesse seulement sur l'axe x. On lui associe
d = [500; 510] et f = [650; 670]. On teste ensuite le déplacement entre 0.0 et
d.low. Nous obtenons le message suivant :
Fig.
4 Message dans la console après le test
La fonction avance_I a donc l'air de fonctionner. Pour tester la fonction
rendant la pénalité, on se place dans la situation suivante :
17
2
Fig.
L'OPTIMISATION DE TRAJECTOIRE
5 Situation avec deux avions
Les deux avions placés de manière à se heurter au centre du demi-cercle,
donc pour t = 600. Le test consiste tout simplement à acher quelques grandeurs de départ, et vérier si la pénalité est bien mise à jour. Habituellemnt,
pour tous les avions d et f sont initialisés à [0.0; duration]. Pour tester la
fonction, je les ai initialisés pour le premier avion à [200; 250] et [750; 800] et
pour le second à [100; 230] et [900; 1000].
On voit ici, qu'en fait les deux d et les deux f étant diérents, les deux
avions passent au minimum à environ 12 miles l'un de l'autre. La pénalité
reste modérée. Le temps devient négatif à partir du moment où les avions
ont passé la zone dans laquelle ils sont les plus proches (attention, il y a un
décalage entre les t et les d_min correspondant !). Faisons le même test avec
des avions susceptible de se rentrer dedans c'est-à-dire avec les mêmes d et
f . On prend d = [200; 250] et f = [750; 800].
18
2
L'OPTIMISATION DE TRAJECTOIRE
19
2
L'OPTIMISATION DE TRAJECTOIRE
On voit ici que la borne inférieure de d_min vaut assez vite 0.0. Il y a
donc détection d'un risque de collision, et la pénalité s'en ressent en conséquence.
20
3
3
ORGANISATION ET CONCLUSION
Organisation et conclusion
J'ai choisi ce sujet de PIR après avoir entendu mon père qui est chercheur parler de l'arithmétique des intervalle, à laquelle il s'intéressait dans
le cadre de ses recherches et de son travail. Je me suis alors dit qu'il pouvait
être intéressant d'orienter mon PIR dans cette direction. M. Matignon m'a
alors mis en contact avec M. Alliot pour que je puisse commencer mon travail.
L'emploi du temps prévoyait chaque semaine des heures de PIR an que
chacun puisse avancer son projet au cours de l'année. Mais étant un élève
assez faible, et les examens se succédant, j'avais plutôt tendance à utiliser
ces heures pour travailler sur les tests à venir. Il ne s'agit évidemment pas
d'un comportement exemplaire.
J'ai donc vraiment commencé à me mettre au PIR à la n de l'année,
qui ne comporte quasiment que des heures dévolues au PIR. J'ai consacré les
premiers jours à la lecture d'un ouvrage sur le langage Objective Caml que
je ne connaissais pas du tout et à lire les programmes et les bibliothèques
fournies par M. Alliot. J'ai pendant ces quelques jours commencé à écrire
quelques petites fonctions qui nalement ne serviront à rien, puisque M. Durand m'a fourni un code d'exemple que je devais faire fonctionner avec la
méthode des intervalles.
Ces retards ne m'ont donc pas permis d'avancer autant que je l'aurais
voulu dans ce PIR mais m'a tout de même permis de découvrir l'arithmétique
des intervalles et le langage OCaml, et de m'attaquer à un problème inédit,
bien que je n'ai pas eu l'occasion d'avancer assez loin et de l'explorer à fond.
Je remercie MM. Alliot et Durand pour l'aide qu'ils m'ont apporté pour
avancer.
21
4
4
BIBLIOGRAPHIE
Bibliographie
L'optimisation de man÷uvre d'évitement en utilisant la méthode des
intervalles étant un problème encore jamais abordé, je n'ai cherché énormément de documentation. Je me suis néanmoins renseigné sur l'arithmétique
des intervalles et évidemment j'ai du apprendre à coder en Caml.
Chailloux Emmanuel,Manoury Pascal, Pagano Bruno, Objective Caml,
Edition O'REILLY, Paris, 2000
Revol Nathalie, "Introduction à l'arithmétique par intervalles", INRIA, 2004
Jaulin Luc, "Interval Contractors and their Applications", 2004
22

Documents pareils