解决01背包问题算法比较PPT幻灯片课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
pn y>=wn f(n,y)=
0 0<=y<wn
和
max{f(i+1,y),f(i+1,y-wi)+pi} y>=wi
f(i,y)=
f(i+1,y)
0<=y<wi
6
动态规划求解0-1背包问题
利用最优序列由最优子序列构成的结论, 可得到f的递归式。f(1,c)是初始时背 包问题的最优解。可使用一式通过递归或 迭代来求解f(1,c)。从f(n,*)开始 迭式,f(n,*)由一式得出,然后由二 式递归计算f(1,*)(i=n-1,n-2,…,2), 最后由二式得出f(1,c)。
11
贪婪算法解决0/1背包问题
这种修改后的贪婪启发法称为k阶优化方法 (k-optimal)。也就是,若从答案中取出k件 物品,并放入另外k件,获得结果在最佳值的 50%以内;当k=2时,则在33.33%以内等等, 这种启发式方法的执行时间随k的增大而增加, 需要测试的子集数目为O( )n,k 每一个子集 所需时间为O(n),因此当k>0时总的时间开 销为O( )。nk1
7
贪婪算法解决0/1背包问题
从剩余的物品中,选出可以装入背包的价 值最大的物品,利用这种规则,价值最大 的物品首先被装入(假设有足够容量), 然后是下一个价值最大的物品,如此继续 下去。这种策略不能保证得到最优解。
8
贪婪算法解决0/1背包问题
另一种方案是重量贪婪策略:从剩下的物 品中选择可以装入背包的重量最小的物品。 在一般情况下不一定能得到最优解。
14
回溯法解决0/1背包问题
三个对象的背包问题的解空间
1
A
0
B
10
D
10
E
10
C
10
F
10
G
10
H
I
J
K
L
M
N
Q
15
回溯法解决0/1背包问题
运用回溯法解题通常包含以下三个步骤: a. 针对所给问题,定义问题的解空间; b. 确定易于搜索的解空间结构; c. 以深度优先的方式搜索解空间,并
且在搜索过程中用剪枝函数避免无效搜索;
16
回溯法解决0/1背包问题
考察如下背包问题:n=3,w=[20,15, 15],p=[40,25,25]且c=30.
17
回溯法解决0/1背包问题
#include<iostream> using namespace std;
class Knap { friend int Knapsack(int p[],int w[],int c,int n ); public: void print() {
4
动态规划求解0-1背包问题
在第一次决策之后,剩下的问题便是考虑 背包容量为r时的决策。不管x1是0或者1, [x2,…,xn]必须第一次决策之后的一个 最优方案,如果不是,则会有一个更好的 方案[y2,…,yn],因而[x1,y2,…yn]是 一个更好的方案。
5
动态规划求解0-1背包问题
最优决策序列由最优决策子序列组成。假设f(i, y)表示剩余容量y,剩余物品为i,i+1,…,n时 的最优解的值,即:
9
贪婪算法解决0/1背包问题
还可以利用另一方案,价值密度pi/wi贪婪 算法,这种选择准则为:从剩余物品种选 择可以装入包的价值密度最大的物品,这 种策略也不能保证得到最优解。
10
贪婪算法解决0/1背包问题
可以建立贪婪启发式方法来提供解,使解 的结果与最优解的值之wk.baidu.com在最优解的x% (x<100)之内。首先将最多k件物品放 入背包,如果这k件物品重量大于c,则放 弃它。否则剩余的容量用来考虑将剩余物 品按价值密度pi/wi递减的顺序装入。通过 考虑由启发法产生的解法种最多为k件物 品的所有可能的子集来得到最优解。
12
贪婪算法解决0/1背包问题
600种随机测试的统计结果
偏差百分比 k 0 1% 5% 10% 25% 0 239 390 528 583 600 1 360 527 598 600 2 483 581 600
13
回溯法解决0/1背包问题
回溯法是一个既带有系统性又带有跳跃性的的搜索算法。 它在包含问题的所有解的解空间树中,按照深度优先的 策略,从根结点出发搜索解空间树。算法搜索至解空间 树的任一结点时,总是先判断该结点是否肯定不包含问 题的解。如果肯定不包含,则跳过对以该结点为根的子 树的系统搜索,逐层向其祖先结点回溯。否则,进入该 子树,继续按深度优先的策略进行搜索。回溯法在用来 求问题的所有解时,要回溯到根,且根结点的所有子树 都已被搜索遍才结束。而回溯法在用来求问题的任一解 时,只要搜索到问题的一个解就可以结束。这种以深度 优先的方式系统地搜索问题的解的算法称为回溯法,它 适用于解一些组合数较大的问题。
The compare of the algorithms for solving 0/1 knapsack problems
解决0/1背包问题算法比较
1
0/1背包问题概述
在0/1背包问题中,需对容量为c的背包进行装 载。从n个物品中选取装入背包的物品,每件物品
i的重量为wi, 价值为pi。对于可行的背包装载,背包
中的物品的总重量不能超过背包的容量,最佳装载
是指所装入的物品价值最高,即
n
pixi
取得最大值。
i 1
约束条件为
c和 。 n
wixi
xi 0,11 i n
i 1
在这个表达式中,需求出xi的值。xi=1表示物
品i装入背包中,xi=0表示物品i不装入背包。
2
动态规划求解0-1背包问题
3
动态规划求解0-1背包问题
在0/1背包问题中需要决定x1……xn的值。 假设按i=1,2,…,n的次序来确定xi的值。如果
置x1=0,则问题转变为相对于其余物品,背包 容量仍为c的背包问题。若置x1=1,问题就变 为关于最大背包容量为
c-w1的问题。现设r {c,c-w1}为剩余的背包容
量。
动态规划原理:动态规划是一种将问题实例分 解为更小的、相似的子问题,并存储子问题的 解而避免计算重复的子问题,以解决最优化问 题的算法策略。
动态规划法所针对的问题有一个显著的特征, 即它所对应的子问题树中的子问题呈现大量的 重复。动态规划法的关键就在于,对于重复出 现的子问题,只在第一次遇到时加以求解,并 把答案保存起来,让以后再遇到时直接引用, 不必重新求解。