4

我将创建一个我想购买的产品列表。假设他们都被赋予了一个唯一的参考代码。我有一个供应商列表,我可以从这些供应商那里购买,为方便起见,每个供应商对每种产品都使用相同的参考代码。

一些供应商收取运费。其他人仅在您花费少于一定金额时才收取运费。如果您多次购买某些产品,一些供应商会打折,但可能会有限制(例如 1 送 1)。

获取我想购买的产品清单并计算从每个供应商处购买所有产品的总成本非常容易。我想做的是创建一个脚本来确定拆分订单是否更好。

例如:

零售商 A 收费:
产品 A - 5 英镑
产品 B - 10 英镑
产品 C - 10 英镑
产品 D - 10 英镑
运费 - 5 英镑

零售商 B 收费:
产品 A - 5 英镑
产品 B - 12 英镑
产品 C - 12 英镑
产品 D - 30 英镑
运费 - 5 英镑 - 消费 20 英镑或以上免费

在这种情况下,如果我只想购买产品 C,最便宜的将来自零售商 A。

如果我想购买:
1x 产品 A
2x 产品 B
1x 产品 D

最便宜的是零售商 B(因为免费送货)产品 A 和 B,然后拆分订单并从零售商 A 购买产品 D(因为即使包含送货,价格也会显着降低)。

所以在我看来,这不是一项复杂的任务,我可以很容易地在纸上解决它。问题是,我如何将其转换为代码。我不是在寻找代码来做这件事——只是关于如何实现它的理论的一些指导。

4

2 回答 2

4

如果我们将问题限制为简单地选择从哪个供应商购买每种产品,并且如果您花费依赖于供应商的金额,您会获得依赖于供应商的运输成本降低,那么您可以将您的问题表述为整数线性程序(IP 或ILP),对于疑似 NP 难的问题,这是一个很好的策略,因为已经有很多研究和开发的软件包试图在实践中快速解决 ILP。您可以在线阅读有关线性规划和 ILP 的信息。ILP 问题实例具有变量、变量的线性约束以及您想要最小化或最大化的线性目标。这是针对您的问题设置的 ILP:

对于供应商销售的每种产品,您都有一个供应商产品变量,它告诉您将从供应商那里购买多少产品。对于这些变量中的每一个,您都有一个约束,即该变量必须 >= 0。对于您希望购买的每种产品,您有一个约束,即该产品的所有供应商产品变量的总和必须等于您想购买的产品。

然后,对于每个提供运费折扣的供应商,您都有一个运费折扣变量,如果您没有获得折扣,则该变量将为 0,如果您获得折扣,则为 1。对于这些运输折扣变量中的每一个,您都具有变量必须 >=0 和 <= 1 的约束;您还有一个约束条件,即当您将供应商的每个供应商产品变量乘以该产品的供应商价格,然后为供应商将其全部加起来(这样您就可以得到您在供应商处花费的总金额),这金额 >= 供应商的运输折扣变量乘以供应商获得折扣所需花费的最低金额。

您还为每个供应商提供了一个供应商变量,如果您使用供应商,则为 1,如果不使用,则为 0。对于这些供应商变量 A 中的每一个,您有约束 1 >= A > =0 并且对于供应商的每个供应商产品变量 B,您有一个约束 A >= B/N,其中 N 是项目总数你想买。

最后,您想要最大化的目标是通过将每个供应商产品变量乘以该产品的供应商价格,将其全部相加(称为目标 X 的这一部分),然后将每个供应商的运输折扣变量乘以运输成本如果你得到折扣,你得到的减少,把它全部加起来(称为目标 Y 的这一部分),然后将每个供应商变量乘以供应商的未折扣运输成本,把它全部加起来(称为目标 Z 的这一部分)然后你的目标只是最小化 X - Y + Z。这就是定义 ILP 所需的全部内容,然后您可以将其输入 ILP 求解器并希望快速得到解决方案。

于 2013-07-11T20:13:43.817 回答
0

混合整数线性规划可以解决您的问题。

您可以使用免费的求解器,例如 Coin Clp。如果您想了解商业 MILP 求解器的性能,可以在此处找到一些基准: http: //plato.asu.edu/bench.html

如果您想大致了解解决问题所需的时间,您可以在 NEOS Server 上运行您的问题:http: //www.neos-server.org/neos/

当你有很多 0-1 变量时,你也可以考虑使用约束编程,它通常更适合重组合问题。

MILP 和 CP 算法都使用分支定界技术,这比简单枚举要快。

干杯

于 2013-07-11T21:18:37.683 回答