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