• Aucun résultat trouvé

Extensions et perspectives

4. Découverte : Cas relativement proche du précédent mais subtilement différent, les attrac- attrac-teurs distants ne sont pas suffisamment puissants relativement aux assimilations partielles

2.1 Passage à l’échelle et optimisations

2.3.1 Ajout de nouveaux éléments

Pour mieux comprendre comment exploiter les propriétés de l’arbre BSP, il est préférable de commencer par expliquer sa construction. L’ajout d’un nouvel élément consiste à parcourir l’arbre pour trouver sa place. Cela se fait à la manière d’une insertion dans un arbre binaire de recherche, à la seule différence que plusieurs dimensions sont mises en jeu. Voici un algorithme d’insertion simplifié puisque l’on ajoute directement un vecteur alors qu’il s’agit en réalité de l’interaction qui lui est associée.

1 public void add(Vect v) { v est le vecteur/interaction à insérer 2 min.min(pt.src); Mise à jour du minimum

3 max.max(pt.src); Mise à jour du maximum

4 nb++; Un élément de plus

5 updateMean(v); Mise à jour des différentes moyennes 6 if (inters==null) { Ce nœud n’est pas une feuille 7 if (v.get(dim)<val) Dans quel fils ajouter le vecteur ?

8 lower.add(v);

9 else

10 upper.add(v);

11 } else { Il s’agit d’une feuille

12 inters.add(v); Ajout à la liste d’interactions 13 split(); Partage de la feuille si nécessaire

14 }

15 }

La méthode void updateMean(Vect v) n’est pas détaillée ici car non directement utilisée pour la manipulation de l’arbre. Elle peut intégrer la mise à jour de la confiance, des valeurs moyennes pour l’ensemble des interactions de cette branche, ainsi que de variables intermédiaires permettant d’accélérer les intégrations et interpolations.

La méthode void split() permettant de diviser un nœud terminal en deux branches si nécessaire est détaillée ci-dessous. La combinaison des deux fonctions et l’effet sur l’arbre de l’insertion d’un élément sont représentés sur la figure2.3.

par feuille atteint maximum d'interactions

#7

(a) Arbre avant insertion (b) après insertion de (x=3,y=1) x=0 #9 #10 #5 x=2 y=3 y=3 x=2 #5 #10 #8 #9 x=0 #9

(c) après insertion de (x=1,y=5) y=3 x=2 #5 #8 #9 x=0 #4 y=4

Figure 2.3 – (a) L’arbre de départ partitionne l’espace suivant les dimensions x et y. On remarque que des partages suivant la même dimension peuvent se suivre. (b) L’interaction (x = 3, y = 1) s’insère dans la branche rouge. Le maximum d’interaction dans la feuille sélectionnée n’est pas maximal, seule la liste des interactions et les moyennes pour cette feuille sont donc modifiées. (c) L’interaction (x = 1, y = 4) se place quant à elle dans une feuille déjà saturée (si on fixe le maximum d’interactions par feuille à 10), celle-ci doit donc être transformée en nœud. Le partage se fait suivant la dimension y, celle pour laquelle les valeurs sont les plus étendues, et autour de la valeur 4. On remarque que la distribution des interactions n’est pas homogène, mais évite des calculs plus complexes pour déterminer la médiane.

1 public void split() {

2 if (inters.size()<=NB_MAX) Est-il nécessaire de diviser la feuille ?

3 return; Non, on s’arrête là.

4 dim = getHighestDim(); Dimension où [min; max] est le plus étendu 5 val = (min.get(dim) Frontière comme valeur médiane de l’intervalle

5’ +max.get(dim))/2;

6 lower = new Node(); Création des deux fils, par défaut des feuilles 7 upper = new Node();

8 for (Vect v : inters) { Répartition des vecteurs (on triche ici sur le type) 9 if (v.get(dim)<val) Dans quel fils ajouter le vecteur ?

10 lower.add(v);

11 else

12 upper.add(v);

13 }

14 inters = null; On transforme cette feuille en nœud 15 }

On remarque que les nœuds et les feuilles sont codées par une même classe. Cette approche augmente les performances et simplifie les algorithmes, quoique particulièrement peu élégante ou orientée objet. La variable inters détermine alors si l’instance est une feuille ou un nœud quelconque, puisque seules les feuilles stockent une liste d’interactions.

NB_MAX est un paramètre arbitraire déterminant le nombre maximal d’interaction par feuille. Les performances moyennes de recherche selon ce paramètre sont représentées sur la figure 2.4, bien qu’elles dépendent de l’homogénéité de la distribution des interactions et donc de l’appli-cation considérée.

Enfin, l’algorithme est conçu pour une exécution rapide mais n’a pas un comportement souhaitable si la valeur ajoutée est très distante des autres suivant une dimension. Néanmoins,

les divisions suivantes seront fonctionnelles puisque l’algorithme utilisent les valeurs maximales et minimales réelles sur chaque dimension, non influencées par toute interaction appartenant à une autre branche2.5.

(NBMAX) 10 log 0 1 2 3 220 50 Temps d'insertion et de ) ¹s ( parcours de feuille *

Figure 2.4 – Ces boîtes à moustaches modélisent la distribution statistique des temps cumulés d’insertion dans l’arbre et de parcours des feuilles. On y retrouve deux tendances qui s’opposent. Plus NB_MAX est petit, plus l’étape de partage des feuilles est fréquente lors de l’insertion (l’astérisque sur le diagramme indique que la machine virtuelle n’a plus pu maintenir l’arbre après environ 104 insertions pour NB_MAX=1). A l’inverse, le parcours des feuilles est d’autant plus rapide que le nombre d’interactions stockées est faible, même si le nombre de feuilles à prendre en compte et plus grand. C’est pourquoi les meilleurs résultats sont obtenus pour une valeur moyenne de NB_MAX ∈ [10; 100]. Cette fourchette optimale est toutefois relative à la répartition des interactions dans l’espace et à leur densité (ici pour l’application du pendule/chariot). Elle n’est donc pas à prendre comme une valeur quantitative absolue.

Partage suivants

(d) (b)

(c)

(a)

Partage avec fils déséquilibrés avant partage

Ensemble d'interactions

Figure 2.5 – (a) On considère une feuille qui possédait déjà NB_MAX interactions. L’ajout d’une nouvelle interaction (point bleu) conduit à l’appel de la méthode split sur cet ensemble. (b) L’algorithme du choix de la dimension de coupe et de la valeur frontière à partir de la boîte englobante (rectangle en pointillés) produit une partition déséquilibrée. Néanmoins, les appels suivants n’en souffriront pas, et le déséquilibre restera momentané, permettant par la même occasion d’exclure les valeurs extrêmes perturbant les moyennes. (c) L’ajout d’une interaction en partie gauche ne produit pas de nouvelles coupes. (d) On a de nouveau un nombre excessif d’interactions suite à un ajout en partie droite, mais les dimensions de la boîte englobante diminuent au pire de façon logarithmique.