Algoritmo de embalaje 3D para el envío del artículo.


24

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:

  1. Existe un conjunto finito de tamaños de cajas retangulares conocidas.

  2. Hay muchos elementos arbitrarios retangulares para ser embalados dentro de cajas

  3. 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í.

  4. 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)

  5. 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.

  6. 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:

  1. Ordenar los artículos en orden de volumen decreciente (primero los más grandes) en una lista de "artículos para empacar"

  2. Para cada artículo en esta lista:

    1. 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)

    2. 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".

    3. 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.

    4. 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:

  1. Compruebe si el volumen restante de la caja se ajusta al volumen del artículo. Si no, devuelve falso.

  2. 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.

  3. 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.

  4. 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)

  5. 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.

  6. Si se probaron todas las rotaciones y no se encontró ajuste, considere la coordenada actual como espacio no disponible.

  7. 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?


44
No hay necesidad de una packingetiqueta relacionada; algorithms
suffices

Tengo curiosidad, ¿el embalaje real será realizado por robots o humanos? Si es lo último, ¿va a valer la optimización del espacio el tiempo requerido para descubrir cómo rotar cada caja para que encaje?
miedo el

Buena pregunta. El embalaje real será realizado por humanos, pero el software sugerirá el orden de embalaje y la posición de cada caja. No requerirá experiencia en el embalaje para ver el diseño proporcionado y colocar los productos dentro de la caja. Al principio, se dedicará un tiempo a acostumbrarse, pero no requerirá pensar en la mejor disposición.
Ricardo Souza

1
Creo que todo lo que dice @msw es que este tipo de problema es poco probable que sea una buena opción para una solución "perfecta", sino más bien una solución aceptable que se encuentra en un período de tiempo razonable con heurística basada en las reglas previsto. Desde un punto de vista matemático, esto a menudo significa que lo aborda con un conjunto diferente de algoritmos y herramientas, por lo que creo que solo lo está recomendando. Por ejemplo, los algoritmos genéticos, el recocido simulado y otros métodos para seguir una curva de descenso de gradiente que se aproxima al espacio de solución con respecto a su heurística podrían proporcionar beneficios aquí.
J Trana

1
Estoy publicando solo una idea aquí. En caso de que no piense que será efectivo, puede ignorarlo. Esta solución (es más como una optimización) realmente depende de cuán similar será la entrada de su algoritmo. Así que explota el hecho de que tu entrada tendrá algunas similitudes con el tiempo. Puede almacenar / almacenar en caché los resultados calculados (que tienen una complejidad de cálculo costosa), luego compararlos con su entrada y si tiene una coincidencia completa o parcial solo necesitará hacer algunos cálculos para reordenar algunos objetos de menor tamaño. Por supuesto, esto hace que surjan nuevos problemas.
JAAAY

Respuestas:


4

El embalaje del contenedor es muy difícil computacionalmente. Piense en la mitad del problema: desea empacar el producto en cajas de envío sin desperdicio en la caja. Una solución óptima para eso requeriría pasar por todos los subconjuntos posibles y todas las posibles disposiciones en 3D del producto que debe enviarse en un camión. Te daré la solución óptima para eso porque tengo un amigo que hace seis cosas imposibles antes del desayuno.

Ahora solo tiene que poner todas las cajas en el camión sin desperdicio. Mi amigo hace su segunda cosa imposible y te da la solución. Desafortunadamente, con los tamaños de cajas que seleccionó anteriormente, hay un espacio vacío en el camión que podría reducirse si hubiera elegido cajas diferentes (ya sea más grandes o más pequeñas) en la primera tarea. Si cambia el tamaño de una caja, en el mejor de los casos tendrá que volver a empacar el camión; en el peor de los casos, es posible que deba volver a embalar todas las cajas, lo cual es tan difícil como el problema con el que comenzamos. Y, como con la primera etapa, tendrías que probar todos los arreglos 3D posibles.

Encontré que el Manual de diseño de algoritmos de Skiena es útil para pensar qué clase de algoritmos se adapta a qué tipo de problemas, pero principalmente aprendí que las buenas soluciones para problemas incluso mundanos explotan en tu cara con dificultades computacionales. La mayor parte de lo que necesita encaja en la clase de problemas de embalaje y ese artículo es un buen punto de partida. Vale la pena señalar que algunos de los mejores algoritmos para esto son los productos comerciales porque esta tarea aparece en todas partes en logística (¿cuál es el menor número de vagones de tren en los que puedo meter mis productos? Y tal). Se puede ganar mucho dinero si la heurística correcta puede ahorrarle al fabricante 100 vagones de tren al mes.

