TD de Visualisation d`Information - Algorithme par Modèle

publicité
Université Bordeaux 1
Master 2 Informatique
Année 2011 - 2012
TD de Visualisation d'Information
- Algorithme par Modèle de Forces Ojectif : Nous allons lors de ce TP mettre en place un algorithme de dessin de graphe par modèle
de forces. Celui-ci sera programmé directement dans l'interface de Tulip à l'aide de la vue « Python
Script ».
Fichiers fournis : Vous trouverez à l'adresse :
www.labri.fr/perso/bourqui/downloads/cours/Master/2011/force_directed.tar.gz
une archive contenant les fichiers nécessaires pour démarrer le TP. Celui-ci contient les transparents
sur les algorithmes de dessin par modèle de forces ainsi que le fichier python de départ.
Commencez par télécharger cette archive, puis décompressez la.
Algortihme par Modèle de Forces :
Le principe des algorithmes par modèle de force est de simuler un modèle physique masse-ressort
(cf cours de physique du lycée). Dans cette simulation, les sommets du graphe sont représentés par
des objets physiques et deux objets physiques sont reliés par un ressort si les sommets du graphe
correspondants sont reliés par une arête.
Ces algorithmes suivent le schéma général suivant :
Répéter n fois :
Pour chaque sommet v :
Calculer les forces d'attractions appliquées sur le sommet v par ces voisins
Calculer les forces de répulsions appliquées sur le sommet v par tous les autres sommets voisins
Pour chaque sommet v :
Déplacer le sommet v en fonction de ces forces
Suivant l'algorithme utilisé, le calcul des forces n'est pas le même (utilisation de différents modèles
physiques). Dans ce TP, nous utiliserons le modèle suivant :
•
Calcul de la force d'attraction exercée sur sommet v :
dist R u , v 2
f attr  v= ∑
∗ p u− p v 
length2
u∈ Neigh v
•
Calcul de la force de répulsion exercée sur sommet v :
length
f rep v = ∑
∗ p v − pu
2
u ∈V ,u≠ v dist R u , v 
Calcul de la force totale exercée sur sommet v :
f totale v =f attr v f rep v 
Question 1 :
Implémentez les fonctions :
•
1. computeAttractive(layoutResult, graph, v) qui retourne la force d'attraction exercée sur v
par ces voisins
2. computeRepulsive(layoutResult, graph, v) qui retourne la force de répulsion exercée sur
v par tous les autres sommets
3. computeForces(layoutResult, graph, v) qui retourne la force totale exercée sur v
4. displace(layoutResult, n, move) qui effectue une translation de vecteur move du sommet
v
Question 2 :
Implémentez la fonction principale et testez votre algorithme. Pour visualiser le déroulement de
votre algorithme, vous pouvez utiliser la fonction updateVisualization(True) qui met à jour les vues
sur le graphe.
Question 3 : Mise à jour asynchrone des positions des sommets
Dans l'implémentation que vous avez, les forces exercées sur chaque sommet sont calculées puis les
sommets sont déplacés de manière synchrone. Ceci conduit à des « sauts » brutaux dans le dessin,
afin d'éviter ce phénomène une solution consiste à déplacer les sommets de manière asynchrone.
Ainsi après le calcul des forces exercées sur un sommet, celui-ci est immédiatement déplacé (ce qui
permet de prendre en compte sa nouvelle position pour les prochains calculs de force).
Modifiez votre algorithme pour qu'il déplace les sommets de manière asynchrone. Quel est le
problème causé par des déplacements asynchrones ?
Question 4 : Ajout d'une force de gravité
Pour éviter que le dessin de soit trop étalé, nous pouvons ajouter au modèle de forces une force de
gravité qui attire tout sommet vers le barycentre sur dessin. La force gravité exercée sur un sommet
v est alors :
f gravity v =grav∗ pbarycenter − p v 
où grav est une constante strictement plus petite que 1 (vous pouvez utiliser la constante GRAVITY
donnée dans le fichier python). La force totale exercée sur le sommet v devient alors :
f totale v =f attr v f rep v f gravity v 
Question 5 : Limitation du déplacement
La mise à jour asynchrone de positions ne résout pas complètement le problème de saut dans le
dessin, une manière de réduire les « sauts » dans le dessin est de limiter les déplacements des
sommets. Vous pouvez pour cela utiliser les constantes MAX_ATTRACITVE et
MAX_REPULSIVE qui représente les normes maximales des forces d'attraction et de répulsion
appliquées sur chaque sommet.
Question 6 : Vers une meilleure initialisation
L'un des problème des algorithmes par modèle de force est que la qualité du résultat dépend
clairement du placement initial. Pour l'instant vous utilisez comme placement initial des positions
tirées aléatoirement(initLayout(layoutResult)). Pour améliorer ce placement initial, implémentez la
fonction intelligentInitLayout(layoutResult) qui positionne aléatoirement les sommets du graphe
puis pour chaque sommet le déplace au barycentre des positions de ces voisins.
Question 7 : Pour aller plus loin
Afin d'améliorer le dessin, le déplacement maximum de chaque sommet diminue au cours « du
temps », c'est-à-dire au cours des itérations. Implémentez la fonction displaceLimited(layoutResult,
v, move, coeff) qui pondère le déplacement move du sommet v par le coefficient coeff.
Si vous avez fini, votre modèle peut encore être amélioré, appelez moi !
Téléchargement