【问题标题】:Dual knapsack algorithm双背包算法
【发布时间】:2016-12-23 00:43:14
【问题描述】:

假设您有一个存放易碎货物(例如蔬菜或水果)的仓库,您只能取出一个装有蔬菜的容器一次。如果你移动它们两次,它们会腐烂得太快,再也卖不掉了。

因此,如果您为每个容器的蔬菜赋予价值(取决于它们还能保持新鲜的时间),您希望首先出售价值最低的。而当客户询问某个重量时,您希望提供良好的服务,并给出准确的重量(因此您需要从仓库中取出一些额外的重量,并在出售后将多余的部分扔掉)。

我不知道这个问题是否有名字,但我认为这是背包问题的对偶形式。在背包问题中,您希望最大化价值并将重量限制在最大范围内。在这里,您希望最小化该值并将权重限制到最小。

您可以很容易地看到这种二元性,将仓库视为背包,并将仓库的最大值和限制重量优化为当前重量减去客户要求的最大值。

但是,许多解决背包问题的实用算法都依赖于假设您可以携带的重量与您可以选择的总重量相比较小。 F.e. dynamic programming 0/1 解决方案依赖于循环直到达到最大权重,FPTAS 解决方案保证在总权重的 (1-e) 倍内是正确的(但一个巨大值的小因素仍然可以使差别很大)。

所以当想要的重量很大时,两者都有问题。

因此,我想知道是否有人已经研究过“双背包问题”(如果可以找到一些关于它的文献),或者是否对我遗漏的现有算法进行了一些简单的修改。

【问题讨论】:

    标签: algorithm knapsack-problem


    【解决方案1】:

    解决背包问题的常用伪多项式 DP 算法询问,对于每个 i 和 w,“如果我最多使用 w 容量,我可以从前 i 个项目中获得的最大总价值是多少?”

    您可以改为询问,对于每个 i 和 w,“如果我至少使用 w 容量,我可以从前 i 个项目中获得的最小总价值是多少?”逻辑几乎相同,只是比较的方向是相反的,并且您需要一个特殊值来记录即使取前 i 项中的所有 i 项也无法达到 w 容量的可能性——无穷大适用于此,因为您想要当与 min() 比较时,该值将与任何有限值相比丢失。

    【讨论】:

    • 谢谢,我想我现在明白了,但我必须先实施它才能确定。
    • 实现后发现需要将负重或零权重的sack的值定义为零(反向比较可以查询负重的值)。当您可以在 0 个元素之间进行选择时,初始化 sack 确实必须产生一个无穷大的值(或大于其余元素)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多