【问题标题】:Multiple Constraint Knapsack Problem多重约束背包问题
【发布时间】:2010-12-22 02:32:48
【问题描述】:

如果有多个约束(例如,同时有体积限制和重量限制,其中每个物品的体积和重量不相关),我们得到多重约束背包问题,多维背包问题,或 m 维背包问题。

如何以最优化的方式对此进行编码?好吧,人们可以开发一种强力递归解决方案。可能是分支和绑定的。但在大多数情况下,它基本上是指数级的,直到您进行某种记忆或使用动态编程,如果做得不好,这又会占用大量内存。

我面临的问题是这样的

我有我的背包功能 KnapSack(Capacity, Value, i) 代替普通的 KnapSack ( Capacity , i ) 因为我对这两个都有上限。有人可以指导我吗?或提供合适的资源来解决这些问题,以相当大的n

或者这个 NP 是完整的吗?

谢谢

【问题讨论】:

  • 我假设您需要一个精确的解决方案。是这样的,对吧?
  • 是的!我需要最优解

标签: algorithm recursion knapsack-problem


【解决方案1】:

具有多个约束的背包是一个包装问题。阅读。 http://en.wikipedia.org/wiki/Packing_problem

【讨论】:

  • 这是一个一般性的阅读..对我帮助很大..因为大多数讨论的案例都是几何问题并且解释太小了
【解决方案2】:

作为一个很好的例子可以解决以下问题:

给定一个具有正权重和 N 个顶点的无向图 G。

你从有一笔 M 钱开始。为了通过顶点 i,您必须支付 S[i] 钱。如果你没有足够的钱——你不能通过那个顶点。求出从顶点 1 到顶点 N 的最短路径,尊重上述条件;或声明这样的路径不存在。如果存在多个具有相同长度的路径,则输出最便宜的路径。限制:1

伪代码:

Set states(i,j) as unvisited for all (i,j)
Set Min[i][j] to Infinity for all (i,j)

Min[0][M]=0

While(TRUE)

Among all unvisited states(i,j) find the one for which Min[i][j]
is the smallest. Let this state found be (k,l).

If there wasn't found any state (k,l) for which Min[k][l] is
less than Infinity - exit While loop.

Mark state(k,l) as visited

For All Neighbors p of Vertex k.
   If (l-S[p]>=0 AND
    Min[p][l-S[p]]>Min[k][l]+Dist[k][p])
      Then Min[p][l-S[p]]=Min[k][l]+Dist[k][p]
   i.e.
If for state(i,j) there are enough money left for
going to vertex p (l-S[p] represents the money that
will remain after passing to vertex p), and the
shortest path found for state(p,l-S[p]) is bigger
than [the shortest path found for
state(k,l)] + [distance from vertex k to vertex p)],
then set the shortest path for state(i,j) to be equal
to this sum.
End For

End While

Find the smallest number among Min[N-1][j] (for all j, 0<=j<=M);
if there are more than one such states, then take the one with greater
j. If there are no states(N-1,j) with value less than Infinity - then
such a path doesn't exist.

【讨论】:

  • 您的回答与问题有关吗?我不明白。如果不相关,那么您最终是使用立方体样式动态算法还是其他方式?
【解决方案3】:

合并约束。看http://www.diku.dk/~pisinger/95-1.pdf 第 1.3.1 章称为合并约束。

一个例子是说你有
变量 , 约束 1 , 约束 2
1 , 43 , 66
2 , 65 , 54
3 , 34 , 49
4 , 99 , 32
5 , 2 , 88

将第一个约束乘以某个大数,然后将其添加到第二个约束。

所以你有
变量,合并约束
1 , 430066
2、650054
3 , 340049
4、990032
5、20088

从那里做任何你想用一个约束做的算法。想到这个变量可以容纳多少位数的主要限制器。

【讨论】:

  • 考虑以下一组物品:一件重量为 [1,51] := 100051 你的容量为 [2,50] := 200050 的单件物品。一个正常的一维背包问题将认为该项目非常适合 200050 > 100051 并将返回 1 个项目的整个集合作为最佳选择。您需要修改算法,使其分解权重,并单独检查组件。编辑:我现在意识到我的问题可能只发生在问题的优化变体中,而不是“精确包装”
  • 理论上这种方法非常有趣。但是,当使用求解器求解转换后的问题时,对于小型实例已经出现数值问题。
【解决方案4】:

正如你所说的 vol 和 weight 都是正数,试着利用 weight 总是减少的事实:

knap[position][vol][t]

现在t=0wt 为正时,t=1wt 为负时。

【讨论】:

  • 您的回答没有描述解决 OPs 问题的算法。
【解决方案5】:

有一些类似启发式的贪婪算法,可以计算每个项目的“效率”,运行速度很快并产生近似解。

您可以使用分支定界算法。您可以使用类似启发式的贪心算法获得初始下限,该下限可用于初始化现有解决方案。您可以通过一次考虑 m 个约束中的每一个(放松问题中的其他约束)来计算各种子问题的上限,然后使用这些界限中的最低者作为原始问题的上限。这种技术是由于施。但是,如果没有特定的约束倾向于主导解决方案,或者如果来自类似启发式的贪婪算法的初始解决方案不接近最优解,那么这种技术可能不会很好地工作。

有更好更现代的算法更难实现,请参阅 J Puchinger 的“多维背包问题”论文!

【讨论】:

    猜你喜欢
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2017-03-22
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多