有没有更好的方法来计算笛卡尔积。由于笛卡尔积是一种特殊情况,每种情况都不同。我想,我需要解释我需要实现什么,以及为什么我最终会做笛卡尔积。如果笛卡尔积是我问题的唯一解决方案,请帮助我。如果是这样,如何提高性能?
背景:
我们正在努力帮助客户以更便宜的价格购买产品。
假设客户订购了 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 提供
- 产品 3 - 由供应商提供 6
- 产品 4 - 由供应商 1、供应商 6 提供
- 产品 5 - 由供应商 3、供应商 2 提供
现在根据价格选择最好的供应商。我们可以按价格对产品进行分类并取第一个。
在这种情况下,我们选择
- 来自供应商 1 的产品 1
- 来自供应商 5 的产品 2
- 来自供应商 6 的产品 3
- 来自供应商 1 的产品 4
- 来自供应商 3 的产品 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}
- {供应商1,供应商3,供应商5}
- {供应商6}
- {供应商1,供应商6}
- {供应商2,供应商3}
需要计算 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 种产品,则需要几天以上的时间。
有没有办法从不同的角度解决这个问题?