需要一种算法来查找元素子集中的最小成本

时间:2013-06-26 05:36:02

标签: algorithm dynamic-programming linear-programming

我正在尝试找到一种最佳算法,该算法可以找到最大的子集,其中元素的总和最小,同时覆盖所有元素。

例如: - 想象一下A B C是零售商而W X Y Z是产品,目标是最小化访问量并降低价格。

    A    B    C
W   4    9    2  
X   1    3    4 
Y   9    3    9
Z   7    1    1 

So it appears my top two choices are 
a) B:{XYZ} - 7   C:{W} - 2
b) C:{WXZ} - 7   B:{Y} - 3 

So a) is picked because since it has a lower cost, i.e 9. 

这个问题看起来类似于顶点覆盖和其他线性编程算法,但我无法弄清楚正确的算法。

更新:

似乎我需要添加一个额外的变量。介绍t。如果访问最少的零售商和下一个最少的零售商的成本是> t,接下来的前者被选中。

Continuing with the example.

say t = 5,

The largest subset containing all elements would be B:{WXYZ} with a cost of 16. 
The next largest subset(s) is B:{XYZ} - 7   C:{W} - 2 with a cost of 9. 

t = 16 - 9 > 5. So we pick B:{XYZ} - 7   C:{W} - 2 

but if we did A:{X}, B:{Y}, C:{WZ} - 5, t = 9 - 5 < 5. 

So B:{XYZ} - 7   C:{W} - 2 is picked

如果已经有一种适合这种模式的算法,我真的很感兴趣。我不能成为第一个需要这种优化的人。

1 个答案:

答案 0 :(得分:1)

您遇到两个目标的问题:1。最大限度地降低产品的总体成本,以及2.尽量减少访问的商店数量。 (@btilly的评论正确地显示了两个相互竞争的解决方案。)

在这些类型的整数编程问题中,多个目标相当普遍。 See MCDM。 要解决此问题,您需要两种类型的费用(目前只有一种。)

  1. 从零售商r(您已指定)C_rp
  2. 购买产品的成本
  3. 访问零售商的费用:C_r
  4. 直觉:如果C_r非常高,那么我们将从一家零售商那里购买所有产品。如果C_r很小,那么我们会去多个零售商那里购买最便宜的卖家。

    您的问题可以建模为“Assignment Problem”的变体。此外,如果您需要更多参考,请阅读所谓的fixed-charge transportation problems(FCTP)。 (一次访问零售商需要缴纳固定费用。)

    那么对整数编程的表述:

    决策变量

      Binary
      X_rp = if product p is purchased from retailer r, 0 otherwise 
      Y_r = 1 if retailer r is visited, 0 otherwise 
    

    目标函数

     Min C_rp X_rp + C_r Y_r
    

    约束

    (Sum over r) X_rp = 1 for all p (Every product must be bought from some retailer)
    

    接下来,我们需要确保Y_r是1,如果该零售商的X_rp中有一个是1。通常情况下,我们采用Big M方法,但在这个问题上更容易。

    X_rp <= Y_r  for all p, for all r. 
    

    如果任何X变量变为1,则强制Y_r变为1.模型将支付价格C_r。

    要解决此问题,您可以使用任何LP解算器。好消息是问题具有完整性,这意味着即使使用线性编程解决方案技术,整数解也会自然发生。

    希望有所帮助。