Le problème est le suivant:
Nous avons un tableau / grille de nombres en deux dimensions, chacun représentant un «avantage» ou un «profit». Nous avons également deux entiers fixes et (pour "largeur" et "hauteur"). Et un entier fixe .h n
Nous souhaitons maintenant superposer rectangles de dimensions sur la grille de sorte que la somme totale des valeurs des cellules de ces rectangles soit maximisée.l × h
L'image suivante est un exemple d'une grille à deux dimensions avec deux de ces rectangles superposés (l'image ne montre pas la solution optimale, juste une superposition possible où et )n = 2
Les rectangles ne peuvent pas se croiser (sinon nous aurions juste besoin de trouver la position optimale pour un rectangle, puis de mettre tous les rectangles dans cette position.)
Dans l'exemple ci-dessus, la somme totale des valeurs dans les cellules serait
Est-ce similaire à un problème connu d'optimisation combinatoire? afin que je puisse commencer à lire et essayer de trouver des moyens de le résoudre.
Quelques informations supplémentaires pour les personnes intéressées:
Jusqu'à présent, les seules idées que j'ai eues sont soit un algorithme gourmand (qui trouverait le meilleur emplacement pour le premier rectangle, puis trouver la loctaion qui ne se chevauchent pas pour le deuxième rectangle, etc.) ou quelques métaheuristiques tels que les algorithmes génétiques.
En réalité, je souhaite résoudre ce problème avec une grille qui compte environ un million de cellules et des dizaines de milliers (voire des centaines de milliers) de rectangles, bien qu'il ne soit pas nécessaire de le résoudre en peu de temps (c'est-à-dire qu'il serait acceptable pour l'algorithme peut prendre des heures, voire des jours.) Je ne m'attends pas à une solution exacte mais je veux en obtenir une aussi bonne que possible compte tenu de ces contraintes.
À votre santé!
la source
Réponses:
Ma dernière formulation avait une faille fatale qui nécessiterait une quantité exponentielle de nœuds de "contrainte".
la source
Vous pouvez formuler cela comme une instance de programmation linéaire (ILP) gigantesque, puis appliquer un solveur ILP standard (lp_solve, CPLEX, etc.). Ils vous donneront la meilleure solution possible. Étant donné la taille de votre instance de problème, je ne sais pas si cela sera suffisamment efficace, mais il serait facile d'essayer.
la source