如何优化笛卡尔积

时间:2012-04-25 15:46:14

标签: cartesian-product

有没有更好的方法来计算笛卡尔积。由于笛卡尔积是一种特殊情况,每种情况都不同。我想,我需要解释一下我需要实现什么,以及为什么我最终会做笛卡尔积。如果笛卡儿产品是解决我问题的唯一解决方案,请帮助我。如果是这样,如何提高性能?

背景

我们正在努力帮助客户购买更便宜的产品。

假设客户订购了5种产品(prod1,prod2,prod3,prod4,prod5)。

每个订购的产品都由不同的供应商提供。

表示格式1:

  • 供应商1 - 提供prod1,prod2,prod4
  • 供应商2 - 提供prod1,prod5
  • 供应商3 - 提供prod1,prod2,prod5
  • 供应商4 - 提供prod1
  • 供应商5 - 提供prod2
  • 供应商6 - 提供prod3,prod4

换句话说

表示格式2:

  • 产品1 - 由vendor1,vendor2,vendor3,vendor4
  • 提供
  • 产品2 - 由vendor5,vendor3,vendor1
  • 提供
  • prod 3 - 由vendor6提供
  • prod 4 - 由vendor1,vendor6提供
  • prod 5 - 由vendor3,vendor2提供

现在根据价格选择最好的供应商。我们可以按价格对产品进行分类,然后选择第一个产品。

在这种情况下,我们选择

    来自供应商1的
  • prod 1
  • 来自供应商5的
  • prod 2
  • 来自供应商6的
  • prod 3
  • 来自供应商1的
  • prod 4
  • 来自供应商3的
  • prod 5

复杂度:

由于我们选择了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

在我们的案例中

  • {vendor1,vendor2,vendor3,vendor4}
  • {vendor1,vendor3,vendor5}
  • {vendor6}
  • {vendor1,vendor6}
  • {vendor2,vendor3}

4 * 3 * 1 * 2 * 2 = 48组合需要计算才能找到最佳组合。

  • {vendor1,vendor1,vendor6,vendor1,vendor2} = totalprice1,
  • {vendor1,vendor3,vendor6,vendor1,vendor2} = totalprice2,
    • *
  • {vendor4,vendor5,vendor6,vendor6,vendor3} = totalprice48

现在对计算出的总价格进行排序,以找到最佳组合。

实际问题:

如果客户订购超过15种产品,并假设每种产品已由8家独特供应商提供,那么我们最终计算8 ^ 15 = 35184372088832组合,这需要超过几个小时。如果客户订购的产品超过20种,则需要几天时间。

是否有解决方案以不同的角度处理此问题?

1 个答案:

答案 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)。