Bin-Packing难题

Bin Packing难题是一个优化问题,其中不同尺寸的物品必须包装到有限数量的箱子或容器中,每个箱子都有固定的给定容量,以最小化使用的箱子数量。

当箱的数量限制为1并且每个项目都以体积和值为特征时,最大化可以放入箱子的项目的价值的问题称为 背包问题

变体#

  • 在线包装 (online bin packing)

    不同体积的物品应该按顺序到达,决策者必须决定是选择并包装当前观察到的物品,还是不处理, 每个决定都不能撤销。

  • 离线包装 (offline bin packing)

    相应的,离线包装就是已知所有物品,那么做决策的时候就可以重新排列物品。

  • 背包问题 (knapsack problem)

    背包问题就是一个特定的离线包装问题,其中每个物品都有一个体积和价值,同时包的数量限制为1。

背包问题算法#

给定一组项目,每个项目都有一个权重和一个值,确定要包含在集合中的每个项目的数量,以便总重量小于或等于给定的限制,并且总值尽可能大。

0-1 背包问题#

限制每类项目的副本数为1或者0

定义子问题 P(i, W) 为:在前 i 个物品中挑选总重量不超过 W 的物品,每种物品至多只能挑选1个,使得总价值最大;这时的最优值记作 m(i, W) ,其中 1 <= i <= n1 <= W <= C

考虑第 i 个物品,只有两种选择:

  • 选:背包容量减小,问题变为 P(i-1, W-W[i])
  • 不选:背包容量不变,问题变为 P(i-1, W)

同时考虑临界情况,只有一个物品的情况下,最大价值就是该物品的价值,当然也可能该物品直接超过了背包的最大容量。但这是确定的,因此我们是可以按照这个规则反向推导出 m(i, W) 的。

分析到这里,它已经满足动态规划的条件:

  1. 问题可以分解为有限子问题
  2. 能够归纳出状态转移方程:m(i, W) = max{m(i-1, W), m(i-1, W-W[i]) + V[i]}
  3. 临界条件:i = 0, m(i, W) = 0; W = 0. m(i, W) = 0

总结下:

         | 0, i = 0
         | 0, W = 0
m(i, W) =| 
         | m(i-1, W), W[i] > W
         | max{m(i-1, W), m(i-1, W-W[i]) + V[i]}, otherwire

无界背包问题#

限制每类项目的副本数为最大为非负整数C。

有界背包问题#

每类项目的副本数量没有限制。

参考#