有没有更好的方法来计算笛卡尔积。由于笛卡尔积是一种特殊情况,每种情况都不同。我想,我需要解释一下我需要实现什么,以及为什么我最终会做笛卡尔积。如果笛卡儿产品是解决我问题的唯一解决方案,请帮助我。如果是这样,如何提高性能?
我们正在努力帮助客户购买更便宜的产品。
假设客户订购了5种产品(prod1,prod2,prod3,prod4,prod5)。
每个订购的产品都由不同的供应商提供。
换句话说
现在根据价格选择最好的供应商。我们可以按价格对产品进行分类,然后选择第一个产品。
在这种情况下,我们选择
由于我们选择了4家独特的供应商,我们需要支付4个运费。
此外,每个供应商都有最低采购订单。如果我们不满足,那么我们最终也会支付这笔费用。
为了选择最佳产品组合,我们必须提供所提供产品的笛卡尔积来计算总价。
total price computation algorithm:
foreach unique vendor
if (sum (product price offered by specific vendor * quantity) < minimum purchase order limit specified by specific vendor)
totalprice += sum (product price * quantity) + minimum purchase charge + shipping price
else
totalprice += sum (product price * quantity) + shipping price
end foreach
在我们的案例中
4 * 3 * 1 * 2 * 2 = 48组合需要计算才能找到最佳组合。
现在对计算出的总价格进行排序,以找到最佳组合。
如果客户订购超过15种产品,并假设每种产品已由8家独特供应商提供,那么我们最终计算8 ^ 15 = 35184372088832组合,这需要超过几个小时。如果客户订购的产品超过20种,则需要几天时间。
是否有解决方案以不同的角度处理此问题?
答案 0 :(得分:1)
您的问题会变得更加复杂。一个简单的例子:
Product 1 2 3
Vendor 1 10 20 40
Vendor 2 20 10 40
--------------------------
needed cnt 100 100 25
你需要100埃尔。 P1,100的P2和25的P3。
P1可以在V1购买1000,P2在V2购买1000,在V1或V3购买P3 1000。
现在发货是免费的,如果您购买1500,但每个供应商的成本为200。
因此,如果您在V1处订购所有商品,则需支付 4000 :
1000+2000+1000+0 (shipping) = or for the same sum
2000+1000+1000+0 at V2, or splitted
1000+0+0+200 = 1200 at V1 plus
0+1000+1000+0 = 2000 at V2,
总计 3200 ,可以通过您的方法找到。
但你可以这样分开购买产品3:
1000+0+500+0 = 1500 at V1 plus
0+1000+500+0 = 1500 at V2
仅总计 3000 ,并且您的方法无法找到。
Afaik,已有针对此类主题的研究,关键词是矩阵和方程组。
您可以将问题描述为
f(c11, p11) + f(c22, p12) + f(c13, p13) = c1 => dc1
f(c21, p21) + f(c22, p22) + f(c23, p23) = c2 => dc2
...
f(c31, p31) + f(c32, p32) + f(c13, p33) = c3 => dc3
其中cij是供应商i的产品j的数量,pij是供应商i的产品j的价格,但是f(c11,p11)不仅仅是计数*价格,而是计数和价格的函数,因为那里可能是数量折扣。右侧是供应商i的购买总额。
这是没有购买折扣,必须在顶部建模。如果运费折扣仅取决于总费用,则可以仅根据ci =&gt;建模。 DCI。
你会尝试最小化总和(dc1 + dc2 + ... + dcm)。