Je travaille sur un éditeur de diagrammes. Les diagrammes affichent des formes 2D ( nœuds ) connectées à des connecteurs ( bords ).
Je voudrais ajouter une opération qui, étant donné une sélection de nœuds, les "démêle" : elle les repositionne pour réduire le nombre d'arêtes croisées, si possible (et ça va si les arêtes doivent être dessinées avec des points de pliage) .
Je veux donc un algorithme de graphe qui, étant donné une incorporation de graphe ( topologique ) et un sous-ensemble de ses nœuds, modifie l'incorporation (sa topologie ) sur ces nœuds uniquement afin de minimiser le nombre d'arêtes croisées.
En lisant les graphiques des sommets et en parcourant Cabello et Mohar (2013) , je suppose que ce problème est difficile à NP. Je serai donc satisfait d'un algorithme paramétré (par exemple, sur le nombre d'arêtes croisées) qui a une complexité temporelle polynomiale connue pour une valeur de paramètre donnée. Cela semble faisable, mais je ne trouve pas facile de trouver un tel algorithme par moi-même.
Des questions:
- Où chercher un tel algorithme?
- Existe-t-il?
- Dans les logiciels existants?
- Existe-t-il une expérience pratique significative avec une telle opération? (Ce qui semble bon en théorie peut ne pas être aussi bon en pratique, ou vice versa.)
(Je ne sais pas où mieux poser cette question: ici, sur StackOverflow, ou MathOverflow?)
la source
Réponses:
Le problème posé dans la question est en fait plus difficile et plus complexe que ce qui précède. Vous envisagez des nœuds de graphique d'une certaine taille et forme tout en délimitant également la taille (zone) du résultat. De plus, une notion d'esthétique non encore déterminée est souhaitée. Évidemment, nous voulons une heuristique pour cela, qui n'utilise pas le minimum absolu dans le cas général. Le nombre de nœuds rencontrés dans une telle application n'est probablement pas énorme dans le cas moyen. Il peut être possible de dessiner la version à franchissement de bord minimal du graphique pour les petites tailles.
Ressources:
Vous pouvez être intéressé par les ressources suivantes, en particulier avec la première:
Il possède plusieurs autres fonctionnalités qui peuvent s'avérer utiles. Le code source est situé sur leur site Web sous EPL. Il comprend également une page consacrée à la théorie derrière la visualisation des graphes.
Computing Crossing Numbers in Quadratic Time
Préserver les relations de proximité et minimiser les croisements de bords dans les intégrations de graphiques
An Algorithm for the Graph Crossing Number Problem
Il existe également de nombreuses autres ressources. Ces informations devraient vous aider à démarrer.
Réflexions et observations supplémentaires:
Voici une idée pour contourner les problèmes concernant la forme et la taille des nœuds. Étant donné le graphique (nœuds infiniment petits), développez chaque nœud tout en «poussant» ou en pliant les bords (par ex. En utilisant des splines tout en imposant une limite de proximité). Vous devez le faire avec d'autres arêtes et nœuds qui gênent, ce qui peut déclencher une réaction en chaîne. Regardez comment un équilibre peut être calculé efficacement (ex. Structures moléculaires). Si vous ne pouvez pas obtenir la forme d'un nœud à la taille souhaitée, mettez l'échelle à l'échelle.
Un utilisateur peut apprécier les résultats d'un algorithme aléatoire. Ils peuvent utiliser votre fonctionnalité plusieurs fois jusqu'à ce qu'ils obtiennent quelque chose qu'ils aiment. Évitez le calcul redondant dans ce cas (pas besoin de calculer à nouveau un numéro de passage).
la source