如何以最低的价格优化购物车?
Posted
技术标签:
【中文标题】如何以最低的价格优化购物车?【英文标题】:How to optimize shopping carts for minimal prices? 【发布时间】:2011-02-17 03:46:14 【问题描述】:我有一份我想购买的物品清单。这些商品由不同的商店和不同的价格提供。商店有单独的送货费用。我正在寻找一种最佳的购物策略(以及支持它的 Java 库)以最低的总价购买所有商品。
示例:
商品 1 在 Shop1 的售价为 100 美元,在 Shop2 的售价为 111 美元。 商品 2 在 Shop1 的售价为 90 美元,在 Shop2 的售价为 85 美元。 Shop1 的运费:如果总订单 Shop2 的运费:如果总订单 如果我在 Shop1 购买商品 1 和商品 2,总成本为 100 美元 + 90 美元 + 0 美元 = 190 美元。 如果我在 Shop2 购买商品 1 和商品 2,总成本为 111 美元 + 85 美元 + 0 美元 = 196 美元。 如果我在 Shop1 购买商品 1,在 Shop2 购买商品 2,总成本为 $100 + $10 + $85 + $0 = 195.如果我在 Shop1 订购商品 1 和商品 2,我将获得最低价格:190 美元
问题
我需要一些提示,哪些算法可以帮助我解决大约 100 件商品和大约 20 家商店的此类优化问题。
我已经查看了apache-math 及其optimization package,但我不知道要寻找什么算法。
Here 是一个后续问题。
【问题讨论】:
我错过了什么,或者如果您在 Shop1 购买两者,最低价格是 190 美元吗? 哎呀,你是对的。我玩过这些数字并把一些东西弄混了。我会纠正这个。 您需要最好的解决方案,还是只需要一个好的解决方案? 最好的会很棒,好的就足够了。 运费是否像您的示例中那样简单,即始终为“x if total order 【参考方案1】:在该软件包中的所有算法中,没有一个算法在离散解空间中运行(即,没有一个表示您不能在商店 1 中购买一半商品,在商店 2 中购买一半商品的约束)。
您可能会尝试从一个好的初步猜测开始递归地遍历解决方案(例如,不考虑运输成本的最佳解决方案),并在您当前的解决方案无法比目前最好的解决方案更好时尽早回溯。这是 O(S^I),但如果商店提供不同的价格,它可能不会那么糟糕。不过,它会产生最佳解决方案。
您可以尝试一种迭代方法,从某个解决方案开始,查看相邻的解决方案(仅来自不同商店的一件商品),从中汲取精华,然后重复此过程,直到解决方案不再发生变化。不过,这种方法可能会陷入局部最优,因此它通常是随机的,无论是在起始位置,还是通过以一定概率(参见模拟退火)进行低于最佳邻居的解决方案。
或者如果你真的想深入研究文献,http://en.wikipedia.org/wiki/Combinatorial_optimization 是一个很好的起点。
【讨论】:
所以你认为我应该看看commons.apache.org/math/api-2.1/org/apache/commons/math/… 吗?还是有其他的起点? 糟糕,我将线性规划误读为整数规划。不,那没有用。我已经编辑了一些建议。【参考方案2】:虽然您可以基于 Apache Simplex 求解器来实现您的解决方案,但您必须在其上构建大量代码才能让它完成您想做的事情。
一种更快的方法是使用现成的约束满足包来支持优化的整数域。有许多可用的开源软件包,每个软件包的功能都略有不同。引起我注意的是Cream。这是纯粹用 Java 实现的,具有非常简洁的 API,基于多种算法(分支定界、禁忌、模拟退火等)。它有一些不错的功能,例如超时搜索、并行本地搜索等。
还有一些您可能想研究的其他软件包,但我不太了解:
-
JCL
jOpt
【讨论】:
感谢这些提示。我听从了你的建议,看了看奶油。我还没有解决我的问题,所以接下来会有一些其他问题......【参考方案3】:对我来说,这听起来有点像 0/1 背包问题。
本质上,您可以将问题建模为决策树(其中每个级别决定从哪里购买产品并扩展到不同的供应商)。然后就可以追踪最优解了。
可能需要根据您的情况进行一些调整(考虑到运费等),但这是一个开始寻找的好地方。
Some information courtesy of Wikipedia
编辑
我应该补充一点,在这种情况下,这并不是一个真正的 0/1 问题(即接受或放弃),而是一个 0-n 问题(即您有 n 个供应商选择,或者您可以离开它)。
【讨论】:
或者你可以离开它......?那么理想的解决方案就是什么都不买,对吧? @meriton 嗯,是的,这可能是我的解释中的一个缺陷,具体取决于您如何制定问题/定义最佳解决方案。您可能会决定自己有预算,因此您希望在预算范围内获得最佳的购买组合 - 在这种情况下,您需要选择不购买任何东西。【参考方案4】:为了记录,可以运行带有约束的整数编程,因此使用 0/1(即二进制变量)来指示是否要在给定商店购买给定产品,并带有约束:对二进制变量求和商店(针对固定产品)
【讨论】:
以上是关于如何以最低的价格优化购物车?的主要内容,如果未能解决你的问题,请参考以下文章
作业二:优化购物车:用户入口:1.将商品的信息存到文件中;2.将已经购买的商品余额记录存到文件中。商家入口:1.可以添加商品;2.可以修改商品的价格