我必须从20家供应商(或v供应商)购买 100种产品(或p产品)。每个供应商都拥有所有这些产品,但他们销售不同的价格。
我想找到获得100种产品的最优惠价格。假设没有运费。 有v ^ p方式。我只会得到一种价格最优惠的方式。 如果没有要求,问题似乎很容易:由于时间交付(或某些原因),订单中的供应商数量限制为x。
所以,问题是:找到从限制x供应商购买p产品的最佳方式(有v供应商,x< = v)。
我可以生成所有供应商组合(有C(v,x)组合)并比较总价。但是有这么多组合。 (如果有20家供应商,则有大约185k组合)。 我坚持这个想法。 有人有同样的问题,请帮助我。非常感谢你。
答案 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
,则j
为0
,否则,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)
答案 3 :(得分:0)
如何使用贪婪的方法。由于您对供应商有限制(您需要使用总v供应商中的至少x个)。这意味着您需要从x的每个供应商中选择至少1个产品......这是一个示例解决方案:
对于v中的每个供应商,按价格对产品进行排序,然后您将获得“v”组排序价格。现在你可以选择这些组的最小值并再次排序,生成一组新的“v”产品,只包含最便宜的产品。
现在,如果p&lt; = v,那么选择第一个p项并完成,否则选择所有v项并重复相同的逻辑直到达到p。
答案 4 :(得分:0)
我还没有解决这个问题并进行验证,但我想它可能会有效。试试这个:
在表格中再添加两个名为“最高价格”和“最低价格”的列,并为其生成数据:它们应为所有供应商中的每种产品保留最高和最低价格。 还要添加另一个名为“Range”的列,它应该保持(最高价格 - 最低价格)。
现在这样做100(p)次: