计算机调度算法 - NP-Hard问题 的 “背包问题” 的简单总结

来源:互联网 发布:租房软件那个好 编辑:程序博客网 时间:2024/05/18 00:22

 

 

 

欢迎访问未来最具有影响力的的算法搜索网站的雏形 http://www.comiscience.com/Algorithm

这也是我为这个网站写的自己的第一个课堂算法总结。

 

背包问题是一个NP-Hard问题(这个问题的概念我不叙述,请wiki或者参考其他书籍),也就是说我们不能用一个算法肯定能求出他的最优解,所以,我们必定会提出一个 启发性算法,尽量用一个算法可以较优化的解决该问题,也就是说较快速的、较准缺的给问题一个尽量好的答案

 

问题:

我们有n种物品,物品j的重量为pj,价格为wj。我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为P

我们如何做,才能携带不超过P的重量的物品,且使携带物品的价格总和最大?

 

 

我们先给出已有数据:


     1     2     3    4     5

p   5     2     7    4     3    该行为5个物品对应的重量

w   7    3     4     2     6   该行为5个物品对应的价格

 

P = 13  也就是说背包的重量总和不得超过13

 

 

我们使用一个布尔二叉树(如下图)的方式,去对该问题进行遍历。这个方法同样适合许多类似情况问题。

Arbre d'exploration binaire从根节点开始,如果我们装第一个物品,我们走左边的线路x1=1;如果不装,我们走右变得线路x1=0       后面的都是一样的

 

(我不在这里多阐述文字了,因为对于一些没有基础的人,过多的文字叙述会使他们迷失方向)

 

直入主题,如何解决:


 

首先,我们计算 wp们也就是说,我们可以知道每一个物品其“单位价格”。我们按照每个物品单位价格递减的顺序,向包里填充物品。

按照这样子的方法,我们相当于把包的重量占满了,并且这个包一定乘了最贵重的物品。但实际上,我们的物品不能被分割后放进背包,比如一个完好无损的电视可能很值钱,但是你把它掰开两半,那谁还会要。

 

我们考虑1:我们通过物品单位价格递减的顺序装进包里,这时理想状态下,包里应该是装了重量为13的物品,,装的物品应该是物品2、5、1,以及2/3个物品4。 那么,我们在包外面的物品的价格综合是4.67。

上面所计算的东西,是我们在下面的算法二叉树中需要的 “下界”。 也就是说,我们实际最多只能背这么多价值的物品,也就是不能剩下价值比这个更小的物品了。 如下图所示:

LB

 

我们再考虑2:我们继续按照物品单位价格递减的顺序,找到,我们最差也能装多少值钱的东西。很简单,我们按照实际情况,把单位价格最高的前几个装进袋子即可。即,我们将物品2、5、1装进袋子,我们保证这3个物品可以不被切割的装进袋子里(注意,如此装这并不是最优解,因为后面可能还有各种物品可以往这里装)。此时,在袋子外面剩下的物品的价值,我们至少可以保证肯定在6和6以下。如下图所示:

UB

 

到目前为止,我们得到了两个关键数字,6和4.67 这分别是下面要遍历的二叉树的上界和下界。也就是说,在树中,我们只考虑在背包外存放的物品价值大于等于4.67和小于等于6的节点。当我们找到一个在这个范围内的整数节点时,我们得到一个解。直到遍历结束,我们对比一个最优解。 注意,在遍历过程中,下界这个值会更新。

 

对于下面图的解释(因为是课堂笔记,有些符号我要定义)

LB:下界

UB:上界

S:已经被放进包里面的物品

N:被取消放进包里面的资格的物品

A:还没有放进包里面的物品,并且没有被取消资格。

 

关于具体的遍历过程请看下图(如不清楚,可点击下载看):

 

tree

 

 

就先写这么多,明天还要上课,这东西写了我1个多小时呢,学这个才花了20分钟。。我太无私了!

如果不懂,请联系我,或者去wiki

http://fr.wikipedia.org/wiki/Problème_du_sac_à_dos

 

目前为止,法语网站的讲解最全,但是不如我这个好理解哈!