- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7 2
8 3
16 4
f(1, 4) = 15 + 28 + 44 = 87 最优 = f(1, 3) + g(1, 4) w不变
n=4 时:前3堆的第2种情况。 4级 3级 2级 1级 13 序号 1
44 28 15 7
2
= f(2, 3) + g(1, 3) + g(1, 4)
若f(1,3)越小,则f(1,4)就越小。
F(2)
F(1)
F(1)
F(0)
F(1)
F(0)
树中可以看出,计算F(5)时要重复计算F(2)、F(3) 显然降低时间效率。此即交叠子问题,F(5) 分为 两个子问题 F(4) 和 F(3),F(4)包含了F(3) 。
★ 单起点最短路径问题 (区别于完全最短路径问题)
概念:给定一个连通图(有向或者无向),求给定起始顶点到结束顶点 的最短路径,此即单起点(单源)最短路径问题。完全最短路径 问题要求找到从每个顶点到其他所有顶点之间的最短路径。 分段:顶点集分为k个不相交子集Vd ,1≤d≤k , k≥2 , 级内顶点不相邻。 任一条边 (u,v),u∈Vd,v∈Vd+m,m≥1。令 |V1| = |Vk| = 1。 分级 k = 1 V1 从源点到收 点依次编号 16 源 1 点 k=2 V2 19 2 k=3 V3 12 10 5 k=4 V4 k=5 V5 计算方向
★ 数塔
问题:设有一三角形数塔如图。求一条自塔顶到塔底的路径,该路径上 节点值之和最大。 5级 91 13 46 7
78 4级
67 3级 11
73
8 65 26
18
2级 1级
40
27 14
39 15
32 8
6 12
7
13
24
11
分段:每一级台阶自然划分为一个阶段,成为多阶段决策的优化问题。 无法分段的问题,不能用动态规划法求解。 求解:动态规划法求解。自底向上计算,各实例计算满足最优性原则,
求解算法
动态的含义:求解算法施加的状态是变化的。 当前状态只与其直接前趋状态有关,对其直接 前趋状态施加求解算法,成为当前状态。 最优性原则 (Principle of Optimality): 一个最优问题任何实例的最优解,是由该实例
......
求解算法
阶段 2
求解算法
的子实例的最优解组成的。对特定问题该原则
因3堆有2种归并法,所以一共5小类归并法。前1堆第1种情况:
4级 3级 2级 1级 13 序号 1
44 31 15 7
2
f(1, 4) = 15 + 31 + 44 = 90 = f(2, 4) + g(1, 4) w不变 = f(2, 3) + g(2, 4) + g(1, 4)
若f(2,4)越小,则f(1,4)就越小。 8
第5章 动态规划
★ 动态规划概述 ★ 数塔 ★ 最小代价子母树 ★ 非优化问题实例 ★ 单起点最短路径问题 ★最优二叉查找树 ★ 01背包问题
★ 动态规划概述
动态规划(Dynamic Programming),在20 世纪50年代由美国数学家 Richard Bellman(理查德 .贝尔曼)发明,作为多阶段决策过程最优化
如实例18的子实例为12和7,max(12+6, 7+6)=18。
数塔:动态规划法与穷举法的时间效率比较
输入规模:为便于分析,选择数塔层数k (k>0); 基本操作:节点值求和运算;增长函数:加法次数与 k 的关系; 效率类别:没有最佳、最差情况;(都要从塔顶计算到塔底) 增长率(次数): 各层节点数升序:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ... 节点总数 n 升序:1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... 层数k(顶为1):1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ... 路径总数 t 升序: 2, 4, 8, 16, 32, ..., t = 2k-1, k>1 1. 穷举法:T(k) = (k-1) 2k-1,k>1 (指数级) 本例k=5,每条路径上5个节点做4次加法,共64次加法。 2. 动态规划法:(层节点数 = 层数) 自底向上计算,k层加法总数为k-1层节点数×2,有效率计算式: T(k) = 2×(k-1+...+3+2+1) = k(k-1), k>1 (平方级) 本例加法总数 2×(4+3+2+1) = 20次,比64次少很多。
★ 非最优化问题实例
求中国象棋马的路径
6 5 4 3 2 1 6
可用回溯法和递归法求解, 但递归法效率 很低,栈空间占用很大。
5 4 3 2 1 6 5 4 3 2 1
问题:在m×n棋盘上,求马从P点跳到Q点的所有路径。
Q
P P
Q
P
Q
Q
P P
Q
P
Q
★ 最小代价子母树
问题:n (n>1) 堆沙子,重量向量 W = (w1,...wn)。要将它们归并为1堆, 归并规则:每次只能将相邻2堆归并为1堆,经过 n-1 次归并后, 最终归并为一堆。总代价为归并过程中新产生的沙堆质量之和, 这个代价最小的归并树称为最小代价子母树。 分析:属于最优化问题,目标为总代价最小。 分段:显然需要 n-1 次归并才能将 n 堆归并为 1 堆。自然地可以将每次 归并划分为一个阶段,成为多阶段决策问题,尝试动态规划法。 求解:(此处采用自底向上的分析,找规律较简洁) 当 n=2 时:仅一种归并法即2合1。 13 7 8 16 21 4 18 当 n=3 时:有2种归并方法,第一种归并方法如图,前1堆后2堆。 3级
不一定满足(罕见),有必要检查其适用性。 子实例组成父实例,父实例分解为子实例。
阶段 1
对于某些多阶段决策问题,问题本身没有最优化要求,比如后面要讲到的
求中国象棋马从棋盘上一点移动到另一点的全部路径问题,又如计算裴波
那契序列的动态规划算法,它们属于非最优化问题的动态规划法。 动态规划法的特点: 1. 分阶段(级)决策。对最优化问题,用最优性原则设计。 2. 一般采用自顶向下分析(规模减小),自底向上计算(规模增加)。 计算过程是一级一级(一阶段一阶段)地向前推进,直到最终状态。
w[k ]
k i
j
f[i,j] ← 0(1 ≤ i ≤ n,1 ≤ j ≤ n); for i ←2 to n do //i表示层次,也是归并沙子的堆数,在上图中,表示行号 for j ←1 to n-i+1 do //表示列号 begin min ←f[i-1,j]; for k ←i-1 step -1 untill 1 do if min>f[k,j]+f[i-k,j+k] then //min{ f(1,n-1),f(1,2)+f(3,n),f(1,3)+f(4,n)… min ← f[k,j]+f[i-k,j+k] ; f[i,j] ←g[j,i+j-1]+min; end; return(f[n,1]); endp;
★设D(i,j)是从顶点集Vi中的点j到t的一条最小耗费路线,cost(i,j) 是这条路线的耗费.由后向前推算,得:
cost(i,j)=min{C(j,l)+cost(i+1,l)} C(j,l):表示顶点集Vi中的顶点j到顶点集Vi+1中的点l的耗费 cost(i+1,l):表示顶点集Vi+1中的点l到目标点t的耗费
递推求解中的交叠子问题 (非最优化问题)
实例:计算裴波那契数的递归版本。 动态规划法:自底向上计算 递推式: 依次计算F(0), F(1), F(2), ..., F(n) n > 1 ,F(n) = F(n-1) + F(n-2) 一次,各次计算结果存入数组, 最后一个元素就是F(n)。用一个 F(0) = 0, F(1) = 1 例如,F(5) 计算过程用 递归树 表示: 单循环即可简单实现。 F(5) F(4) F(3) F(2) F(1) F(3) F(2) F(1) F(0)
复杂度很高、计算量很大的问题(如求最佳子集的组合问题),要找出
一切可能解,所耗费的计算时间可能是不可以接受的。因此,人们为了 降低求解问题的难度,把求解过程分为一系列阶段,各个阶段依次按照 最优性原则计算,最后阶段计算得到最优解。包括 分段、求解 两大步。 注:不能段化的问题不能用动态规划法求解。
阶段 n
的一种通用方法,对最优化问题提出最优性原则,从而创建最优化问题
的一种新算法设计技术——动态规划,它是一种重要的应用数学工具。 至少在计算机科学圈子里,人们不仅用它解决特定类型的最优化问题, 而最终把它作为一种通用的算法设计技术,即包括某些非最优化问题。 多阶段决策过程最优化: 现实世界里有许多问题属于这种情况:它有很多解,应用要求最优解。 穷举法通过找出全部解,再从中选出最优解。这种方法对于那些计算
3
16
4
n=4 时:前1堆的第2种情况。
4级 44 31 24 7 2 8 3 f(1, 4) = 24 + 31 + 44 = 99 = f(2, 4) + g(1, 4) w不变 = f(3, 4) + g(2, 4) + g(1, 4) 若f(2,4)越小,则f(1,4)就越小。 16 4 f(1, 4) = 20 + 24 + 44 = 88
28 15
7 2 8 3
f(i, j) —— 从第 i 堆到第 j 堆的代价和。 g(i, j) —— 从第 i 堆到第 j 堆的重量和。 f(1, 3) = 15 + 28 = 43 (最优结果) = f(2, 3) + g(1, 3)