如何以最低价格优化购物车?

时间:2010-05-08 12:50:52

标签: java algorithm optimization

我有一份我想要购买的物品清单。这些物品由不同的商店和不同的价格提供。商店有个人送货费用。我正在寻找最优购物策略(以及支持它的java库)以最低的总价购买所有商品。

实施例

  • 第1项目在Shop1以100美元的价格在Shop2以111美元的价格提供。
  • 第2项目在Shop1以90美元的价格在Shop2以85美元的价格提供。
  • Shop1的交付成本:如果总订单数为10美元,则为10美元。 $ 150,否则为$ 0
  • Shop2的运送成本:如果总订单数为5美元,则为5美元。 $ 50;否则为$ 0
  • 如果我在Shop1购买Item1和Item2,总成本为100美元+ 90美元+ 0美元= 190美元。
  • 如果我在Shop2购买Item1和Item2,总成本为111美元+ 85美元+ 0美元= 196美元。
  • 如果我在Shop1购买Item1,在Shop2购买Item2,总费用为100美元+ 10美元+ 85美元+ 0美元= 195。

如果我在Shop1订购Item1和Item2,我会得到最低价格:$ 190

问题

我需要一些提示,这些算法可以帮助我解决此类优化问题,包括约100件商品和20件商店数量。

我已经查看了apache-math及其optimization package,但我不知道要查找哪种算法。


Here是一个后续问题。

4 个答案:

答案 0 :(得分:3)

在该软件包中的所有算法中,没有一个在离散的解决方案空间中运行(即没有表示您不能购买商店1中的半个商品,商店2中的半个商品的约束)。

您可能会尝试以良好的第一次猜测(例如,无视运费)的最佳解决方案递归地解决问题,并且一旦您当前的解决方案无法比目前为止看到的最佳解决方案更好,请尽早回溯。这是O(S ^ I),但如果商店提供不同的价格,它可能不会那么糟糕。但它会产生最佳解决方案。

您可以尝试一种迭代方法,在这里开始使用某种解决方案,查看相邻解决方案(只有来自不同商店的一个项目),充分利用这些解决方案,并重复这一过程,直到解决方案不再发生变化为止。这种方法可能会陷入局部最优,因此它通常是随机的,无论是在起始位置,还是通过以一定概率(即模拟退火)进行低于最佳邻居解决方案。

或者如果你真的想深入研究文献,http://en.wikipedia.org/wiki/Combinatorial_optimization是一个很好的起点。

答案 1 :(得分:2)

虽然您可以基于Apache Simplex解算器实现您的解决方案,但您必须在其上构建大量代码才能使其按照您的需要执行。

更快的方法是使用现成的Constraint Satisfaction包来支持优化的整数域。有许多开源软件包可用,每个软件包的功能略有不同。引起我注意的是Cream。这纯粹是用Java实现的,有一个非常简洁的API,基于一些算法(分支和绑定,禁忌,模拟退火等)。它有一些很好的功能,如超时搜索,并行本地搜索等。

您可能想要调查一些其他软件包,但我不太了解:

  1. JCL
  2. jOpt

答案 2 :(得分:1)

对我来说听起来有点像0/1背包问题。

基本上,您可以将问题建模为决策树(其中每个级别决定从哪里购买产品并分支到不同的供应商)。然后,您可以追踪最佳解决方案。

可能需要根据您的情况进行一些调整(考虑到运输等),但这是一个开始寻找的好地方。

Some information courtesy of Wikipedia

修改

我应该补充一点,在这种情况下,它不是真正的0/1问题(即接受或离开它),而是一个0-n问题(即你有n个供应商选择,或者你可以离开它)。

答案 3 :(得分:0)

对于记录,可以使用约束运行整数编程,因此使用0/1(即二进制变量)来指示是否要在给定商店购买给定产品,并使用约束:求和二进制变量商店(固定产品)< = 1