这个“购物袋”优化问题的正确表述是什么,如何有效解决?

计算科学 优化 算法
2021-12-17 12:22:19

我正在寻找解决以下问题的方法,但我无法合理地制定它,然后找到合适的算法来解决它。

考虑放在购物袋中的物品清单:1、2、3、4...

每个项目都可以是一个或多个促销活动的一部分:A、B、C、D

我们希望应用这组促销活动,以使折扣价值最大化,不允许任何项目参与多个促销活动,但每个促销活动可以应用多次。

促销可以通过多种方式定义,但现在我只考虑“购买 2 件符合条件的物品,节省 X”的类型,我希望我能从这里进行概括。

我的例子是:

  • 促销 A - 买 2 减 8
  • 促销 B - 买 2 送 10
  • 促销 C - 买 2 减 6

  • 第 1 项 - 符合 A、B 条件

  • 第 2 项 - 符合 B 条件
  • 第 3 项 - 符合 A、C 条件
  • 第 4 项 - 符合 B、C 条件

在这里很容易看出,促销的正确应用是 A 到项目 1、3 和 B 到 2、4。这给出了 18 的总折扣。

在更大的情况下,它变得很困难,因此需要通过算法求解。

我尝试了以下方法:

  1. 列出我们可以应用的所有可能的促销组合。
  2. 丢弃任何明显较差的内容(例如具有更高价值的促销的直接副本)。
  3. 应用任何与其他促销没有重叠的项目(例如,如果第 1 项和第 2 项仅对促销 A 有效,则应用该促销)。
  4. 取剩余的集合并尝试对结果进行分支定界类型搜索。

但是,这可能需要很长时间(对于具有类似折扣的大型套装)。

我觉得这是一种背包或作业问题,但我写不出来。如果无法明智地编写它,我将无法解决它。

这是一个公认的问题变体吗?任何攻击它的帮助将不胜感激,尤其是使用伪代码来帮助解决它

1个回答

您似乎想利用物品只能用于一次促销的问题的结构。这意味着如果您找到了一个使用尽可能多的促销活动的解决方案,那么做得更好的唯一方法是找到另一个解决方案,该解决方案采用一个或多个促销活动加上未分配的项目并将它们与另一组促销活动和未分配的项目交换具有更高的价值。

例如,您可以从 (1,2) 和 (3,4) 开始前面的示例,对于 16。然后您可以检查 (1,3) 和 (2,4) 导致 18,并且交换应该是制成。