找到从限制x供应商处购买p产品的最佳方式

时间:2011-11-15 09:00:02

标签: algorithm

必须从20家供应商(或v供应商)购买 100种产品(或p产品)。每个供应商都拥有所有这些产品,但他们销售不同的价格。

http://i.stack.imgur.com/oaupb.jpg  << Image description. Sorry, I can not post Image because I'm a new user.

我想找到获得100种产品的最优惠价格。假设没有运费。 有v ^ p方式。我只会得到一种价格最优惠的方式。 如果没有要求,问题似乎很容易:由于时间交付(或某些原因),订单中的供应商数量限制为x。

所以,问题是:找到从限制x供应商购买p产品的最佳方式(有v供应商,x&lt; = v)。

我可以生成所有供应商组合(有C(v,x)组合)并比较总价。但是有这么多组合。 (如果有20家供应商,则有大约185k组合)。 我坚持这个想法。 有人有同样的问题,请帮助我。非常感谢你。

5 个答案:

答案 0 :(得分:4)

这个问题相当于非公制k-center problem(城市=产品,仓库=供应商),这是NP难的。

我会尝试混合整数编程。这是一个表述。

minimize c(i, j) y(i, j)  # cost of all of the orders
subject to
for all i: sum over j of y(i, j) = 1  # buy each product once
for all i, j: y(i, j) <= z(j)  # buy products only from chosen vendors
sum over j of z(j) <= x  # choose at most x vendors
for all i, j: 0 <= y(i, j) <= 1
for all j: z(j) in {0, 1}

变量的解释是i是产品,j是供应商,c(i, j)是来自供应商i的产品j的成本如果我们从供应商y(i, j)1购买产品i,则j0,否则,z(j)1是我们购买的完全来自供应商j,否则来自0

many个免费的混合整数程序求解器。

答案 1 :(得分:3)

不正确,如@Per所示,结构缺乏最佳子结构

我的假设如下,从主表中您需要创建一个只有“x”供应商列的子列表,而“最佳价格”是所有价格的“总和”。

使用动态编程方法 您所做的是定义两个函数Picking (i,k)NotPicking(i,k)。 这意味着最好的能力从1,...我挑选供应商,最多有k个供应商。

Picking (1,_) = Sum(All prices)
NotPicking (1,_) = INF
Picking (_,0) = INF
NotPicking (_,0) = INF

Picking (i,k) = Min (Picking(i-1,k-1) + NotPicking(i-1,k-1)) - D (The difference you get because of having this vendor)
NotPicking (i,k) = Min (Picking(i-1,k) + NotPicking(i-1,k))

您只需解决i从1到V和k从1到X

通过维护每次拣选整个产品列表并计算差异来计算差异。

答案 2 :(得分:0)

编辑:匈牙利算法不是你问题的答案,除非你不想限制供应商。

您要查找的算法是Hungarian Algorithm

网上有很多available implementations

答案 3 :(得分:0)

如何使用贪婪的方法。由于您对供应商有限制(您需要使用总v供应商中的至少x个)。这意味着您需要从x的每个供应商中选择至少1个产品......这是一个示例解决方案:

对于v中的每个供应商,按价格对产品进行排序,然后您将获得“v”组排序价格。现在你可以选择这些组的最小值并再次排序,生成一组新的“v”产品,只包含最便宜的产品。

现在,如果p&lt; = v,那么选择第一个p项并完成,否则选择所有v项并重复相同的逻辑直到达到p。

答案 4 :(得分:0)

我还没有解决这个问题并进行验证,但我想它可能会有效。试试这个:

在表格中再添加两个名为“最高价格”和“最低价格”的列,并为其生成数据:它们应为所有供应商中的每种产品保留最高和最低价格。 还要添加另一个名为“Range”的列,它应该保持(最高价格 - 最低价格)。

现在这样做100(p)次:

  1. 选择范围最大的行。以最低价格购买产品 那一排。购买后,将该单元格标记为“已购买”(可能设置为空)。
  2. 重新计算该行的最低价格范围(忽略标记为“已购买”的单元格)。