Recibí la tarea de crear una estimación de envío que sugiera el mejor alojamiento de productos en la menor cantidad de cajas posible:
Existe un conjunto finito de tamaños de cajas retangulares conocidas.
Hay muchos elementos arbitrarios retangulares para ser embalados dentro de cajas
Cuantas menos cajas se deben usar, mejor. Porque enviar dos cajas 1x1x1 es mucho más costoso que una caja 1x2x1. Esta debería ser la prioridad aquí.
También debe optimizarse para usar los cuadros más pequeños como sea posible, como prioridad de segundo nivel. (por ejemplo: si se le presenta la opción entre una caja más grande y dos más pequeñas, debería elegir la caja más grande)
Los artículos se pueden rotar para ajustarse a la caja, pero la rotación debe limitarse a incrementos de 45 ° como mínimo (en mis investigaciones parece que algunas configuraciones permiten una rotación de 45 grados para adaptarse mejor a las cajas retangulares dentro de una caja retangular más grande) , siendo las rotaciones de 90 ° el estándar a tomar.
Las cajas tienen un límite de peso y los artículos tienen pesos arbitrarios (por ejemplo: un artículo cuyo tamaño es 1x1x1 puede ser más pesado que otro artículo 2x2x2)
Investigué un poco y encontré algunos algoritmos abstractos sobre el embalaje de la papelera y el problema de la mochila y encontré la siguiente variación de fuerza bruta, similar al algoritmo de mejor ajuste:
Ordenar los artículos en orden de volumen decreciente (primero los más grandes) en una lista de "artículos para empacar"
Para cada artículo en esta lista:
Elija el cuadro más pequeño que está en la lista de "cuadros usados" y tiene suficiente volumen restante y límite de peso para el artículo (usaré el ajuste aquí para indicar el ajuste de las dimensiones y el peso)
Si no existe dicho cuadro, cree un cuadro nuevo a partir del conjunto conocido de tamaños de cuadro posibles que sea el tamaño más pequeño que pueda ajustarse a las dimensiones y el peso del artículo y agréguelo a la lista de "cuadros usados".
Si un cuadro se ajusta al elemento (usando la función de ajuste a continuación), agréguelo a la lista de "elementos de este cuadro" y retírelo de la lista de "elementos para ajustar", marcando su posición 3d relativa dentro del cuadro.
Repita desde 2.1 hasta que no haya ningún elemento que se pueda ajustar en la lista de "elementos para empacar".
La función de verificación de ajuste utilizada en el paso 2 anterior:
Compruebe si el volumen restante de la caja se ajusta al volumen del artículo. Si no, devuelve falso.
Compruebe si la suma del peso de los "artículos de la caja" más el peso del artículo actual es menor o igual al límite de peso de la caja. Si no, devuelve falso.
Verifique la lista de "elementos del cuadro" para elegir la primera coordenada del cuadro que tenga el componente Y más pequeño y que tenga suficiente espacio para el ancho, la profundidad y la altura del elemento, considerando los otros elementos colocados como espacio no disponible.
Si el artículo no se ajusta a su orientación actual, gírelo en una de las 6 rotaciones posibles, sin suponer que la rotación sea de 45 ° por simplicidad. (Las rotaciones que dan como resultado tamaños que ya se probaron se pueden omitir. Por ejemplo: al girar una caja 180 ° se obtienen las mismas dimensiones que la posición original porque todas las cajas y elementos tienen el mismo tamaño para las caras opuestas, por lo que se pueden omitir)
Si el elemento no se ha girado en todas las formas posibles de regreso a su orientación original, intente nuevamente desde el paso 3.
Si se probaron todas las rotaciones y no se encontró ajuste, considere la coordenada actual como espacio no disponible.
Si no hay espacio disponible para verificar, devuelva falso. De lo contrario, intente nuevamente desde el paso 3.
Quiero saber si puede haber una mejor solución a mi problema, dadas las limitaciones presentadas.
Esto parece funcionar en teoría, pero no lo he probado en código. Deseo saber si voy en la dirección correcta o si hay formas mejores y eficaces de hacerlo.
Las referencias serían geniales.
Editar:
He encontrado algunas API de terceros interesantes que hacen lo que quiero, pero esto tendrá que desconectarse, por lo que no tendré acceso a ellas.
Algunos ejemplos son:
Edición 2:
Un ejemplo real del problema a resolver sería:
- Tengo 4 tamaños de caja WxHxD: 10x12x18, 12x16x24, 16x20x30, 24x32x40
- Tengo un pedido de 4 artículos, siendo 1 de tamaño 6x8x10, 2x 22x14x30 y 1x 22x4x20
¿Cómo encajo estos artículos en cualquier cantidad de cajas de uno o más tamaños usando la menor cantidad de cajas posible, usando las cajas más pequeñas posibles y dejando menos espacio libre posible?
packing
etiqueta relacionada;algorithms