比较价格的方法

时间:2013-07-11 16:11:03

标签: algorithm

我将创建一个我想要购买的产品列表。假设他们都被赋予了独特的参考代码。我有一份供我可以购买的供应商清单,为方便起见,每个供应商对每种产品都使用相同的参考代码。

部分供应商收取运费。其他人只收取少于一定金额的运费。如果您购买的产品不止一次,某些供应商会对某些产品打折,但可能存在限制(例如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

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

所以在我脑海里,这不是一项复杂的任务,我可以很容易地在纸上完成它。问题是,我将如何将其转换为代码。我不是在寻找代码来做到这一点 - 只是关于如何实现它的理论的一些指导。

2 个答案:

答案 0 :(得分: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求解器并希望快速得到解决方案。

答案 1 :(得分:0)

混合整数线性编程可以解决您的问题。

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

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

如果你有很多0-1变量,你也可以考虑使用Constraint Programming,它通常更适合重组合问题。

MILP和CP算法都使用分支定界技术,这比天真枚举更快。

干杯