¿Cuál es la formulación correcta de este problema de optimización de “bolsa de compras” y cómo puedo resolverlo de manera eficiente?

8

Estoy buscando encontrar una solución al siguiente problema, pero tengo problemas para formularlo con sensatez y luego encontrar un algoritmo adecuado para resolverlo.

Considere una lista de artículos colocados en una bolsa de compras: 1, 2, 3, 4 ...

Cada artículo puede ser parte de una o más promociones: A, B, C, D

Deseamos aplicar el conjunto de promociones de manera que maximicemos el valor del descuento, que ningún artículo pueda participar en más de una promoción, pero cada promoción podría aplicarse más de una vez.

Las promociones se pueden definir de varias maneras, pero por ahora solo estoy considerando un tipo de 'Compre 2 artículos calificados, guarde X', espero poder generalizar desde aquí.

Mi ejemplo sería:

  • Promoción A - Compre 2 Ahorre 8
  • Promoción B - Compre 2 Ahorre 10
  • Promoción C - Compre 2 Ahorre 6

  • Artículo 1 - Elegible para A, B

  • Artículo 2 - Elegible para B
  • Artículo 3 - Elegible para A, C
  • Artículo 4 - Elegible para B, C

Es bastante fácil ver aquí que la aplicación correcta de las promociones es A para el Artículo 1, 3 y B para 2, 4. Esto da un descuento total de 18.

En un caso más grande se vuelve difícil, por lo tanto, necesita resolverse algorítmicamente.

He intentado lo siguiente:

  1. Enumere todas las combinaciones posibles de Promociones que podríamos aplicar.
  2. Deseche cualquiera que sea obviamente pobre (por ejemplo, una copia directa de una promoción con un valor más alto).
  3. Aplique cualquiera que no se solape con otras promociones (por ejemplo, si los Artículos 1 y 2 solo son válidos para la promoción A, entonces aplique esa promoción).
  4. Tome el conjunto restante e intente una búsqueda de tipo de bifurcación en los resultados.

Sin embargo, esto puede llevar mucho tiempo (para juegos grandes con descuentos similares).

Siento que este es un tipo de problema de Mochila o Asignación, pero no puedo escribirlo con sensatez. Sin poder escribirlo con sensatez, no puedo resolverlo.

¿Es esta una variante reconocida de un problema? Cualquier ayuda para atacarlo sería muy apreciada, especialmente con el código psuedo para ayudar a resolverlo.

James Osborn
fuente
2
Los datos se pueden expresar como un gráfico bipartito. Si cada promoción se pudiera aplicar como máximo una vez, sería un problema de coincidencia de gráfico bipartito de peso máximo, lo cual se entiende muy bien. Entonces, lo que quieres, creo, es una forma relajada de ese problema. Esto podría ayudarlo a encontrar algo en la literatura.
Seudónimo
Entonces, si por ahora suponemos que cada promoción solo se puede aplicar una vez, ¿cómo formaría el gráfico? He intentado un par de formas, pero no puedo ver cómo mantendría la restricción de permitir que solo se aplique una Promoción si se considera válida.
James Osborn
Puede formar este problema como un programa de enteros 0-1, luego utilizar un solucionador de código abierto o comercial para abordar las versiones más grandes del mismo.
Aron Ahmadia
1
@James Osborn: considere un gráfico bipartito en el que haya una ventaja entre cada promoción y cada elemento. Si es válido aplicar esa promoción a ese artículo, el peso en el borde es la "ganancia". De lo contrario, el peso en el borde es cero. Luego, encuentra una coincidencia de peso máximo y descarta cualquier borde con peso cero. Básicamente, dejas que suceda la coincidencia, pero deja claro al algoritmo de optimización que no obtienes nada con él.
Seudónimo
Solo una actualización rápida, gracias por la ayuda hasta ahora. Todavía no he tenido muchas oportunidades de ver las soluciones, pero me ha dado algunos buenos lugares para buscar.
James Osborn

Respuestas:

1

Parece que le gustaría aprovechar la estructura del problema de que los artículos solo pueden usarse para una promoción. Eso significa que si ha encontrado una solución que utiliza tantas promociones como sea posible, la única forma de hacerlo mejor es encontrar otra solución que tome una o más promociones más los artículos no asignados y los intercambie con otro conjunto de promociones y artículos no utilizados de mayor valor.

Por ejemplo, puede comenzar el ejemplo anterior con (1,2) y (3,4), para 16. Luego puede verificar que (1,3) y (2,4) conducen a 18, y el intercambio debe ser hecho.

aeismail
fuente