【问题标题】:A packing algorithm ... kind of一种打包算法……有点像
【发布时间】:2010-09-24 06:36:13
【问题描述】:

给定一组项目,每个项目都有valuecost确定以最低成本达到最小值所需的项目的最佳算法是什么? 例如:

Item: Value -> Cost
-------------------
A     20   -> 11
B     7    -> 5
C     1    -> 2

MinValue = 30
naive solution: A + B + C + C + C. Value: 30, Cost 22
best option: A + B + B.            Value: 34, Cost 21

请注意,最后的总体价值:成本比无关紧要(A + A 会为您提供最佳性价比,但A + B + B 是一个更便宜的选择,它达到了最小值)。

【问题讨论】:

    标签: algorithm np-hard computation


    【解决方案1】:

    这是背包问题。 (也就是说,这个问题的决策版本与背包问题的决策版本相同,尽管背包问题的优化版本通常有不同的表述。)它是 NP 难的(这意味着没有已知的算法是“大小”中的多项式——位数——在输入中)。但是,如果您的数字很小(例如输入中的最大“值”;成本无关紧要),那么有一个简单的动态规划解决方案。

    让 best[v] 是获得(精确)v 值的最小成本。然后您可以通过(将所有 best[v] 初始化为无穷大和)计算所有 v 的值 best[]:

    best[0] = 0
    best[v] = min_(items i){cost[i] + best[v-value[i]]}
    

    然后查看 best[v] 的值,直到您想要的最小值加上最大值;其中最小的将给您成本。

    如果您想要实际项目(而不仅仅是最低成本),您可以维护一些额外的数据,或者只是查看 best[] 数组并从中推断。

    【讨论】:

    • 你的动态规划解决方案很好,但它似乎暗示:1)每个元素可以被多次采用; 2)每个值 v 都可以准确地达到,但通常情况并非如此......我错过了什么吗?
    • 每个元素可以被多次采用是隐含在问题的例子中的:-) 虽然不是所有的值都可以准确地达到,如果一个值 v 可以准确地达到,那么它可以对某些项目 i 使用 v-value[i] 来达到。 [否则,根据定义,best[v] 为 ∞:empty min 为 ∞。]
    • “问题的示例中隐含了每个元素可以被多次采用”。你是对的,先生! :D 我觉得自己像莎士比亚的猴子,就像 S.O. 上的其他人一样。放吧。还是去睡觉吧……
    【解决方案2】:

    这个问题被称为整数线性规划。这是NP难的。 但是,对于像您的示例这样的小问题,快速编写几行代码来简单地强制所有购买选择的低组合是微不足道的。

    NP-hard 并不意味着不可能或什至昂贵,它意味着您的问题在解决更大规模的问题时会变得非常慢。在您只有三个项目的情况下,您可以在几微秒内解决这个问题。

    对于一般来说最好的算法是什么的确切问题。有完整的教科书。一个好的开始是good old Wikipedia.

    【讨论】:

    • 对这个使用通用整数线性规划方法是矫枉过正,恕我直言,特别是当 (1) 在简单的情况下,有非常简单的蛮力或动态规划解决方案,正如您所观察到的 (2)在困难的情况下,有专门的背包算法将优于一般的 ILP。 (另外,你已经链接到关于线性规划的文章——LP 通常不给出整数解。)
    【解决方案3】:

    编辑此答案因事实不正确而被删节。遵循此处的建议只会对您造成伤害。

    这实际上不是背包问题,因为它假设您装的物品不能超过某个容器的空间。在你的情况下,你想找到最便宜的组合来填满空间,考虑到可能发生溢出的事实。

    我的解决方案,我不知道是最优的,但应该非常接近,将计算每个项目的成本效益比,找到具有最高成本效益的项目并用这个项目填充结构,直到没有空间再放一件物品了。然后我会测试看看是否有任何其他可用项目的组合可以以低于最便宜项目之一的成本填充可用槽,然后如果存在这样的解决方案,请使用该组合,否则再使用一个最便宜的商品。

    Amenddum 这实际上也可能是 NP 完全的,但我还不确定。无论如何,出于所有实际目的,这种变化应该比天真的解决方案快得多。

    【讨论】:

    • 这个问题在平凡上等同于背包(决策)问题——“在不超过成本21的情况下,至少可以达到30的价值吗?”解决这个问题也解决了背包问题,这就是为什么这个问题是 NP 完全的(我们有一个多项式时间多一从背包到这个问题)。我在回答中说了这一切。 :P 你贪婪的解决方案并不总是给出正确的答案:与背包相同的反例也会杀死这个。
    猜你喜欢
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多