对Comparing multiple price options for many customers algorithmically的重述没有那么多的重复。
我们有1,000,000名客户。 每种产品的销售成本可以表示为价格A或价格B.
价格A<<价格B.
价格A和价格B彼此不是线性的。在某些情况下,B是昂贵的2倍,有些则是100倍。
所有客户的成本
min( (sum(A)/count(A)) , 100 ) * count(A)
实际上,如果A小于100,A上所有客户的平均成本将四舍五入为100.
对B没有这样的限制。
我想把最少的钱花在他们的商品上。
如何最大化
cost=min( (sum(A)/count(A)) , 100 ) * count(A) + sum(B)
我一直认为这是双背包问题的一种形式,但我无法做到......
我很可能在Python中解决这个问题,尽管我怀疑这很重要。
我通过为x y z分配分数并基于此进行过滤来完成手动分析,我对更多的计算解决方案感兴趣。
建议的任何方法?
答案 0 :(得分:0)
每个客户都可以分配到A侧或B侧。如果我向您提供了最佳解决方案,您会发现无法通过更改任何单个客户的分配来改进它。鉴于此,有两种情况需要检查,如果我可以忽略边界情况:
1)在最佳解决方案中,A方客户的平均成本至少为100,因此最低价格不会生效。如果我将客户从A切换到B或反之亦然,则成本会因该客户的A和B价格差异而变化。由于我有一个完美的解决方案,每个客户必须被分配到A或B成本较低的任何一个,在您的情况下意味着每个人都去A。
2)每位客户的最低100次充电在A方面生效,因此从A和B更换客户或反之亦然相当于为A充电100美元。因为我有一个完美的解决方案,客户A方必须是B价格至少为100的客户,而B方的客户必须是B价格为100或以下的客户。
此处唯一的问题是,如果切换客户意味着100最小值生效或停止生效。在情况(1)中,如果某人切换到B,即使没有A价格的最小生效,价格也会增加,所以这不可能发生。在情况(2)中,如果B方客户切换到A,这只会使事情变得更糟,因为他们的B价格是100或更低,所以他们的A价格必须是100或更低。 A客户的B价格必须为100或更高。如果他们的A价格是100或者更高,他们肯定应该留在A上,因为将他们转移到B不能使最低成本停止申请。如果他们的A价格< 100并将它们移动到B会停止最小A价格从而开始然后您支付的费用减去因为该客户的真实A价格,但您仍然必须支付至少100的B价格,因此这里没有什么可以获得的任
所以我认为你计算出两种可能性的成本 - 案例1是你将所有东西分配给A而案例2是你将东西分配给A的地方,其中B价格是100或更高。选择哪一种最便宜。