Algoritmo para ajustar tableros a las longitudes disponibles, minimizando el desperdicio

Estoy escribiendo una aplicación para usar en el aserradero. Dada una cantidad de longitudes de tablas o vigas, el objetivo es calcular la cantidad de tablas necesarias y minimizar el desperdicio. Por ejemplo, uno podría tener la siguiente lista de compras para una dimensión en particular:

3x 2.9 metros
5x 1.6 metros
21x 0.9 metros

En el aserradero, uno verificaría las longitudes de tablas disponibles e ingresaría en la aplicación. Digamos que esta dimensión está disponible en longitudes de 4.8 metros.

Un enfoque simple sería intentar encajar las tablas restantes en longitudes descendentes:

2.9 + 2.9 = 5.8 por lo que no cabe en un tablero de 4.8 metros
2.9 + 1.6 = 4.5 así que está bien.

Ninguna longitud es inferior a los 0.3 metros restantes, por lo que este tablero está "lleno". Montaremos dos más de este tipo, y luego nos quedan las siguientes longitudes por encajar:

2x 1.6 metros
21x 0.9 metros

Ok, entonces este algoritmo funciona razonablemente bien. Pero, ¿y si en lugar de ajustar 2.9 + 1.6, ajustamos 2.9 + 0.9 + 0.9 = 4.7? Entonces obtendremos 0.1 metros de desperdicio por tabla, en lugar de 0.3 metros.

Un problema al enumerar todas las combinaciones posibles es que cada longitud puede aparecer más de una vez en un tablero, y la cantidad de longitudes que caben en un tablero también variará. ¿Hay algún algoritmo conocido que pueda usar para minimizar el desperdicio total de todas las placas?

Además, ¿qué pasa si hay dos o más longitudes disponibles en el aserradero? Por ejemplo, 5.4, 4.8 y 3.6 metros. Esto seguramente complicará las cosas. Se podría ejecutar el algoritmo seleccionado para cada longitud disponible y elegir la longitud con la menor cantidad de desperdicio. Pero la solución más elegante permitiría mezclar las longitudes disponibles, por lo que la respuesta óptima podría ser algo así como 1x 5.4, 3x 4.8, 6x 3.6. Pero para empezar, estaría feliz de limitar la respuesta a una longitud.

preguntado el 03 de mayo de 12 a las 14:05

Suena como el problema de corte de existencias: en.wikipedia.org/wiki/Cutting_stock_problem -

2 Respuestas

Minimizar el desperdicio es en realidad un problema de optimización para generalizado problema de suma de subconjunto, cual es NP-Complete, y por lo tanto no existe una solución conocida en tiempo polinomial para este problema,

Aunque NP-Complete, uno puede producir solución pseudo-polinomial para este problema usando programación dinámica, o reduciéndolo a mochila (peso=valor=longitud, W=tamaño del tablero), y use su solución pseudo-polinomial, que es muy similar.

Sin embargo, aquí es aún más complicado, la solución pseudo-polinomial asume números enteros, mientras que sus ejemplos muestran que este no es el caso. Puedes resolverlo usando aritmética de punto fijo para representar las longitudes (es decir, 4.8 se mostrará como 48, si está usando solo un dígito después del punto por longitud, si está usando 2 dígitos después del punto, será 480,...).

Nota: este algoritmo minimizará el desperdicio por usted, pero no garantiza una "cantidad mínima de registros" para el desperdicio minimizado.

En cualquier caso, desde que encontró cualquier solución es NP-Hard, encontrar la solución que utiliza menos registros también es NP-Hard.

contestado el 03 de mayo de 12 a las 14:05

Tengo algo de lectura que hacer, para entender su respuesta completamente. Pero por ahora, al menos puedo comentar que minimizar el desperdicio es lo suficientemente bueno ya que pagas por la longitud total comprada. Realmente no importa cuántas tablas haya, si el desperdicio total es el mismo. - Anlo

@Anlo: en este caso, el algoritmo sugerido lo garantiza, pero tenga cuidado con el comportamiento exponencial, el algoritmo puede parecer polinomial, pero es pseudopolinomio y engañoso, especialmente porque aquí está usando longitudes fraccionarias. Sin embargo, dado que el problema es NP-Hard, a menos que pueda usar algoritmos de aproximación, no tiene demasiadas opciones aquí.. - amit

Usar la aritmética de punto fijo no es ningún problema. Centímetros (480) es probablemente lo suficientemente bueno, milímetros (4800) definitivamente lo es. ¿Tiene algún sentido tratar de mantener los números pequeños (es decir, usar 480 en lugar de 4800)? - Anlo

@Anlo: ¡excelente pregunta! ¡sí! La complejidad del algoritmo es (n*W), Donde n es el número de registros y W es el tamaño del tablero. Encontrar una solución para una placa de tamaño 4800 llevará 10 veces más (y más espacio) que una placa de tamaño 480. - amit

Su problema particular es una variante de la llamada clase de problemas "Cutting Stock". Echa un vistazo a Wikipedia "Problema de material de corte" (CSP) página

Me gusta esta explicación en inglés simple de una versión más simple del problema de corte de stock. Desde OBJETIVOS:

"Problema de material de corte: cómo cortar rollos largos de material (denominados crudos) en rollos más pequeños de un tamaño prescrito (denominados finales), dada la demanda de cada uno de los finales".

Este planteamiento de « pdf por AIMMS es bueno.

Tenga en cuenta que hay una gran cantidad de variaciones del problema básico de stock de corte que los investigadores han propuesto. Estas lecciones de Programación Entera anotan una buena formulación de la Problema generalizado de material de corte (ver página 17)

Estos problemas MILP no son muy difíciles de formular porque la función objetivo y las restricciones siguen el patrón básico del CSP estándar. Existe una gran cantidad de investigación sobre técnicas para resolverlos de manera eficiente.

Si tiene acceso a un solucionador de LP/IP como CPLEX, R o Excel Solver (para problemas más pequeños), definitivamente vale la pena formular su problema y probarlo en estos solucionadores.

Espero que ayude.

Respondido el 22 de junio de 20 a las 04:06

Ram, los dos enlaces inferiores no funcionan. ¿Podrías actualizarlos por favor? - rdtsc

@rdtsc Gracias por traer esto a mi atención. He arreglado los enlaces rotos. - Ram Narasimhan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.