两种算法解决0-1背包问题的比较

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
量 W V j=0 1 2 3 4 5
wi
i=0 0 0 0 0 0 0
1 w1=2 v1=12
1 0 0 12 12 12 12
2 w2=1 v2=10 3 w3=3 v3=20
W=5 2 3
0 10 12 22 22 22 0 10 12 22 30 32
4 w4=2 v4=15
❖ 动态规划法求解01背包 分段:
动态规划法策略是将问题分成多个阶段,逐段推进计算, 后继实例解由直接前趋子实例解计算得到。对于01背包问题, 可利用减一技术和最优性原则,按物品数量和背包承重量分 段。 思路:根据最优子结构性质,根据前i-1件物品中最优子集的总 价值,计算前 i 件物品中最优子集的总价值,直到i=n为止。 核心技术:需要构建二维状态矩阵DP,来保存每一步的解,供 下一步计算使用。
阶段 n
求解算法
......
动态的含义:求解算法施加的状态是变化的。 当前状态只与其直接前趋状态有关,对其直接 前趋状态施加求解算法,成为当前状态。 最优性原则 (Principle of Optimality):
求解算法 一个最优问题任何实例的最优解,是由该实例
阶段 2
求解算法
阶段 1
的子实例的最优解组成的。对特定问题该原则 不一定满足(罕见),有必要检查其适用性。 子实例组成父实例,父实例分解为子实例。
计算过程是一级一级(一阶段一阶段)地向前推进,直到最终状态。
★ 动态规划法解01背包
❖ 问题描述 已知:n 个重量为weights[w1,...,wn]、价值为values[v1,...,vn ] 的物品和一个承重量W的背包。 要求:找出最有价值子集,且能装入背包中(不超重)。
物品重量、背包承重量、物品数量都是整数。
4 0 10 15 25 30 37
接下来,找出最优解的物品集合。
❖ 01背包的动态规划算法(带记忆功能)
算法递推式:
DP[i, j] = max { DP[i-1, j], vi+DP[i-1, j-wi] } 交叠子问题:
直接用递推式设计递归算法,产生交叠子问题,重复计算公共子问题, 算法效率低下(指数级甚至更差)。 避免交叠子问题的递归算法: 递归过程(内层为更小子问题)是自顶向下的(规模减小),缺点是 将产生交叠子问题。动态规划算法采用自底向上计算(规模渐大), 可避免交叠子问题的重复计算缺点。但是,自底向上计算的缺点是: 对某些问题,可能有一部分子问题的求解是不必要的,比如某个序列 后项由前面紧邻的2个奇数项构成,前面偶数项的计算就是非必要的。 问1:如何设计无交叠子问题的递归算法?(两种策略的结合) 问2:递归算法会对非必要子问题进行求解吗?理由是什么? 答1:保存已计算的子问题结果,后续计算需要时查表,不再计算。 答2:不会。计算结果需要递归式中的各项,否则计算不出来。
n
wi xi W
i 1
n
V (n,W ) max vi xi i 1
物品数
承重量
★ 动态规划法解01背包
❖ 问题描述 01背包的最优化描述: 求满足约束方程的前提下,使得目标函数达到最大的解向量: X = (x1 , ... , xn) 。 ( xi = 0:i 物品不装入, xi = 1:i 物品装入) 例如:X=(0,1,0,0,1) 穷举法:n个物品全部组合(幂集,子集数=2n),从中找出最 有价值子集。 贪心算法不一定能找到最优解。
对于某些多阶段决策问题,问题本身没有最优化要求,比如后面要讲到的
求中国象棋马从棋盘上一点移动到另一点的全部路径问题,又如计算裴波
那契序列的动态规划算法,它们属于非最优化问题的动态规划法。
动态规划法的特点:
1. 分阶段(级)决策。对最优化问题,用最优性原则设计。 2. 一般采用自顶向下分析(规模减小),自底向上计算(规模增加)。
DP[i, j] —— 前 i 个物品中能够装入承重量为 j 的背 包的最大总价值。 s.t. 0 ≤ i ≤ n ,0 ≤ j ≤ W
DP[i, j] = max {DP[i-1, j-wi] + vi , DP[i-1, j] } i在最优子集中 i不在最优子集中
DP[i-1, j] :不将第i件物品装入背包。
DP j=0 ....
j - wi
....
j
.... j=W
..
..
..
i=0 0 ...
0
... 0 ... 0
... ...
i-1 0 i0
DP(i-1, j-wi)
DP(i-1, j) DP[i, j]
... ...
i=n 0
V(n, W)
目标
❖ 动态规划法解01背包问题算例
例:01背包数据如下表,求:能够放入背包的最有价值的物品集合。
动态规划 VS 粒子群
★ 动态规划概述 ★ 动态规划法解01背包 ★ 粒子群算法解01背包 ★ 两种算法的比较
★ 动态规划概述
动态规划(Dynamic Programming),在20 世纪50年代由美国数学家 Richard Bellman(理查德 .贝尔曼)发明,作为多阶段决策过程最优化 的一种通用方法,对最优化问题提出最优性原则,从而创建最优化问题 的一种新算法设计技术——动态规划,它是一种重要的应用数学工具。 至少在计算机科学圈子里,人们不仅用它解决特定类型的最优化问题, 而最终把它作为一种通用的算法设计技术,即包括某些非最优化问题。 多阶段决策过程最优化: 现实世界里有许多问题属于这种情况:它有很多解,应用要求最优解。 穷举法通过找出全部解,再从中选出最优解。这种方法对于那些计算 复杂度很高、计算量很大的问题(如求最佳子集的组合问题),要找出 一切可能解,所耗费的计算时间可能是不可以接受的。因此,人们为了 降低求解问题的难度,把求解过程分为一系列阶段,各个阶段依次按照 最优性原则计算,最后阶段计算得到最优解。包括 分段、求解 两大步。 注:不能段化的问题不能用动态规划法求解。
DP[i-1, j-wi] + vi :将第i件物品装入背包(此时要
确保第i件物品可以装入背包,否则)。
❖ 动态规划法解01背包问题的算法表:
前 i 个物品中最优子集的总价值(动态规划函数): DP[0, j] = 0(0个物品),DP[i, 0] = 0(承重量0) DP[i, j] = DP(i-1, j) 第 i 个物品不能装入, j < wi (超重) DP[i, j] = max { vi+DP[i-1, j-wi ] , DP[i-1, j] } j > wi (不超重) i在最优子集中 i不在最优子集中
相关文档
最新文档