12 votos

Optimización combinatoria - mejorar el rendimiento

Estoy escribiendo un programa para resolver un problema de optimización combinatoria. He estado trabajando en un algoritmo que obtiene los resultados deseados, pero estoy teniendo dificultades para obtener el algoritmo para realizar el bien.

El dominio del problema es el suministro de equipos médicos de la industria, y el requisito básico es el de asignar elementos a los paquetes de modo que el precio del alquiler se reduce al mínimo. Los equipos se pueden alquilar de forma individual, pero también hay paquetes definidos que contienen una combinación de equipos, y el precio del alquiler de los paquetes es menor que el total de la carga de alquiler de los equipos individuales. Mientras que la generación de la factura, tengo que asignar los elementos de los paquetes que sea posible, de tal manera que el total de la cuota de alquiler se reduce al mínimo.

En mi modelo, los paquetes son definidos de la siguiente manera

  • Cada paquete contiene 1..N los Grupos G1, G2, G3,.. GN.
  • Cada Grupo debe tener un mínimo de elementos X (donde X >= 0), y en la mayoría de las Y los artículos ( Y > 0, Y >= X)
  • Cada Grupo puede contener 1..n Tipos de elementos de IT1, IT2, ... Nti
  • Cada Tipo de Elemento que debe incluirse al menos Una veces (A >= 0) en el grupo, y en la mayoría de los B veces (B > 0, B >= A)

Un ejemplo de paquetes podrían ser de la siguiente manera;

Bed and Wheelchair package 
    Group: Bed (total item min 1, max 1)
        Bed 6 feet (min 0, max 1)
        Bed 6.5 feet (min 0, max 1)
    Group: Wheelchair (total item min 1, max 1)
        Manual wheelchair (min 0, max 1)
        Motorized wheelchair (min 0, max 1)
    Group: Accessories (min 0, max 3)
        Air Mattress (min 0, max 1)
        Air blower (min 0, max 1)
        Pillows (min 0, max 2)

Habría varios paquetes disponibles similar a la anterior. Un determinado Tipo de Elemento puede aparecer sólo una vez en un paquete. Sin embargo, los paquetes diferentes pueden tener el mismo Tipo de Elemento.

Supuestos O Requisitos:

  • Cada paquete tiene un precio de alquiler asociados con ella, como lo hace cada Tipo de Elemento.
  • A la hora de alquilar un paquete, sólo el precio del paquete es una carga, no los elementos que hay dentro del paquete. Un alquiler puede estar compuesta de paquetes y los elementos individuales.
  • Cuando el alquiler de X número de elementos de diferentes tipos, los elementos deben ser asignados a los paquetes donde sea posible, de modo que el total del alquiler se reduce al mínimo.
  • Puede haber varias maneras de formar los paquetes, y los que tienen el más bajo de alquiler debe ser seleccionado.
  • Puede haber varias combinaciones que producen el menor alquiler de. Todos ellos son necesarios en el resultado. (Yo podría ser capaz de trabajar alrededor de este requisito si es absolutamente necesario).
  • Necesito el apoyo de alquiler de hasta 25 elementos. El número de paquetes disponibles pueden variar de 10 a 20.
  • Una complejidad adicional que necesito agregar más tarde es para apoyar el concepto de paquetes de contenidos en el interior de los paquetes.
  • Que tengo que hacer esto por múltiples alquiler de facturas en un modo por lotes, lo que hace que la el rendimiento del algoritmo de manera crítica.

Mi enfoque hasta ahora:

  • Para cada elemento, encontrar una lista de los paquetes que se puede pertenecer a basado en el tipo de elemento.
  • Crear un grafo donde cada nodo es un elemento de un paquete de asignación. Organizar el gráfico de modo que los nodos en cada nivel de hoja representan los posibles paquete de asignaciones de un solo elemento.
  • Hacer una profundidad de primer recorrido de la gráfica, la poda, el subárbol y retroceso, cuando es obvio que el subárbol no puede resultar en una solución óptima. Yo soy la poda de los subárbol cuando cualquiera de las siguientes es falsa:
    • Cuando el resto de los elementos están incluidos, puede satisfacer las cantidades mínimas requeridas para cada paquete en la sucursal hasta el momento ?
    • Es el precio total de los paquetes incluidos así que mucho menos que el total del precio individual de todos los elementos de línea ?

El enfoque es acabar con una cara de cálculo. En una prueba con 24 ítems y un pequeño número de paquetes, recorrido de 2,5 millones de nodos y tomó más de un minuto para que los resultados vienen de vuelta. Idealmente, me gustaría que los resultados se devuelven en segundos.

Yo te aprecio mucho los punteros a un algoritmo eficiente que puede ser utilizado para este problema.

EDIT: estoy agregando un ejemplo de un proyecto de ley y el paquete.

Bed and Accessories package
    Group: Bed (total item min 1, max 1)
        Bed (B) (min 1, max 1)
    Group: Accessories (total item min 0, max 2)
        Mattress (M) (min 0, max 1)
        Pillows  (P) (min 1, max 2)

Total cantidades en la factura: B: 2, M: 3, P: 5

Los paquetes se pueden formar de diferentes maneras:

