J'ai reçu la tâche de construire une estimation d'expédition qui suggère le meilleur hébergement de marchandises sur le moins de boîtes possible:
Il existe un ensemble fini de tailles de boîtes rétangulaires connues
Il existe de nombreux éléments arbitraires retangulaires à emballer dans des boîtes
Le moins de boîtes doit être utilisé le mieux. Parce que l'expédition de deux boîtes 1x1x1 est beaucoup plus chère qu'une boîte 1x2x1. Cela devrait être la priorité ici.
Il devrait également être optimisé pour utiliser les boîtes plus petites que possible, comme priorité de deuxième niveau. (par exemple: si vous avez le choix entre une plus grande boîte et deux petites, il devrait choisir la plus grande boîte)
Les articles peuvent être tournés pour s'adapter à la boîte, mais la rotation doit être limitée à des incréments de 45 ° au minimum (dans mes recherches, il semble que certaines configurations permettent une rotation de 45 degrés pour mieux s'adapter aux boîtes rétangulaires à l'intérieur d'une boîte rétangulaire plus grande) , la rotation à 90 ° étant la norme à prendre.
Les boîtes ont une limite de poids et les articles ont des poids arbitraires (par exemple: un article dont la taille est 1x1x1 peut être plus lourd que les autres articles 2x2x2)
J'ai fait des recherches un peu et j'ai trouvé des algorithmes abstraits sur l'emballage des bacs et le problème du sac à dos et je suis venu avec la variation quelque peu bruteforce suivante, similaire à l'algorithme le mieux adapté:
Trier les articles en ordre de volume décroissant (le plus grand en premier) sur une liste "articles à emballer"
Pour chaque article de cette liste:
Choisissez la petite boîte qui se trouve sur la liste des "boîtes utilisées" et qui a suffisamment de volume et de poids pour s'adapter à l'article (j'utiliserai l'ajustement ici pour signifier l'ajustement des dimensions et du poids)
S'il n'y a pas une telle boîte, créez une nouvelle boîte à partir de l'ensemble connu des tailles de boîte possibles qui est la plus petite taille pouvant s'adapter aux dimensions et au poids de l'article et ajoutez-la à la liste des "boîtes utilisées".
Si une boîte correspond à l'article (en utilisant la fonction d'ajustement ci-dessous), ajoutez-la à la liste des "articles de cette boîte" et supprimez-la de la liste des "articles à ajuster", en marquant sa position 3D relative à l'intérieur de la boîte.
Répétez à partir de 2.1 jusqu'à ce qu'il n'y ait aucun article à installer sur la liste des «articles à emballer».
La fonction de vérification du raccord utilisée à l'étape 2 ci-dessus:
Vérifiez si le volume restant de la boîte correspond au volume de l'article. Sinon, retournez false.
Vérifiez si la somme du poids des «articles de la boîte» plus le poids actuel de l'article est inférieure ou égale à la limite de poids de la boîte. Sinon, retournez false.
Vérifiez la liste des "éléments de la boîte" pour choisir la première coordonnée de boîte qui a le plus petit composant Y et qui a suffisamment d'espace pour la largeur, la profondeur et la hauteur de l'élément, en considérant les autres éléments placés comme espace indisponible.
Si l'élément ne tient pas à son orientation actuelle, faites-le pivoter sur l'une des 6 rotations possibles, sans supposer une rotation de 45 ° pour plus de simplicité. (Les rotations qui aboutissent à des tailles qui, lorsqu'elles étaient déjà testées, peuvent être ignorées. Par exemple: la rotation d'une boîte à 180 ° donne les mêmes dimensions que la position d'origine, car toutes les boîtes et tous les articles ont la même taille pour les faces opposées et peuvent donc être ignorés.)
Si l'élément n'a pas été pivoté de toutes les manières possibles pour revenir à son orientation d'origine, réessayez à partir de l'étape 3.
Si toutes les rotations ont été essayées et qu'aucun ajustement n'a été trouvé, considérez la coordonnée actuelle comme l'espace indisponible.
S'il n'y a pas d'espace disponible pour vérifier, retournez false. Sinon, réessayez à partir de l'étape 3.
Je veux savoir s'il peut y avoir une meilleure solution à mon problème, compte tenu des contraintes présentées.
Cela semble fonctionner sur la théorie mais je ne l'ai pas essayé sur le code. Je souhaite savoir si je vais dans la bonne direction ou s'il existe de meilleures façons de le faire.
Les références seraient formidables.
Modifier:
J'ai trouvé des API tierces intéressantes qui font ce que je veux, mais cela devra être déconnecté, donc je n'aurai pas accès à celles-ci.
Certains exemples sont:
Modifier 2:
Un exemple réel de problème à résoudre serait:
- J'ai 4 tailles de boîte LxHxP: 10x12x18, 12x16x24, 16x20x30, 24x32x40
- J'ai une commande de 4 articles, dont 1 de taille 6x8x10, 2x 22x14x30 et 1x 22x4x20
Comment puis-je placer ces articles dans n'importe quelle quantité de boîtes d'une ou plusieurs tailles en utilisant le moins de boîtes possible, en utilisant les plus petites boîtes possibles et en laissant moins d'espace libre que possible?
packing
balise liée;algorithms
suffit :)