J'essaie de trouver un algorithme pour le problème suivant.Sélectionnez le plus d'éléments qui ne se chevauchent pas de sorte que la somme de leur taille est maximisée
Dire que j'ai un certain nombre d'objets A, B, C, ...
J'ai une liste de combinaisons valides de ces objets. Chaque combinaison est de longueur 2 ou 4.
Par exemple. AF, CE, CEGH, ADFG, ... et ainsi de suite.
Pour les combinaisons de deux objets, par ex. AF, la longueur de la combinaison est 2. Pour la combinaison de quatre objets, par exemple CEGH, la longueur de la combinaison.
Je ne peux sélectionner que des combinaisons qui ne se chevauchent pas, c'est-à-dire que je ne peux pas sélectionner AF et ADFG parce que les deux nécessitent les objets 'A' et 'F'. Je peux choisir les combinaisons AF et CEGH car elles ne nécessitent pas d'objets communs. Si ma solution ne comprend que les deux combinaisons AF et CEGH, alors mon objectif est la somme de la longueur des combinaisons, soit 2 + 4 = 6.
Étant donné une liste d'objets et leurs combinaisons valides, comment est-ce que je choisis les combinaisons les plus valides qui ne se superposent pas les unes aux autres de sorte que je maximise la somme des longueurs des combinaisons? Je ne veux pas le formuler comme une IP car je travaille avec une instance de problème avec 180 objets et 10 millions de combinaisons valides et la résolution d'une adresse IP en utilisant CPLEX est extrêmement lente. Vous cherchez un autre moyen élégant de le résoudre. Puis-je peut-être convertir cela en réseau? Et le résoudre en utilisant un algorithme max-flow? Ou un programme dynamique? Coincé sur la façon de résoudre ce problème.
"CEGH, la longueur de la combinaison." -> "CEGH, la longueur de la combinaison est de 4." ? –
Considérons le graphe non orienté sur les objets donné par [[X est adjacent à Y] si et seulement si [XY est un sous-ensemble d'au moins une combinaison valide]]. (Vous pouvez construire ce graphique avec un seul passage parmi vos combinaisons valides.) Ce graphique est-il connecté? Si ce n'est pas le cas, vous pouvez facilement diviser votre problème en sous-problèmes disjoints strictement plus petits. –
Si elle est connectée, calculer les capacités de vertex en tant que log (1 + nombre de combinaisons valides dans lesquelles l'objet se trouve) et les capacités de bord en log (1 + nombre de combinaisons valides dont le bord est un sous-ensemble) Et essayez [contractant] (https://en.wikipedia.org/wiki/Edge_contraction#Vertex_cleaving) disjoint probablement-mais-pas-nécessairement-connecté et en utilisant [généralisé max-flow] (https: //en.wikipedia. org/wiki/Max-flow_min-cut_theorem # Généralité_max-flow_min-cut_theorem). (Ces capacités peuvent être calculées avec un seul passage parmi vos combinaisons valides.) –