2 packages, remaining items billed individually
    (1B, 1M, 1P), (1B, 2P)
    (1B, 2P), (1B, 2P)
    (1B), (1B)
    etc

1 package, remaining items billed individually
    (1B, 1P), 
    (1B, 2P), 
    (1B, 1M, 1P), 
    (1B), 
    etc

Con IP, la función a ser minimizado puede ser definida como

aD + bB + cM + dP
    where D is the quantity of discount package
    B, M and P are the quantities of the items not billed as packages, 
    and a, b, c, d are the rental costs for each. 

Algunas de las limitaciones:

B <= 2 
M <= 3
P <= 5 
D + B = 2

Sin embargo, para el grupo Accesorios, que va a ser complejo. Yo no tengo

D + M = 3,

como D puede ser formado sin ningún tipo de colchón, como el [(1B, 2P), (1B, 2P)] combinación. En esta combinación, D = 2 y M = 3, ya que todos los estados miembros están siendo facturados de forma individual, y hay 2 paquetes de descuento. Yo estaba pensando en introducir algunas variables adicionales para representar lo que las cantidades son recogidos para cada grupo, pero creo que va a resultar en una restricción cuadrática.

3voto

Martin OConnor Puntos 116

Aquí es el código Lingo que creo que soluciona tu simplificado problema como un programa entero. (He probado, y las respuestas tienen sentido.) Esto debe ser fácilmente traducible a cualquier IP de solver utiliza.

Algunos comentarios:

  1. Usted necesita saber lo que el número máximo de paquetes de cada tipo es un adelanto. En la práctica creo que es factible. Por ejemplo, en el ejemplo, el número máximo es 2, ya que sólo hay 2 camas en el proyecto de ley.
  2. Creo que el único entero variables se deben especificar son los Pj's como binario. Dado que todas las otras variables tienen 1 como sus coeficientes de las restricciones, las otras variables que debe salir a tienen valores enteros en la solución óptima, incluso sin especificar de antemano. Que debería hacer que el código se ejecutará mucho más rápido. Si estoy equivocado acerca de esto, es muy sencillo modificar el código para exigir entero con valores de las variables.
  3. Si usted permite que más de un tipo de paquete de algunas de las variables que se necesitan para ser doblemente indexado. Por ejemplo, usted necesitará $BP(i,j)$ como el número de camas que se venden en paquete j de paquete de tipo i, así como a $P(i,j)$ como la variable binaria igual a 1 si el paquete $j$ tipo $i$ y 0 en caso contrario.


! D = number of packages
! BI = number of beds sold individually;
! MI = number of mattresses sold individually;
! PI = number of pillows sold individually;

MIN = 12*D + 10*BI + 6*MI + 3*PI;

! P1 and P2 are binary variables.
! Pj = 1 if package j is used and 0 otherwise
! You need a Pj variable for each potential package j.
! The following constraints force D to be 1 if P1=1 and D to be 2 if P2=1;
! In general, you need a constraint of the form j*Pj <= D for each package Pj.

P1 <= D;
2*P2 <= D;

! Must supply all bill items;
BP1 + BP2 + BI = 2;
MP1 + MP2 + MI = 3;
PP1 + PP2 + PI = 5;

! BPj = number of beds sold in package j.  
! Similarly for MPj and PPj for mattresses and pillows.
! These constraints implement the maximum and minimum requirements for 
! each package and simultaneously force BPj = MPj = PPj = 0 if Pj = 0.
! You need a set of these constraints for each potential package j;
P1 <= BP1; BP1 <= P1;
MP1 <= P1;
P1 <= PP1; PP1 <= 2*P1;
MP1 + PP1 <= 2*P1;

P2 <= BP2; BP2 <= P2;
MP2 <= P2;
P2 <= PP2; PP2 <= 2*P2;
MP2 + PP2 <= 2*P2;

! Require Pj to be binary;
@BIN(P1); @BIN(P2);

1voto

Tim C. Puntos 281

Un diseñadas por el usuario, la interfaz definitivamente simplificar este proceso. El programa diseñado para que la persona que solicita el suministrado entra en exactamente lo que quieren. Selecciones desplegables puede simplificar la forma en que muchos artículos se pueden max/min. Después de que el usuario lo selecciona todo, el programa inserta los artículos adecuados en el paquete. Cada elemento tendrá el costo ligado a ella. El usuario selecciona todo, por lo que el sistema informático no tiene que ejecutar a través de cada una de las opciones para determinar si el elemento debe estar en el paquete.

No estoy seguro si he entendido de tu base de cómo funciona el programa, pero que es lo que tengo de ella. Espero que ayude!

1voto

gcq Puntos 8

Si usted exhaustivamente recorrer todos los nodos, su tiempo de respuesta obtendrá de manera exponencial peor como itmes y paquetes de aumentar.

Usted puede tratar de un algoritmo Genético, que se obtiene a cerca de la óptima, pero no se garantiza óptimos resultados en un período de tiempo configurable. Cuanto más tiempo se deja correr, mejor será.

También puede arquitecto de su algortithm para difundir a través de múltiples nodos hardware, así que usted puede reducir el tiempo para buscar en el espacio mediante la búsqueda en paralelo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X