优化 - 选择集合的子集以最小化成本

Optimization - choosing subset of sets which minimises the cost

解决此类问题的有效方法是什么:

我们有许多可能的实体(例如:产品、医学测试)。这些实体以套餐形式提供,购买套餐中的项目 A、B、C 比单独购买它们的成本更低(项目可能会也可能不会单独出售,如果它们有一定的价格)。我们只对几个项目感兴趣,我们想找到什么是单一产品的最佳组合 and/or 产品包以最低的成本购买我们需要的所有项目(我们真的不在乎我们是否购买任何产品是否不在我们的列表中,它们对我们的价值为零)。套餐的内容可以重叠(例如,项目 A 可以在多个不同的套餐中提供,也可以单独提供)。

最自然的方法是计算幂集(所有可能的子集),但这不允许解决方案很好地扩展。

什么是有效的精确或 approximate/heuristic 解决方案?

您可以在优化模型中执行此操作。

假设我们有输入数据:

----     14 SET c  items+combos

c1,    c2,    c3,    A ,    B ,    C 


----     14 SET i  single items

A,    B,    C


----     14 PARAMETER p  prices

c1 30,    c2 18,    c3 18,    A  10,    B  12,    C  15


----     14 PARAMETER cc  combo content

             A           B           C

c1           1           1           1
c2           1           1
c3           2
A            1
B                        1
C                                    1


----     14 PARAMETER demand  items needed

A 7,    B 4,    C 3

现在我们求解简单的混合整数规划 (MIP) 模型:

结果如下:

----     36 VARIABLE buy.L  items+combos to buy

c1 3,    c2 1,    c3 1,    A  1


----     36 VARIABLE cost.L                =      136.000  

在某些情况下,我们会购买比需要更多的东西(如果折扣足够高)。如果您购买的物品的价值超过需求,那么模型就会变得有点复杂。

高性能商业 MIP 求解器和开源 MIP 求解器都很容易获得。他们将非常有效地解决这种类型的模型以达到全局最优(即使对于具有许多项目和许多组合的更大数据集也是如此)。与您的 "powerset" 算法相比,对我来说,这种方法看起来更有吸引力。 MIP 求解器不是近似值,但它们通常只需要探索所有可能的可行整数解的一小部分。