计算机调度算法 - 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
我们使用一个布尔二叉树(如下图)的方式,去对该问题进行遍历。这个方法同样适合许多类似情况问题。
从根节点开始,如果我们装第一个物品,我们走左边的线路x1=1;如果不装,我们走右变得线路x1=0 后面的都是一样的
(我不在这里多阐述文字了,因为对于一些没有基础的人,过多的文字叙述会使他们迷失方向)
直入主题,如何解决:
首先,我们计算 wj / pj 们也就是说,我们可以知道每一个物品其“单位价格”。我们按照每个物品单位价格递减的顺序,向包里填充物品。
按照这样子的方法,我们相当于把包的重量占满了,并且这个包一定乘了最贵重的物品。但实际上,我们的物品不能被分割后放进背包,比如一个完好无损的电视可能很值钱,但是你把它掰开两半,那谁还会要。
我们考虑1:我们通过物品单位价格递减的顺序装进包里,这时理想状态下,包里应该是装了重量为13的物品,,装的物品应该是物品2、5、1,以及2/3个物品4。 那么,我们在包外面的物品的价格综合是4.67。
上面所计算的东西,是我们在下面的算法二叉树中需要的 “下界”。 也就是说,我们实际最多只能背这么多价值的物品,也就是不能剩下价值比这个更小的物品了。 如下图所示:
我们再考虑2:我们继续按照物品单位价格递减的顺序,找到,我们最差也能装多少值钱的东西。很简单,我们按照实际情况,把单位价格最高的前几个装进袋子即可。即,我们将物品2、5、1装进袋子,我们保证这3个物品可以不被切割的装进袋子里(注意,如此装这并不是最优解,因为后面可能还有各种物品可以往这里装)。此时,在袋子外面剩下的物品的价值,我们至少可以保证肯定在6和6以下。如下图所示:
到目前为止,我们得到了两个关键数字,6和4.67 这分别是下面要遍历的二叉树的上界和下界。也就是说,在树中,我们只考虑在背包外存放的物品价值大于等于4.67和小于等于6的节点。当我们找到一个在这个范围内的整数节点时,我们得到一个解。直到遍历结束,我们对比一个最优解。 注意,在遍历过程中,下界这个值会更新。
对于下面图的解释(因为是课堂笔记,有些符号我要定义)
LB:下界
UB:上界
S:已经被放进包里面的物品
N:被取消放进包里面的资格的物品
A:还没有放进包里面的物品,并且没有被取消资格。
关于具体的遍历过程请看下图(如不清楚,可点击下载看):
就先写这么多,明天还要上课,这东西写了我1个多小时呢,学这个才花了20分钟。。我太无私了!
如果不懂,请联系我,或者去wiki
http://fr.wikipedia.org/wiki/Problème_du_sac_à_dos
目前为止,法语网站的讲解最全,但是不如我这个好理解哈!
- 计算机调度算法 - NP-Hard问题 的 “背包问题” 的简单总结
- NP问题与NP-hard的关系
- NP-hard NP问题
- P、NP、NPC和NP-hard问题的理解
- P、NP、NPC和NP-hard问题的理解
- P、NP、NPC和NP-hard问题的理解
- P、NP、NP-Hard、NPC问题之间的关系
- P NP NPC NP-hard问题的区别
- P,NP,NPC,NP-hard问题的概念
- 一个问题P-hard以及NP-hard的解释
- P问题、NP问题、NPC问题、NP-Hard问题的概念、区别
- Quora上关于P, NP, NP-complete, and NP-hard问题的解答
- NP-Hard问题分类
- NP-hard问题
- NP-hard问题
- NP-Hard问题浅谈
- P,NP,NP-C,NP-hard问题
- P, NP, NP-complete, NP hard问题
- java内的正则表达式通用类
- c# QQ2010 界面控件集更新
- c#做的仿 QQ2010 聊天程序源代码
- QQ客户端源代码发布
- Delphi 中如何发送一个窗体上的按钮,按下消息
- 计算机调度算法 - NP-Hard问题 的 “背包问题” 的简单总结
- ASP-kingCMS-v5.1 LTS使用(二)模板的制作
- C++ primer 读书笔记系列——(7)关联容器
- IE6的margin的设置
- NS2一些安装和使用的问题
- ZZ Vim的指令整理
- Silverlight实例教程 - Validation数据验证基础属性和事件
- Symbian中文显示问题
- Response.Write后css失效问题的解决