Problema de reparto en contenedores
En el problema de reparto en contenedores, se deben distribuir artículos de diferentes tamaños en una serie de contenedores, teniendo en cuenta que cada uno de ellos debe contener uno o varios elementos que completen al menos un tamaño mínimo determinado, de forma que se maximice el número total de contenedores utilizados.
Un ejemplo sería obtener el máximo número posible de cestas de regalo cuyo contenido supere un valor mínimo, a partir de una serie de productos de diferentes precios disponibles en distintas cantidades.
Este problema es el dual del problema de empaquetado en contenedores: en el problema del reparto en contenedores, el objetivo es maximizar su número imponiendo el volumen mínimo del conjunto de artículos que debe alojar cada uno; mientras que en el problema del empaquetado en contenedores, el objetivo es minimizar el número de contenedores necesario para alojar todos los artículos.[1]
El problema es NP-difícil, pero existen varios algoritmos de aproximación eficientes:
- Algoritmos que cubren al menos la mitad, dos tercios o tres cuartos del recuento óptimo de contenedores de forma asintótica, ejecutándose en el tiempo respectivamente.[1][2]
- Un esquema de aproximación de tiempo polinómico (PTAS) asintótico, algoritmos con comportamiento acotado en el peor de los casos, cuyo comportamiento esperado es asintóticamente óptimo para algunas distribuciones discretas, y un algoritmo de aprendizaje con comportamiento esperado asintóticamente óptimo para todas las distribuciones discretas.[3]
- Un esquema de aproximación de tiempo completamente polinómico (FPTAS) asintótico.[4]
Algoritmo bidireccional de reparto en contenedores
Csirik, Frenk, Lebbe y Zhang[2]: 16–19 presentan el siguiente algoritmo simple para la aproximación 2/3. Supóngase que el tamaño del contenedor es 1 y hay n elementos.
- Ordenar los elementos del mayor (1) al menor (n).
- Completar un contenedor con los elementos más grandes: 1, 2, ..., m, donde m es el entero más grande para el que la suma de los elementos 1, ..., m es menor que 1.
- Añadir a este contenedor los elementos más pequeños: n, n-1, ..., hasta que su valor supere 1.
Para cualquier instancia I, denótese por el número de contenedores en la solución óptima y por el número de contenedores completados con el algoritmo de reparto bidireccional. Entonces, , o equivalentemente, .
Demostración
Para la demostración, se utiliza la siguiente terminología:
- el número de contenedores completados por el algoritmo.
- los t contenedores completados por el algoritmo.
- Elementos iniciales: los t elementos que se insertan primero en cada uno de los t contenedores.
- Elementos finales: los t elementos que se insertan al final de cada uno de los t contenedores.
- Elementos intermedios: todos los elementos que no son ni iniciales ni finales.
- := el número de elementos finales que son como máximo 1/2 (equivalentemente, es el número de elementos finales mayores que 1/2).
La suma de cada contenedor es al menos 1, pero si se elimina el elemento final, la suma restante es menor que 1. Cada uno de los primeros contenedores contiene un elemento inicial, posiblemente algunos elementos intermedios y un elemento final. Cada uno de los últimos contenedores contiene solo un elemento inicial y un elemento final, ya que ambos son mayores que 1/2 y su suma ya es mayor que 1.
La demostración considera dos casos.
El caso fácil es , es decir, todos los elementos finales son menores que 1/2. Entonces, la suma de cada completado es como máximo 3/2, y la suma de los elementos restantes es como máximo 1, por lo que la suma de todos los elementos es como máximo . Por otro lado, en la solución óptima, la suma de cada contenedor es al menos 1, por lo que la suma de todos los elementos es al menos . Por lo tanto, es lo requerido.
El caso difícil es , es decir, algunos elementos finales son mayores que 1/2. Ahora se demuestra la existencia de una cota superior en presentándola como una suma donde:
- los contenedores óptimos sin elementos iniciales/finales (solo elementos intermedios).
- los contenedores óptimos con exactamente un elemento inicial/final (y algunos elementos intermedios).
- los contenedores óptimos con dos o más elementos iniciales/finales (y algunos elementos intermedios).
Primero hay que centrarse en los contenedores óptimos en y . Se establece una biyección entre los elementos en cada contenedor para algunos elementos en que son al menos evaluables.
- El elemento inicial/final de las categorías se asigna al elemento inicial de . Se debe tener en cuenta que estos son los elementos iniciales más grandes.
- Los elementos intermedios de las categorías y se asignan a los elementos intermedios de , considerando que estas categorías contienen todos los elementos intermedios.
- Por lo tanto, todos los elementos de y se asignan a todos los elementos no finales de , más todos los elementos intermedios de .
- La suma de cada categoría sin su elemento final es menor que 1. Además, el elemento inicial es mayor que 1/2, por lo que la suma de solo los elementos intermedios es menor que 1/2. Por lo tanto, la suma de todos los elementos no finales de , más todos los elementos intermedios de , es como máximo .
- La suma de cada categoría óptima es al menos 1. Por lo tanto: , lo que implica . Ahora, se pon el foco en los contenedores óptimos en y .
- El número total de elementos iniciales/finales en los contenedores y es al menos , pero su número total también es , ya que hay exactamente dos elementos iniciales/finales en cada contenedor. Por lo tanto, .
- La suma de las dos últimas desigualdades implica que , lo que a su vez conlleva que .
Estrechez
El factor 2/3 es ajustado para BDF. Considérese la siguiente instancia (donde es suficientemente pequeño):
BDF inicializa el primer contenedor con el elemento más grande y lo completa con los elementos más pequeños. En consecuencia, los elementos restantes solo pueden cubrir contenedores en tripletes, por lo que, en total, se completan contenedores. Sin embargo, en OPT se pueden completar contenedores, cada uno de los cuales contiene dos elementos medianos y dos pequeños.
Algoritmo de reparto en contenedores con elementos de tres clases
'Csirik, Frenk, Lebbe y Zhang[2]: 19–24 presentan otro algoritmo que logra una aproximación de 3/4. El algoritmo ordena los elementos de mayor a menor y los divide en tres clases:
- X: Elementos con un tamaño de al menos 1/2;
- Y: Elementos con un tamaño menor a 1/2 y al menos 1/3;
- Z: Elementos con un tamaño menor a 1/3.
El algoritmo funciona en dos fases:
Fase 1:
- Inicializar un nuevo contenedor con el elemento más grande de X o con los dos elementos más grandes de Y, el que sea mayor. Téngase en cuenta que, en ambos casos, la suma inicial de los contenedores es menor que 1.
- Completar el nuevo contenedor con elementos de Z en orden creciente de valor.
- Repetir hasta que X U Y o Z estén vacíos.
Fase 2:
- Si X U Y está vacío, completar los contenedores con elementos de Z mediante la regla simple del siguiente ajuste.
- Si Z está vacío, destinar los elementos restantes en X por pares y los restantes en Y por tripletes.
En el ejemplo anterior, que muestra la estrechez de BDF, los conjuntos son:
TCF alcanza el resultado óptimo, ya que inicializa todos los contenedores con pares de elementos de Y y los completa con pares de elementos de Z.
Para cualquier instancia I, denótese como el número de contenedores en la solución óptima y como el número de contenedores completados con el algoritmo de reparto con tres clases de artículos. Luego, .
El factor 3/4 determina la estrechez para el procedimiento TCF. Considérese el siguiente ejemplo (donde es suficientemente pequeño):
El TCF inicializa el primer contenedor con los dos elementos más grandes y lo completa con los elementos más pequeños. Entonces, los elementos restantes solo pueden cubrir contenedores en grupos de cuatro, por lo que, en total, se completan contenedores. Sin embargo, con la técnica OPT se pueden completar contenedores, cada uno con 3 elementos medianos y 3 pequeños.
Esquemas de aproximación en tiempo polinómico
'Csirik, Johnson y Kenyon[3] presenta un PTAS asintótico. Es un algoritmo que, para cada e > 0, permite completar al menos contenedores si la suma de todos los elementos es mayor que , y al menos en caso contrario. Se ejecuta en tiempo . El algoritmo resuelve una variante de programación lineal de configuración, con variables y restricciones . Este algoritmo solo es teóricamente interesante, ya que para obtener una aproximación superior a 3/4, se debe tomar , y entonces el número de variables es mayor que .
También presentan algoritmos para la versión lineal del problema. En el caso lineal, no es posible obtener un factor de aproximación asintótico para el peor caso mejor que 1/2. Sin embargo, existen algoritmos que funcionan bien en el caso promedio.
Jansen y Solis-Oba[4] presentan un algoritmo FPTAS asintótico. Es un algoritmo que, para cada e > 0, completa al menos intervalos si la suma de todos los elementos es mayor que (si la suma de los elementos es menor, entonces el óptimo es, como máximo, ). Se ejecuta en tiempo , donde es la complejidad en tiempo de ejecución del mejor algoritmo disponible para matrices invertibles (actualmente, alrededor de ). Este algoritmo mejora la aproximación 3/4 incluso cuando , y en este caso las constantes son razonables (aproximadamente ).
Rendimiento con tamaños de elementos divisibles
Un caso especial importante de reparto en contenedores es que los tamaños de los elementos formen una secuencia divisible (también llamada factorizada). Un caso especial de tamaños de elementos divisibles se da en la asignación de memoria en sistemas informáticos, donde todos los tamaños de los elementos son potencias de 2. Si los tamaños de los elementos son divisibles, algunos algoritmos heurísticos para el reparto en contenedores encuentran una solución óptima.[5]: Sec.5
Problemas relacionados
En el problema de la asignación justa de artículos, hay diferentes personas, cada una de las cuales atribuye un valor diferente a cada elemento. El objetivo es asignar a cada persona un contenedor con una serie de elementos, de modo que el valor de cada contenedor sea al menos una constante determinada, y el mayor número posible de personas reciba un contenedor. En este problema también se utilizan muchas técnicas de reparto en contenedores.
Desarrollos
- Python: el paquete prtpy contiene un código con los algoritmos de Csirik-Frenk-Labbe-Zhang.
Referencias
- ↑ a b Assmann, S. F.; Johnson, D. S; Kleitman, D. J; Leung, J. Y. -T (1 de diciembre de 1984). «On a dual version of the one-dimensional bin packing problem». Journal of Algorithms (en inglés) 5 (4): 502-525. ISSN 0196-6774. doi:10.1016/0196-6774(84)90004-X.
- ↑ a b c Csirik, János; J. B. G. Frenk and M. Labbé and S. Zhang (1 de enero de 1999). «Two simple algorithms for bin covering». Acta Cybernetica (en inglés) 14 (1): 13-25. ISSN 2676-993X.
- ↑ a b Csirik, Janos; Johnson, David S.; Kenyon, Claire (9 de enero de 2001). «Better approximation algorithms for bin covering». Proceedings of the Twelfth Annual ACM-SIAM Symposium on Discrete Algorithms. SODA '01 (Washington, D.C., USA: Society for Industrial and Applied Mathematics): 557-566. ISBN 978-0-89871-490-6.
- ↑ a b Jansen, Klaus; Solis-Oba, Roberto (2003). «An asymptotic fully polynomial time approximation scheme for bin covering». Theoretical Computer Science 306 (1-3): 543-551. MR 2000192. doi:10.1016/S0304-3975(03)00363-3.
- ↑ Coffman, E. G; Garey, M. R; Johnson, D. S (1 de diciembre de 1987). «Bin packing with divisible item sizes». Journal of Complexity 3 (4): 406-428. ISSN 0885-064X. doi:10.1016/0885-064X(87)90009-4.