J'aimerais trouver un meilleur algorithme pour résoudre le problème suivant :
Il y a N points de départ (violet) et N points cibles (en vert) en 2D. Je veux un algorithme qui relie les points de départ aux points cibles par un segment de ligne (marron) sans qu'aucun de ces segments ne se croise (rouge) et en minimisant la longueur cumulée de tous les segments.
Mon premier effort en C++ a consisté à permuter tous les états possibles, à trouver des états sans intersection et, parmi ceux-ci, l'état dont la longueur totale du segment est la plus faible O(n !) . Mais je pense qu'il doit y avoir une meilleure façon de procéder.
Une idée ? Ou de bons mots-clés pour la recherche ?
0 votes
Peut-être une sorte de tri topologique ?
0 votes
Je ne connais pas non plus la réponse, mais je créerais n'importe quelle solution (en ignorant les conflits) et je résoudrais ensuite les conflits individuellement : lorsque deux lignes sont en conflit, il semble que le fait d'intervertir une paire de points d'extrémité résolve le conflit. Je ne sais pas comment garantir la progression, cependant.
1 votes
@DietmarKühl : Le changement de point de terminaison pourrait entraîner l'apparition d'un conflit différent.
0 votes
@OliCharlesworth : oui, je m'en rends compte. C'est la partie concernant la garantie de progrès : cela ne fonctionnera pas si les choses sont résolues.
0 votes
@
0 votes
@
0 votes
@