当前位置:文档之家› 第七章 动态规划法1(算法分析与设计课件)

第七章 动态规划法1(算法分析与设计课件)

第七章 动态规划法
计算机科学与技术学院
通过应用范例学习动态规划算法设计策略。
(1)矩阵连乘问题; (2)最长公共子序列; (3)0/1背包问题; (4)流水作业调度;
第七章 动态规划法
是另一种求解最优化问题的算法设计策略 适合求解的问题(多阶段决策问题):
问题的活动过程可以分成若干个阶段,每个阶段包含一 个或多个状态,在任一阶段的决策仅依赖与该阶段的状 态,与该阶段之前的过程如何达到这种状态的方式无关, 这类问题的解决是多阶段的决策过程.
}
7.3 矩阵连乘
穷举法 动态规划法
分析最优解的结构 递归定义最优解的值 自底向上计算最优解的值
对于1≤i≤j≤n不同的有序对(i,j)对应于不同的子问题。因此,不同
子 在递问归题计的算个时数,最许多多只有子问题n2被 重n 复 计(n算2)。多次。这也是该问题可用动
m[4][m5][=3]m[4[4]+][m4][+5]m[5[5]+][5P]3+P5PP46P=5P56*=1100**2200=*12050=05}000
m=
0 15750 7875 9735 11875 15125
0 2625 4375 712510500
0 750 2500 5375 0 1000 3500
所以,不能在某个阶段直接做出决策
再看一例:
最优子结构:
如果ABEG是A 到G的最短路径,那 么ABE也是A到E的 最短路径。
第七章 动态规划法
例2.数塔问题:设有一个三角形数塔,求一自塔顶到塔底的 路径,且该路径上结点的值的和最大.择12方向还是选择 15方向,取决于分别从12和15出发的两 条子路径上的最大路径值,设他们分别
当i=j时,A[i:j]=Ai,因此,m[i,i]=0,i=1,2,…,n 当i<j时,假设在Ak 和Ak+1之间分开,则
m[i, j] m[i, k] m[k 1, j] pi pk1 p j1
这里 Ai 的维数为 pi1 pi
m[i,
j]

