寻找产品和商店的最佳组合以最小化成本的算法

时间:2010-01-08 05:01:54

标签: ruby algorithm math combinations

你好Stackoverflow人,

我经营一个网站,发现其用户是最便宜的购买书籍的地方。这对于一本书来说很容易,但对于多本书来说,在一家商店购买一本书和从另一家商店购买另一本书有时会更便宜。

目前我找到了销售用户列表中所有书籍的最便宜的商店,但我希望拥有一个更智能的系统。这里有更多信息:

  • 一本书的价格是不变的。
  • 运费的价格可能会有所不同,具体取决于图书的数量或图书的总价值。
  • 每个商店对象都可以购买一系列书籍并返回运费。
  • 通常情况下,并非每家商店都出售每本书。

不确定链接到我的网站是否很酷,但它列在我的用户个人资料中。

我希望能找到最便宜的商店和书籍组合。

我担心它需要蛮力的方法 - 并且有35家商店,对于少量的书籍来说,组合的数量将是巨大的。我觉得组合的数量是(#shops)^(#books) - 但不是100%

问题是,我应该采用什么方法?这个问题是否适合众所周知的问题?如果需要蛮力,在Ruby中这样做的好方法是什么?我可以优先考虑商店首先尝试吗?

6 个答案:

答案 0 :(得分:6)

不幸的是,这是组合优化问题的一个例子,没有任何简单的解决方案。一般来说,你确实需要蛮力方法。然而!我怀疑这个问题有一些特殊的结构会有所帮助。例如,当您更改书籍组合时,运费不会随意变化 - 当您添加书籍时,它可能会呈线性增加和/或饱和。

这是我的建议,然后:

  1. 离线,估算每家商店的送货政策,这样,根据书籍(可能还有它们的重量),您可以估算运费
  2. 引用其网站的费用。
  3. 对于每家商店,计算每本书的费用(如果有的话)。
  4. 离线,浏览每个商店或一组商店,并使用您的离线运送政策估算总费用。
  5. 选择最便宜的商店(或商店)。如果有多个相似,请计算确切的答案。
  6. 这应该让你开始,并且不会让你完全搜索。

答案 1 :(得分:2)

这是典型地称为“分配问题”的变体。经典AP有一些标准解决方案,包括Munkres(又名“匈牙利”)算法和JVC(Junker Volgenant Castanon iirc)算法。

基本思想是计算每个作业的成本(即每个商店购买每本书的成本),然后选择最小化总成本的作业集。我相信这可以在多项式时间内完成。

每个零售商的运输成本取决于总订单这一事实使事情变得相当棘手。您可以使用最初不考虑运费的混合方法,一旦确定了一些有前景的分配,就可以使用汇总订单。

祝你好运,听起来像个有趣的问题!

答案 2 :(得分:2)

尝试使用动态编程方法。 你可以在这里阅读:http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg 您也可以在维基百科或“算法导论”一书(Cormen)中阅读。

这是一个非常标准的问题。

答案 3 :(得分:1)

Brute Force几乎总是可以被一个好的启发式替代,也就是说,一种已知执行不理想而且“足够好”的算法。

虽然我不是100%肯定,但我猜它与Knapsack problem有关(因为我们现在都应该哈哈......)NP-complete。

现在没什么好提供的,但祝你好运!

答案 4 :(得分:0)

这可能是一个问题吗? http://en.wikipedia.org/wiki/Linear_programming

答案 5 :(得分:0)

使用动态规划的无界背包就是你的答案。