Desafortunadamente, la literatura sobre la optimización de la heurística no es tan grande como la de los algoritmos. Si intentas hacerlo solo, te garantizo que estarás soñando con mover prismas rectangulares en tu segundo mes. Tuve un problema de corte de material que si tuviera que hacerlo de nuevo, probablemente trabajaría con los expertos (o su software de propiedad).

Gracias a @JTrana por la excelente expansión de mi comentario.


Gracias por tus comentarios. Como dije sobre la pregunta, ya investigué sobre este tema y encontré una combinación de algunos algoritmos para proponer el anterior. Solo me preocupa el embalaje en sí. Todos estos cuadros serán enviados a través de servicios de oficina de correos. Afortunadamente, no tendré que lidiar con la carga de camiones.
Ricardo Souza

Esa fue una buena parte de mi explicación. No puede "extraer" el algoritmo de las empresas que desean que pague por su servicio. Las dos empresas que enumeró tienen una API, pero el empaque se realiza en sus servidores y no tiene acceso al código de implementación, excepto por robo. Y es bueno que no tenga que empacar los camiones, ahora su problema es solo la mitad de difícil, por eso las empresas quieren venderle una solución y las personas están dispuestas a comprar el servicio.
msw

1
Creo que tenemos una mala comunicación aquí. Puede que no me haya expresado bien (como habrás notado, el inglés no es mi idioma materno). No estoy pidiendo robar los algoritmos. He venido aquí para aclarar el tema. Investigué un poco y lo puse en el ejemplo anterior para el análisis. Tal vez hay alguien que se encontró con los mismos problemas que me puede dar algunas mejores direcciones. Si mi solución no es aplicable, ¿qué puedo hacer para obtener mejores resultados? Esta es mi verdadera pregunta allá arriba. Espero haberme aclarado ahora.
Ricardo Souza

Tu ingles está bien; Creo que el problema es que estamos hablando de diferentes capas de la tarea. Estás pensando en la implementación y yo estoy pensando en una explosión combinatoria. Creo que resolver tu Edit 2 te ayudará a comprender mejor el problema desde mi punto de vista. ¿Puedes resolver eso como se dijo? ¿Sin desperdicio, con un número mínimo de cajas del tamaño mínimo? Ese es el problema de multioptimización que mencioné antes y que dije que es imposible de hacer: tendrá que sacrificar al menos uno de esos factores para optimizar otro.
msw

Gracias. Creo que lo tengo ahora. No intenté codificarlo. Estaba pensando en no perder tiempo codificando antes de que surja una solución más concreta o al menos una retroalimentación positiva sobre mi propuesta, ya que esto es, al principio, para una cita. Todavía estoy investigando, pero me temo que tendré que obtener una de esas API y ver si los dispositivos (recolectores de datos que ejecutan Win CE 6.0) pueden ejecutarse conectados a Internet. La primera información que recibí del cliente decía que no tendrían acceso a internet en el lugar de trabajo.
Ricardo Souza

1

Al crear nuevos algoritmos, y recientemente acabo de hacer un algoritmo de empaque por mí mismo (sé que todavía tiene algún potencial de optimización), siempre hago el enfoque más simple:

¿Cómo lo haría yo como humano y trataría de traducirlo a un algoritmo? De mi maestro de IA (robótica) Rolf Pfeifer, todavía tengo en cuenta que esa inteligencia aparente a veces se puede crear con algunas reglas muy simples, así que en lugar de la ingeniería excesiva Trato de sub-ingeniero

  1. Identifique elementos demasiado grandes (elementos que no caben en ningún cuadro)
  2. Intente encontrar la mejor caja posible (comparando el volumen total y las dimensiones del artículo)
  3. Ordene artículos de grande a pequeño y cajas (espacios) de pequeño a grande
  4. Encaja el artículo más grande en el espacio más pequeño posible
  5. Si el elemento más grande no encuentra salte sobre él e intente el siguiente hasta que no quede nada más
  6. Para los elementos restantes, busque el nuevo mejor cuadro. ...

    X. siempre piense en eventos excepcionales (artículos de gran tamaño, formas extrañas, si una caja contiene solo 1 artículo, ¿no sería mejor enviar un artículo sin caja ?, etc.) pero también puede tomar una heurística en forma de decisión árbol.

