多约束背包问题

时间:2009-12-01 17:12:20

标签: algorithm recursion knapsack-problem

如果存在多个约束(例如,体积限制和重量限制,每个项目的体积和重量无关),我们会得到多重约束的背包问题,多维背包问题,或m维背包问题。

如何以最优化的方式对其进行编码?那么,人们可以开发一种强力递归解决方案。可能是分支和绑定..但基本上它是指数的大部分时间,直到你做某种记忆或使用动态编程,如果做得不好再次需要大量的内存。

我面临的问题是这个

我有背包功能 KnapSack(容量,价值,i)代替普通 KnapSack(Capacity,i)因为我对这两者都有上限。任何人都可以指导我吗?或提供合适的资源来解决相当大的n

的这些问题

或NP是否完整?

由于

5 个答案:

答案 0 :(得分:7)

合并约束。看看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,6554 3,340049
4,990032
5,200888

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

答案 1 :(得分:3)

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

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

你从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.

答案 2 :(得分:2)

有多个约束的背包是一个打包问题。读起来。 http://en.wikipedia.org/wiki/Packing_problem

答案 3 :(得分:0)

贪婪之类的启发式方法可以计算出每个项目的“效率”,可以快速运行并产生近似的解决方案。

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

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

答案 4 :(得分:-2)

正如你所说,体积和体重都是正数,试着使用体重总是减少的事实:

knap[position][vol][t]

t=0为肯定时wtt=1wt时为var startingItem = 3; $(document).ready(function() { $('.carousel_data .carousel_item').each(function(){ $('#carousel').append( $(this).find('.image').html() ); }); createCarousel(); showCaption(); }); function createCarousel(){ $('div#carousel').roundabout({ startingChild: window.startingItem, childSelector: 'img', tilt: -0, minOpacity:-1, minScale: .5, duration: 1200, clickToFocus: true, clickToFocusCallback: showCaption }); createCustomButtons(); } function createCustomButtons(){ $('.nextItem').click(function(){ hideCaption(); $('div#carousel').roundabout('animateToNextChild', showCaption); }); $('.prevItem').click(function(){ hideCaption(); $('div#carousel').roundabout('animateToPreviousChild', showCaption); }); $('div#carousel img').click(function(){ hideCaption(); }); } function hideCaption(){ $('#captions').animate({'opacity':0}, 250); } function showCaption(){ var childInFocus = $('div#carousel').data('roundabout').childInFocus var setCaption = $('.carousel_data .carousel_item .caption:eq('+childInFocus+')').html(); $('#captions').html(setCaption); var newHeight = $('#captions').height()+'px'; $('.caption_container').animate({'height':newHeight}, 500, function(){ $('#captions').animate({'opacity':1}, 250); }); }