mikin j{m[i,
例7-5:求A0A1A2A3A4A5的积,其中A0:30*35, A1:35*
15 ,A2:15*5 ,A3:5*10 ,A4:10*20 ,A5:20*25
解:P:
m[i, j] m[i, k] m[k 1, j] pi pk1 p j1
30 35 15 5 10 20 25
计算顺序:
令m数组的主对角线上的元素m[i][i]=0, s[i][j]=i(0<=i<n) 然后从主对角线上一条次对角线开始,依次计算m的n-2条对角线元素,
并在s[i][j]中记录使得下式取得最小值的k.
m[i, j] m[i, k] m[k 1, j] pi pk1 p j1
态规划算法求解的又一显著特征。
用动态规划算法解此问题,可依据其递归式以自底向上的方式进行 计算。在计算过程中,保存已解决的子问题答案。每个子问题只计 算一次,而在后面需要时只要简单查一下,从而避免大量的重复计 算,最终得到多项式时间的算法。
7.4 最长公共子序列
算法总体思想
如果能够保存已解决的子问题的答案,而在需要时再 找出已求得的答案,就可以避免大量重复计算,从而 得到多项式时间算法。
=n T(n)
n/2
n/2
n/2
n/2
T(n/4) T(n/4)
T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4)
7.3 矩阵连乘
问题描述
给定n个矩阵 {A0 , A1,..., An1} ,其中 Ai 与 Ai1 是可乘的, 其中 i 0,1,2,...,n 1.考察这n个矩阵的连乘积 A0 A1... An1 矩阵连乘问题:是确定计算矩阵连乘积的计算次序,使得 依此次序计算矩阵连乘积,需要的数乘次数最少。
T(n)
=n
T(n/2)
T(n/2)
T(n/2)
T(n/2)
算法总体思想
但是经分解得到的子问题往往不是互相独立的。不同子 问题的数目常常只有多项式量级。在用分治法求解时, 有些子问题被重复计算了许多次。
T(n)
=
n
n/2
n/2
n/2
n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4)
for (int i = 1; i <= n - r+1; i++) { int j=i+r-1; m[i][j] = m[i+1][j]+ p[i-1]*p[i]*p[j]; s[i][j] = i;
算法matrixChain的主要计算量 取决于算法中对r,i和k的3重循 环。循环体内的计算量为O(1), 而3重循环的总次数为O(n3)。因 此算法的计算时间上界为O(n3)。 算法所占用的空间显然为O(n2)。
动态规划基本步骤
找出最优解的性质,并刻划其结构特征。 递归地定义最优值。 以自底向上的方式计算出最优值。 根据计算最优值时得到的信息,构造最
优解。
7.3 矩阵连乘
相关知识回顾
矩阵相乘的运算量(数乘次数) 设有矩阵Amxn 和Bnxp,则A和B是可乘的,乘积矩阵 Dmxp=Amxn XBnxp. 它的元素
0 5000
0
0 00 2 22 11 2 22
22 22 s=
334 44 5
用动态规划法求最优解
void MatrixChain(int *p,int n,int **m,int **s)
算法复杂度分析:
{
for (int i = 1; i <= n; i++) m[i][i] = 0; for (int r = 2; r <= n; r++)
int MatrixChain::LookupChain(int i, int j)
{
if (m[i][j]>0) return m[i][j];//子问题已经求解,直接引用
if(i==j) return 0;
//单一矩阵无须计算
int u=LookupChain(i+1, j)+p[i]*p[i+1]*p[j+1];//按式(7-9)求最小值
s[i][j]=i;
for (int k=i+1; k<j; k++)
{ int t=LookupChain(i, k)+LookupChain(k+1, j)+p[i]*p[k+1]*p[j+1];
if (t<u)
{ u=t; s[i][j]=k; }
}
m[i][j]=u; return u;
//保存并返回子最优解值
m…[..1][3]=mmmin[[21{]][[mm23]][[==11]]mm[[12[[]21]++]][[mm12]][[++23]]mm[[33[[]23]++]][[PP3211]]PP++23PPPP4412==PP2373PP55340*==+1315355*5**5*15=15*52*1*60512==0527=65}2206525 m[3][5]=mmin[3{]m[4[]3=]m[3[]3+]m[3[]4+]m[5[]4+]P[43P]+4PP63=P54P*51=05**2100=*12000=01000
最优化原理: 一个最优策略具有这样的性质:不论过去状态和决策如 何,对前面的决策所形成的状态而言,其余决策都必须 相对于初始决策所产生的状态构成一个最优决策序列.
第七章 动态规划法
如:修大学课程 对于一个多阶段过程问题,上述最优决策序列是否存
在,依赖于该问题的解是否具有最优子结构性质,而能否 采用动态规划法,还要看该问题的子问题是否具有重叠性质. 基本要素 最优子结构特性:
矩阵连乘的计算次序可以用完全加括号的形式来表示
7.3 矩阵连乘
相关知识回顾
矩阵相乘的运算量(数乘次数) 矩阵连乘的运算量与矩阵的计算次序有关 完全加括号的递归定义
单个矩阵是完全加括号的 矩阵连乘积A是完全加括号的,则A可表示为两个完全加 括号的矩阵连乘积B和C的乘积并加括号,即A=(BC)
A[i:j]的计算量=A[i:k]的计算量+A[k+1:j]的计算量 +A[i:k]和A[k+1:j]相乘的计算量。 分析最优解的结构
特征:计算A[i:j]的最优次序所包含的计算矩阵子链 A[i:k]和A[k+1:j]的次序也是最优的。
7.3 矩阵连乘
递归定义最优解的值
设计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数 m[i,j],则原问题的最优值为m[1,n] 。
10 6 8
为x和y,
若x>y 9->12 最大路径为9+x
2 18 9 5
否则,9->15 最大路径为9+y
若9->12,则使用类似方法讨论10和6
19 7 10 4 16
当讨论进行到倒数第2层时,直接进行 选择
求解(自底向上)
算法总体思想
动态规划算法与分治法类似,其基本思想也是将待求解 问题分解成若干个子问题
P(n)


n 1
P(k
相关主题