Por supuesto, hay más advertencias a medida que avanzas, solo doy estas ideas como punto de partida. A partir de ahí hay muchas formas posibles. Una alternativa sería dividir una caja en pequeños cubos (por ejemplo, 5cmx5cmx5cm) y rastrearlos como ocupados / libres, otro enfoque podría llamarse tetris 3d, etc.

Con este enfoque, no tiene que preocuparse necesariamente por la explosión combinatoria. Por otro lado, podría ocurrir una explosión combinatoria si estamos hablando de cargas de trenes de artículos, pero de nuevo: ¿Realmente cree que una compañía verificará la lista de empaque artículo por artículo? No, se acercarán a una solución de divide y vencerás: divide la complejidad mediante el uso de volúmenes estandarizados (por ejemplo, paletas o cajas de tamaño fijo). Entonces, incluso por razones prácticas, tenga en cuenta que no solo entrena, a veces el tiempo de los empleados también es dinero. un tren puede cargar x paletas, cada paleta tiene un volumen fijo, así que empaca los artículos en la paleta, pero de nuevo, tal vez una paleta consta de varios pedidos, así que usa cajas fijas para los artículos, que luego se cargan en paletas, que luego se cargan en trenes

Al menos así es como yo, como humano, trataría la tarea, obtendría la mejor caja y luego encajaría el elemento más grande uno por uno en el espacio más pequeño disponible (y agregaría un poco de vista previa).

Como en mi algoritmo, al final probablemente no tenga la mejor solución, sino una heurística muy buena que luego puede refinar aún más.

A veces es más fácil comenzar con el primer paso y resolver los problemas en el camino, por supuesto, idealmente no es una especie de paso al límite, sino un poco inteligente ... a veces puede verse obligado a explorar alternativas y elegir el mejor o implementar un "paso atrás".

Pero como aprendí de mi maestro de IA (Rolf Pfeifer, lamento molestarme con eso nuevamente): a veces puedes crear un comportamiento inteligente aparente con algunos conjuntos de reglas muy simples y pocos> comportamiento emergente en el ejemplo mencionado, programaron pequeños autos remotos para girar a la izquierda si detectan un obstáculo en el lado derecho, giran a la derecha si hay un obstáculo en el lado izquierdo y van derecho si no hay obstáculo o si el obstáculo está al frente. 3 o 4 robots como ese, colocados en un cuadrado de 3 mx 3 m con muchas pelotas de ping-pong conducen al sorprendente hecho de que los robots parecían estar limpiando, empujando las pelotas de ping-pong hacia las esquinas, a pesar de que los robots están solo programado para evitar obstáculos.

PD: La única desviación del mundo real que encontré con este enfoque es cuando estaba trabajando a tiempo parcial como escenógrafo para grandes conciertos como Metallica, Iron Maiden, Britney Spears, Paul McCartney, U nombrarlo ... Los camioneros que trabajan en el giras internacionales tienen listas de embalaje precisas artículo por artículo. Los cálculos se realizan una vez (no lo sé por humanos o máquinas), y luego se replican. A veces, cuando empacan por primera vez, incluso hacen fotos capa por capa y lo pegan dentro del camión para que los equipos locales sepan exactamente, qué caja debe cargarse cuándo y dónde. Pero esta también es una necesidad de embalaje específica, ya que para un recorrido siempre trabajan con las mismas cajas y camiones.


1

La heurística que mencionas en tu publicación parece interesante.

Sugeriría un par de modificaciones para mejorar la solución final.

Dada una solución con todos los artículos empaquetados en una caja, intente fusionar el contenido de dos cajas pequeñas en una caja más grande (esto debería ayudar a mejorar su criterio de usar la menor cantidad de cajas posible).

Alternativamente, cada vez que inicie un nuevo cuadro, en lugar de utilizar el cuadro más pequeño que pueda acomodar el elemento actual, puede elegir el cuadro más grande que pueda acomodarlo, y una vez que cada elemento se asigne a un cuadro, intente asignar todos los elementos de un caja a una caja más pequeña.

Además, en su función de ajuste, en lugar de considerar la posición de sus otras cajas como fija, puede imaginar cambiar la secuencia de carga. Esto debería permitirle encontrar mejores soluciones a expensas de un mayor tiempo de ejecución.


Eso parece mejoras interesantes. No he tocado este problema por mucho tiempo. Tal vez debería intentarlo uno de estos días. Gracias.
Ricardo Souza
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.