你好Stackoverflow人,
我经营一个网站,发现其用户是最便宜的购买书籍的地方。这对于一本书来说很容易,但对于多本书来说,在一家商店购买一本书和从另一家商店购买另一本书有时会更便宜。
目前我找到了销售用户列表中所有书籍的最便宜的商店,但我希望拥有一个更智能的系统。这里有更多信息:
不确定链接到我的网站是否很酷,但它列在我的用户个人资料中。
我希望能找到最便宜的商店和书籍组合。
我担心它需要蛮力的方法 - 并且有35家商店,对于少量的书籍来说,组合的数量将是巨大的。我觉得组合的数量是(#shops)^(#books) - 但不是100%
问题是,我应该采用什么方法?这个问题是否适合众所周知的问题?如果需要蛮力,在Ruby中这样做的好方法是什么?我可以优先考虑商店首先尝试吗?
答案 0 :(得分: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)
答案 5 :(得分:0)
使用动态规划的无界背包就是你的答案。