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:
- Enumere todas las combinaciones posibles de Promociones que podríamos aplicar.
- Deseche cualquiera que sea obviamente pobre (por ejemplo, una copia directa de una promoción con un valor más alto).
- 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).
- 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.
fuente
Respuestas:
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.
fuente