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 :
fgravity v=grav∗ pbarycenter − pv
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 :
ftotale v=fattr vfrep vfgravity 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 !