Cambios recientes de la herramienta de embalaje de contenedores unidimensionales (al 21 de marzo de 2021)

1. Resumen de cambios

La descripción de la herramienta 1D Bin Packing escrita en el blog se basa en 2017-11-19.

Ejemplo de resultado de embalaje en contenedores

Artículos relacionados: Optimización de la distribución de tareas utilizando un algoritmo de empaque de contenedores unidimensional_1. Descripción general: habilidades de productividad (prodskill.com)

Como hay mejoras mientras se lleva a cabo el proyecto de la empresa K el 21 de marzo de 2021, se organizará por separado.

  • Cambie el tamaño del elemento de entero (largo) a real (doble) (Cambiar el prefijo del nombre de la variable)
  • El nombre de BinItem distingue entre mayúsculas y minúsculas (cambiado de Colección a Diccionario)
      – Cambio de nombre de clase (CBinItemCollection -> CBinItemDic)
  • Ordenar el resultado de la distribución por grupos pares e impares
  • Código de carga BinItem mejorado (bucle usando desplazamiento -> obtener matriz Variant del rango)
  • Si hay un duplicado en Bin Item Name, se notifica con un cuadro de mensaje de lista de duplicados y se detiene la ejecución.

La versión modificada se puede descargar desde el repositorio de github a continuación.

https://github.com/DAToolset/1D-bin-packing

2. Detalles de los cambios

2.1 Cambiar el tamaño del elemento de entero (largo) a real (doble) (Cambiar el prefijo del nombre de la variable)

En la versión anterior, si se ingresaba un valor de tamaño real como 0,1 o 21,8, se convertía a tipo entero, y se truncaban los valores por debajo del punto decimal, y había un problema de que no se distribuía correctamente. . Esto era principalmente un problema cuando el valor Tamaño se usaba en KB, MB, GB, TB, etc. en lugar de la cantidad de bytes.

Se cambió la declaración de la variable miembro "Public m_lSize As Long" de la clase CBinItem a "Public m_dSize As Double".

2.2 El nombre BinItem distingue entre mayúsculas y minúsculas (Cambiado de Colección a Diccionario)

Como variable miembro de la clase CBinItemCollection existente, cada elemento se almacenó en una colección y se administró. Al buscar un elemento, se encontró una instancia de elemento utilizando el nombre del elemento como clave, pero la clave del elemento de una colección tiene una característica que no distingue entre mayúsculas y minúsculas.

El nombre de la tabla y el nombre de la columna extraídos de la base de datos que distingue entre mayúsculas y minúsculas se duplicaron como la clave del elemento de una colección que no distingue entre mayúsculas y minúsculas, por lo que se cambió.

En una base de datos que distingue entre mayúsculas y minúsculas, puede crear y usar nombres de tabla "T1" y "t1" respectivamente. No se recomienda porque puede causar confusión, pero necesitaba mejorar porque los objetos ya creados debían identificarse de manera diferente.

La clase se reescribió usando un diccionario para que la clave del elemento distinga entre mayúsculas y minúsculas, y el nombre de la clase también se cambió de "CBinItemCollection" a "CBinItemDic".

2.3 Ordenar por grupos pares e impares de resultados de distribución

En el resultado de BinPacking, el tamaño del artículo de cada contenedor se ordena de la siguiente manera.

  • Si se selecciona la opción "Orden descendente de tamaño de artículo": ordene en orden inverso de artículos más grandes a artículos más pequeños
  • Si la opción "Orden descendente de tamaño de artículo" no está seleccionada: orden de entrada

Suponga que el resultado de ejecutar el empaquetamiento en contenedores se divide en 4 contenedores. Si copia la lista de elementos del contenedor para crear un grupo de trabajo y ejecutar cada grupo de trabajo, puede ocurrir el siguiente fenómeno.

  • Fenómeno de ejecución cuando los elementos de la papelera se ordenan en orden inverso al tamaño
    • Cuatro grupos de tareas ejecutados simultáneamente ejecutan la tarea más grande desde el principio.
    • Si la contención de recursos del servidor (CPU, memoria, E/S) aumenta y los recursos son insuficientes, algunas tareas fallarán o el tiempo de espera será largo.
    • La contención de recursos se resuelve gradualmente a medida que se completa la ejecución de trabajos de gran tamaño y conduce gradualmente a trabajos de menor tamaño.
  • Cuando los elementos del contenedor se clasifican en orden de entrada
    • La contención de recursos del servidor se intensifica y luego se resuelve y se repite.

Este fenómeno puede crear problemas en los que la carga del servidor se vuelve severa o es difícil predecir cuándo se completa la ejecución debido a la incapacidad de utilizar los recursos de manera eficiente.

Este problema puede no ocurrir si la suma de los tamaños de las tareas ejecutadas simultáneamente es casi igual, pero es casi imposible hacer que los elementos del contenedor tengan un tamaño similar porque el tamaño de los elementos del contenedor no es uniforme.

Para minimizar este fenómeno, los elementos de cada contenedor se clasifican por tamaño, pero se ha agregado la opción de invertir el orden de clasificación de números pares e impares en el orden del contenedor.

Cuando se aplica esta opción, el resultado de la distribución es el siguiente:

Bin1: 2, 5, 3, 1
Bin2: 3, 6, 1, 2

Se cambia de la siguiente manera.

Bin1: 5, 3, 2, 1 # Decending order
Bin2: 1, 2, 3, 6 # Ascending order

2.4. Código de carga BinItem mejorado

El código que lee la lista de elementos del contenedor de entrada en la hoja "Ejecutar" y la carga en la memoria se mejoró mediante el uso de una matriz varaint.

Para saber cómo usar una matriz variante, consulte este artículo.

Patrón de codificación VBA: bucle de rango - lectura

2.5. Si hay un duplicado en Bin Item Name, se notifica con un cuadro de mensaje de lista de duplicados y se detiene la ejecución.

En la versión anterior, si había un nombre de elemento de contenedor duplicado, se ignoraba y se continuaba. Al cambiar a mayúsculas y minúsculas en esta versión, se cambió para verificar si hay duplicados en los datos de entrada, notificar el contenido y luego detener la ejecución. Solo necesita eliminar los duplicados o cambiarlos para que no se dupliquen y ejecutarlo nuevamente.


La herramienta Bin Packing no se usa con frecuencia, pero parece que se usa 4-5 veces al año o más. A veces es una gran ayuda para mí. Si tiene alguna pregunta, por favor deje un comentario.


<< Lista de artículos relacionados >>

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESEspañol