2011-01-24 1 views
17

Supposons que j'ai un graphe G complet non orienté avec une distance associée à chaque arête. La signification du bord (u, v) ayant la longueur l est "les points u et v ne peuvent pas être plus proches l'un de l'autre que l." Mon but est de placer les noeuds de ce graphe dans un plan afin qu'aucune de ces contraintes de distance ne soit violée et que la coque convexe des points ait la plus petite surface totale. À titre d'exemple, supposons que j'ai un tas de composants électriques que je veux mettre sur une puce, dont chacun génère une certaine quantité d'interférences électriques. Si je mets les composants trop près l'un de l'autre, ils commenceront à interférer les uns avec les autres, rendant tout le système inutile. Compte tenu des distances minimales que chaque point doit être l'un par rapport à l'autre, quelle est la manière la plus efficace sur le plan spatial de placer les composants sur une puce?Points d'emballage rapproché dans l'avion?

Je ne sais pas comment commencer à y penser. Je ne sais pas non plus comment le problème pourrait se généraliser au cas de dimension supérieure (empiler les points dans un hyperplan). Est-ce que quelqu'un sait d'un bon moyen de s'attaquer à ce problème? Je suppose qu'il sera difficile de trouver l'algorithme optimal.

+0

Vous souhaitez rechercher un dessin graphique. Les techniques dirigées par la force pourraient vous donner un bon résultat dans ce cas. – novalis

+0

@ novalis- Je suis au courant de ces techniques, mais à ma connaissance il n'y a aucune preuve que celles-ci donnent des solutions optimales (ou même quelque chose proche d'une solution optimale). Je suis à la recherche d'un algorithme qui serait dans un certain facteur prévisible d'optimal. – templatetypedef

+0

Plutôt que la zone de la coque convexe (par la réponse de Chris Hopman), vous voulez probablement minimiser quelque chose comme le produit du rapport d'aspect et le rayon du centroïde au point le plus éloigné. Je suppose que pour que ce soit significatif que votre graphique soit complètement dense - vous n'avez pas de composants qui peuvent 'empiler' dans la même position? – Novelocrat

Répondre

6

J'ai une solution optimale, mais vous ne l'aimerez pas :).

label Let nos nœuds x , x , ..., x n. Soit B = max i, j < n (dist (x i, x j)), où dist (x i, X j) est la distance minimum entre x i et x j.Pour chaque i, placer le nœud x i à la position (0, i * B). Maintenant, chaque nœud est au moins B à l'écart de tous les autres, et la coque convexe a une aire de 0.

Le point réel ici est que minimiser la surface de la coque convexe seule vous donnera une solution absurde. Une mesure éventuellement meilleure serait le diamètre de la coque convexe.

+1

C'est un très bon point. Si vous configurez le problème pour travailler avec le diamètre, avez-vous des idées? Vous semblez être un grand magicien d'algorithmes, et j'aimerais entendre vos pensées sur le problème. – templatetypedef

+0

Heh. Formidable! – RBarryYoung

3

Je ne serais pas surpris si cela s'avérait être un problème NP-difficile. Cependant, si vous êtes intéressé par un algorithme pratique qui donne des solutions décentes, je recommande de jeter un oeil à force-based graph drawing algorithms.

Voici l'idée générale (des mathématiques plus élevées apparaîtront). Il généralise à n'importe quel nombre de dimensions.

Construire une fonction f qui attribue une valeur à chaque disposition de nœud - une valeur que vous voulez minimiser. Dans votre cas, la fonction pourrait calculer la surface de la coque convexe pour une disposition donnée + une grosse pénalité pour chaque contrainte qui n'a pas été respectée. Ou il pourrait s'agir d'une fonction plus simple, qui se rapproche raisonnablement de la précédente: en bref, nous voulons que g devienne plus petit chaque fois que f devient plus petit, et vice versa. Il est bon de choisir une fonction relativement simple, car vous aurez besoin de calculer ses dérivées partielles (par rapport aux coordonnées des nœuds).

Maintenant, disons que vous avez 100 nœuds et que vous voulez les disposer en 3D. Cela signifie que vous avez 300 numéros inconnus (100 nœuds fois 3 coordonnées pour chaque nœud). Fonction f est une fonction de R à R, et idéalement, nous voulons trouver son minimum global. Plus réaliste, un minimum local suffisamment profond suffira. Il existe des algorithmes numériques bien connus pour trouver un tel minimum, par exemple: Conjugate gradient, BFGS. La bonne chose est, vous n'avez pas vraiment à les comprendre dans les détails, ces algorithmes sont mis en œuvre dans de nombreuses langues. Tout ce que vous avez à faire est de fournir une méthode de calcul f(x) et f'(x) pour tout x demandé par l'algorithme, et une mise en page initiale x₀.

+0

J'ai effectivement pensé à faire cela pendant un certain temps, mais le fait que je n'ai aucune garantie que le graphique résultant soit presque optimal m'a toujours mis hors tension. – templatetypedef

+0

Pour des raisons pratiques, vous pouvez exécuter l'algorithme autant de fois que vous le pouvez avec différentes configurations initiales (aléatoires), et le meilleur résultat devrait être satisfaisant. Bien sûr, il n'y a toujours aucune garantie que vous arriviez à un niveau optimal. C'est un problème très intéressant d'un point de vue théorique! – Bolo

2

C'est 2D bin packing problem (qui est NP dur) avec des contraintes supplémentaires. J'ai entendu recuit simulé fonctionne assez bien pour la conception de circuit/puce. Je suis actuellement looking for real-world test-data of a big bin packing problem pour Drools Planner.

+0

Le recuit simulé est en effet idéal pour de tels problèmes. Trouver où placer des points pour mailler un domaine (avec des contraintes: les triangles doivent être "gras" et leur diamètre doit être distribué comme une densité sur le domaine) semble assez similaire, et peut être résolu avec SA. –

+2

Je ne suis pas sûr que je suis ... Vous dites que c'est NP-difficile via une réduction de bin-emballage 2D? Si oui, comment le prouvez-vous? Si ce n'est pas le cas, le simple fait de dire que vous pouvez résoudre cela en utilisant l'emballage bin ne dit rien de la complexité. – templatetypedef

+0

@templatetypedef Bon point. Comme je n'ai pas toutes les contraintes, je ne peux pas prétendre que c'est «définitivement NP dur». Et même si j'ai eu toutes les contraintes, il est difficile de prouver que quelque chose est difficile à NP :) Je pense quand même que c'est très probablement NP difficile. –