繁体   English   中英

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

[英]Need a algorithm to find the minimum cost in a subset of elements

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

例如:-想象ABC是零售商,WXYZ是产品,目标是最大程度地减少访问量并降低价格。

    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.最小化产品的总体成本降低,并且2.最小化拜访的商店数量。 (@btilly的评论正确地显示了两个相互竞争的解决方案。)

在这些类型的Integer编程问题中,多个目标相当普遍。 请参阅MCDM 要解决此问题,您需要使用两种类型的成本(目前只有一种)。

  1. 从零售商r(已指定)购买产品p的成本C_rp
  2. 拜访零售商的费用: C_r

直觉:如果C_r非常高,那么我们将向一家零售商购买所有产品。 如果C_r很小,那么我们会去多家零售商,并从最便宜地出售它的人那里购买。

您的问题可以建模为“ 分配问题 ”的变体。 另外,如果需要更多参考,请阅读所谓的fixed-charge transportation problems (FCTP)。 (一次拜访零售商需要支付一定的费用。)

接下来是Integer编程公式:

决策变量

  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)

接下来,即使该零售商的X_rp之一甚至为1,我们也要确保Y_r为1。 通常,我们会采用Big M方法,但是在此问题上更容易实现。

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

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

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

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM