第三章动态规划法_new

合集下载

动态规划.pdf

动态规划.pdf

第三章:动态规划3.1 动态规划的基本概念一、动态决策问题:决策过程具有阶段性和时序性(与时间有关)的决策问题。

即决策过程可划分为明显的阶段。

二、什么叫动态规划(D.P.–Dynamic Program):多阶段决策问题最优化的一种方法。

广泛应用于工业技术、生产管理、企业管理、经济、军事等领域。

三、动态规划(D.P.)的起源:1951年,(美)数学家R.Bellman等提出最优化原理,从而建立动态规划,名著《动态规划》于1957年出版。

四、动态决策问题分类:1、按数据给出的形式分为:•离散型动态决策问题。

•连续型动态决策问题。

2、按决策过程演变的性质分为:•确定型动态决策问题。

•随机型动态决策问题。

五1、阶段(stage)n :作出决策的若干轮次。

n = 1、2、3、4、5。

2、状态(state)S n :每一阶段的出发位置。

构成状态集,记为S nS 1={A},S 2={B 1,B 2,B 3},S 3={C 1,C 2,C 3},S 4={D 1,D 2,D 3},S 5={E 1,E 2}。

阶段的起点。

3、决策(decision)X n :从一个阶段某状态演变到下一个阶段某状态的选择。

构成决策集,记为D n (S n )。

阶段的终点。

D 1(S 1)={X 1(A)}={B 1,B 2,B 3}= S 2,D 2(S 2)={X 2(B 1),X 2(B 2),X 2(B 3)}={C 1,C 2,C 3}=S 3,D 3(S 3)={X 3(C 1),X 3(C 2),X 3(C 3)}={D 1,D 2,D 3}=S 4,D 4(S 4)={X 4(D 1),X 4(D 2),X 4(D 3)}={E 1,E 2}=S 5D 5(S 5)={X 5(E 1),X 5(E 2)}={F;F}={F}。

4、策略(policy):全过程中各个阶段的决策Xn 组成的有序总体{Xn }。

如 A àB2àC1àD1àE2àF5、子策略(sub-policy):剩下的n个阶段构成n子过程,相应的决策系列叫n子策略。

《算法设计与分析》第3章 动态规划法

《算法设计与分析》第3章 动态规划法

最优解的递推关系 定义m[i:j],表示矩阵连乘A[i:j]所需的最少计算 量 则有: i j 0 m[i ][ j ] i j minj{m[i ][ k ] m[k 1][ j ] pi 1 pk p j } i k
假设:N个矩阵的维数依序放在一维数组p中, 其中Ai的维数记为Pi-1×Pi
A=A1×A2×A3×…×An
A=(A1×A2×…×Ak) × (Ak+1×Ak+2×…×An)
B
C
1.2 穷举法
穷举法:列举出所有可能的计算次序,并计算出 每一种计算次序相应需要的数乘次数,从中找出 一种数乘次数最少的计算次序。
穷举法复杂度分析: 对于n个矩阵的连乘积,设其不同的计算次序有P(n)种。 由于每种加括号方式都可以分解为两个子连乘的加括号问题: (A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下:
【程序】矩阵连乘的 穷举法实现 int MatrixChain::LookupChain(int i, int j) { if(i==j) return 0; int u=LookupChain(i+1,j)+p[i-1]*p[i]*p[j]; //k=i s[i][j]=i; //记录最优分解位置 for ( int k=i+1;k<j; k++ ) { //遍历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; //记录最优分解位置 } } int MatrixChain::LookupChain() return u; { } return LookupChain(1,n);

《动态规划法》课件

《动态规划法》课件

动态规划法的发展趋势
混合整数动态规划
将整数变量引入动态规划中,解决更复杂的问题 ,如组合优化问题。
动态规划与机器学习结合
利用机器学习算法辅助动态规划求解,提高算法 的效率和准确性。
ABCD
多目标动态规划
考虑多个相互冲突的目标,寻求最优解的权衡。
分布式动态规划
将问题分解为多个子问题,在分布式系统中并行 求解,提高大规模问题的处理能力。
排班问题
总结词
动态规划法可以用于解决排班问题,使得员工的工作计 划安排最优。
详细描述
排班问题是一个多约束优化问题,涉及到员工的工作时 间、班次、休息时间等多个因素。通过构建状态转移方 程和优先级规则,动态规划法能够求解出满足所有约束 条件的最佳排班方案。
生产调度问题
总结词
动态规划法可以应用于生产调度问题,优化生产流程 和资源分配。
策略
一系列决策的集合,表示从初始状态到终止状态的整个求解过程。
转移方程与最优解
转移方程
描述状态转移的数学方程,表示从一个状态转移到另一个状 态的关系。
最优解
在所有可能的策略中,能够使目标函数达到最优值的策略。
03
动态规划法的求解步骤
问题的分解
总结词
将复杂问题分解为若干个子问题
详细描述
动态规划法首先将原问题分解为若干个子问题,每个子问题都是原问题的简化版本。通过解决这些子 问题,可以逐步推导出原问题的解决方案。
02
动态规划法的基本概念
阶段与状态
01
阶段
将问题的求解过程划分为若干个 相互联系的阶段,以便按一定的 次序进行求解。
02
03
状态
状态转移
在某一时刻,问题所处的情况或 状态。

动态规划法

动态规划法

动态规划法动态规划法(Dynamic Programming)是一种常用的算法思想,主要用于解决具有重叠子问题性质和最优子结构性质的问题。

动态规划法通过把问题分解为更小的子问题,并将子问题的解存储起来,以避免重复计算,从而提高了算法的效率。

动态规划法有两个核心概念:状态和状态转移方程。

在动态规划过程中,我们需要定义状态,即问题的子问题解,以及状态之间的关系,即状态转移方程。

动态规划法的一般步骤如下:1. 定义问题的子问题:将问题划分为更小的子问题,并明确子问题的解是什么。

2. 定义状态:将问题的子问题解抽象为状态,即用一个变量或者数组表示子问题的解。

3. 定义状态转移方程:根据子问题的关系,定义状态之间的转移方程,即如何根据已知的子问题解计算出更大的问题的解。

4. 缓存子问题解:为了避免重复计算,我们需要将已经计算过的子问题解存储起来,以便后续使用。

5. 递推计算:通过状态转移方程和缓存的子问题解,逐步计算出更大的问题的解,直到计算出最终的问题解。

动态规划法的关键在于找到正确的状态转移方程和合理的存储子问题解的方式。

有些问题的状态转移方程比较容易找到,比如斐波那契数列,每个数都是前两个数的和;而有些问题的状态转移方程可能比较复杂,需要通过观察问题的特点和具体分析来确定。

动态规划法的时间复杂度通常为O(n),其中n 表示问题规模。

由于利用了子问题的解,避免了重复计算,因此动态规划法相对于暴力求解法能够大大提高算法的效率。

但是,动态规划法的空间复杂度通常较高,需要存储大量的子问题解,因此在实际应用中需要权衡时间和空间的消耗。

总的来说,动态规划法是一种非常灵活且强大的算法思想,能够解决许多复杂的问题,特别适用于具有重叠子问题性质和最优子结构性质的问题。

通过正确定义状态和状态转移方程,并结合缓存子问题解和递推计算,我们可以高效地求解这类问题,提高算法的效率。

动态规划的基本方法ppt课件

动态规划的基本方法ppt课件

状态具有无后效性的多阶段决策过程的状态转移方程如下
s2 T1 ( s1 , u1 ) s3 T2 ( s2 , u2 )
动态规划中能 处理的状态转移
sk 1 Tk ( sk , uk )
方程的形式。
精选ppt课件
11
5、策略:
是一个按顺序排列的决策组成的集合。在实际问题中,可供选择的 策略有一定的范围,称为允许策略集合。从允许策略集合中找出达 到最优效果的策略称为最优策略。
精选ppt课件
20
3
C1
2 B1 3
1
A
1 2
3
C2
3
D
4 B2 1
4
C3
第二阶段(B →C): B 到C 有六条路线。
d( B1,C1 43;1
f2 ( B1 ) = min d( B1,C2 ) + f1 (C2 ) = min 3+3
d( B1,C3 ) + f1 (C3 )
间的自然特征来进行的,但要便于问题转化为多阶段决策。
年、
月、
一个数、
2、状态:
路段
一组数、 一个向量
表示每个阶段开始所处的自然状况或客观条件。通常一个阶段有若
干个状态,描述过程状态的变量称为状态变量。
状态变量的取值有一定的允许集合或范围,此集合称为状态允许集合。
精选ppt课件
8
3、决策:
表示当过程处于某一阶段的某个状态时,可以作出不同的决定, 从而确定下一阶段的状态,这种决定称为决策。 描述决策的变量,称为决策变量。决策变量是状态变量的函数。可 用一个数、一组数或一向量(多维情形)来描述。 在实际问题中决策变量的取值往往在某一范围之内,此范围称为允 许决策集合。

算法设计与分析耿国华第三章

算法设计与分析耿国华第三章
算法
设计与分析
第三章 动态规划
主编 耿国华
Chapter
3
本章内容
3.1 动态规划基础
• 3.1.1 • 3.1.2 • 3.1.3 • 3.1.4
动态规划的基本思想
动态规划的基本要素 动态规划的基本步骤
动态规划示例——组合数问题
3.2 线性动态规划——合唱队形问题 3.3 区域动态规划——矩阵连乘问题
3.4 背包动态规划——0-1背包问题
3.5 树形动态规划——最优二叉搜索树问题 3.6 本章小结
Chapter
3
引言
本章给出的动态规划技术可使用较少的时间求解此类问题。
与分治法不同,在求解过程中动态规划方法采用自底向上的递 推方式,将原问题分解为互不独立的小规模子问题,根据子问
题的相关性从已知的各个局部解中选出能产生最佳解的部分,
• •
1. 问题描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学 出列,而不改变其他同学的位臵,使得剩下的K位同学排
成合唱队形。
Chapter
3
3.2线性动态规划-----合唱队形问题 问题描述
• 1.问题描述

合唱队形要求:设K位同学从左到右依次编号为1,2,..., K,他们的身高分别为T1,T2,...,TK,则他们的身高满足 T1<...<Ti,且Ti >Ti+1>...>TK(1<=i<=K)。当给定队员人数N和 每个学生的身高T[i]时,计算需要多少学生出列,可以得到最长 的合唱队形。如下图所示:

i=1
i=2
步骤2:建立递归关系
i=3
j=1
j=2 j=3 j=4 j=5

动态规划算法的实施步骤

动态规划算法的实施步骤

动态规划算法的实施步骤1. 算法介绍动态规划是一种常用的求解最优化问题的方法,它适用于求解具有重叠子问题特性的问题。

动态规划算法通过将问题拆分成小问题,并保存这些小问题的解来减少重复计算,从而提高求解效率。

2. 实施步骤步骤一:定义问题的状态在动态规划算法中,第一步是定义问题的状态。

问题的状态是指问题的子问题中需要求解的变量或指标。

这些状态一般可以用一个或多个变量来表示。

步骤二:确定状态转移方程确定状态转移方程是动态规划算法的核心步骤。

状态转移方程可以根据问题的特点和定义的状态来确定。

状态转移方程描述了问题的当前状态和下一个状态之间的关系。

步骤三:确定初始状态初始状态是指问题的最小规模的子问题的解,也就是边界条件。

初始状态的确定需要根据具体问题来定义。

步骤四:计算最优解根据定义的状态转移方程和初始状态,可以通过自底向上(bottom-up)或自顶向下(top-down)的方式,计算出问题的最优解。

步骤五:返回最优解最后一步是返回计算得到的最优解。

根据问题的特点和需求,最优解可以是一个值,也可以是一组值。

3. 实施示例为了更好地理解动态规划算法的实施步骤,下面以求解斐波那契数列为例进行说明。

步骤一:定义问题的状态在求解斐波那契数列的问题中,状态可以定义为第n个斐波那契数F(n)。

步骤二:确定状态转移方程斐波那契数列的状态转移方程为F(n) = F(n-1) + F(n-2)。

步骤三:确定初始状态斐波那契数列的初始状态可以定义为F(0) = 0,F(1) = 1。

步骤四:计算最优解根据状态转移方程和初始状态,可以通过自底向上的方式计算斐波那契数列的最优解。

def fibonacci(n):if n ==0:return0elif n ==1:return1else:dp = [0] * (n+1)dp[0] =0dp[1] =1for i in range(2, n+1):dp[i] = dp[i-1] + dp[i-2]return dp[n]步骤五:返回最优解在上述示例中,最优解为fibonacci(n),即第n个斐波那契数。

《高级算法与数据结构》课程思政元素

《高级算法与数据结构》课程思政元素

《高级算法与数据结构》课程思政元素第三章动态规划3.1 动态规划算法的基本原理一、授课内容1.1 动态规划算法的基本思想在现实生活中,有一类问题被定义为最优决策问题,这类问题可能会有许多可行解,每一个解都对应于一个值,我们希望找到具有最优值的那个解,即最优解。

20世纪40年代,Richard Bellman首次使用了动态规划这个术语,用来描述最优决策问题的求解过程。

其核心思想是将最优决策问题按照时间或空间特征分解成若干相互关联的阶段,以便按次序去求每个阶段的解。

各阶段开始时具有客观条件(称之为状态),当各阶段的状态确定以后,就可以做出不同的决定,从而确定下一阶段的状态,这种决定称为决策。

“动态”是指在一定条件下,根据上一阶段的状态和决策来导出本阶段的状态,“规划”是指建立状态转移方程。

最优决策问题的难点在于,各个阶段决策的选取不能任意确定,它既依赖于当前面临的状态,又影响着以后的发展。

1.2 动态规划算法与分治法的区别和联系动态规划算法与(第二章)分治法类似,都是将待求解问题分解为若干个子问题,先求解子问题,再结合这些子问题的解得到原问题的解。

与分治法不同之处在于:(1)适合用动态规划求解的问题经分解得到的子问题往往不是相互独立的(即重叠子问题),在递归模型上采用分治法自顶向下求解时,有些子问题被反复计算。

动态规划算法正是利用重叠子问题的性质,将各阶段子问题的最优值保存在一个表格中,在需要时以常数时间查看结果,这样可以避免大量的重复计算。

对于一些在递归模型上具有指数下界的算法来说,当不同子问题的个数随问题的大小呈多项式增长时,用动态规划的表格式方法来存储重叠子问题的解,可以将指数时间减少为多项式时间,从而有效降低了时间复杂度。

(2)每个阶段的子问题可能会有许多可行解,当问题的最优解包含了其子问题的最优解时(即最优子结构),表格里只存储子问题的最优解就可以了。

利用最优子结构性质,动态规划可以自底向上的从子问题的最优解逐步构造出原问题的最优解,从而有效控制了空间复杂度。

程序设计方法——动态规划法

程序设计方法——动态规划法

思路(续)

显然,根据前面的递推过程求解,需要倒 过来,从P(D),P(E),P(F)出发,先求出第1阶 段的P(B)和P(C),最后得到P(A)。
数据结构

将长满桃子的树用二维数组保存

数组行上存放桃树上一层中每个树枝上桃子数 将节点上桃子数目存放在数组中 只使用数组中对角线及下部分 A:1
y
A1 B2 C9 E6 F5 I6 J4 x
7 D
G2
3 H

将底层到每个点的最长路径P也存放在二维 数组中
数据结构(续)


#define MAXLAYER 3 int peachtree[MAXLAYER][MAXLAYER] = { {1, -1, -1, -1}, {2, 9, -1, -1}, {7, 6, 5, -1}, {2, 3, 6, 4} }; int P[MAXLAYER][MAXLAYER]
1
B:2 C:9
2 7
9 6 5
D:7 E:6 F:5
2
3
6
4
G:2
H:3
I:6
J:4
问题分析



从二维数组最下面一行开始向 上一行沿图中的直线前进,走 到左上角的格子停止。 行走路径上经过的格子中的数 字之和是猴子爬到树顶能拿到 桃子的数目,我们定义为路径 长度。 原问题转化为求所有路径中路 径长度的最大值。
参考程序(续)
//初始化P[x][0] for (i = 0; i < n; i++) { P[i][0] = peachtree[i][0]; } //递推过程P[x][y] = max{P[x][y-1], P[x+1][y-1]}+peachtree[x][y] for (j = 1; j < n; j++) // i是行号,j是列号 { for (i = 0 ; i + j < n; i++) { P[i][j] = maxnum(P[i][j-1], P[i+1][j-1])+peachtree[i][j]; } } cout << P[0][n-1] << endl; return 0; }

动态规划法

动态规划法
的解,从而导致矛盾。
清华大学出版社
算法设计与分析
动态规划法设计算法一般分成三个阶段: (1)分段:将原问题分解为若干个相互重叠的子 问题; (2)分析:分析问题是否满足最优性原理,找出 动态规划函数的递推式; (3)求解:利用递推式自底向上计算,实现动态 规划过程。
❖ 动态规划法利用问题的最优性原理,以自底向 上的方式从子问题的最优解逐步构造出整个问题 的最优解。
d(1, {2})= c12+d(2, {}) d(2, {3})=c23+d(3, {}) d(3, {2})= c32+d(2, {}) d(1, {3})= c13+d(3, {}) d(2, {1})=c21+d(1, {}) d(3, {1})=c31+d(1, {}) 而下式可以直接获得(括号中是该决策引起的状态转移): d(1, {})=c10=5(1→0) d(2, {})=c20=6(2→0) d(3, {})=c30=3(3→0)
清华大学出版社
算法设计与分析
6.2 图问题中的动态规划法
6.2.1 TSP问题 6.2.2 多段图的最短路径问题
清华大学出版社
6.2.1 TSP问题
算法设计与分析
TSP问题是指旅行家要旅行n个城市,要求各个 城市经历且仅经历一次然后回到出发城市,并要求 所走的路程最短。
各个城市间的距离可以用代价矩阵来表示。
∞367 C= 5 ∞ 2 3
6 4∞ 2 3 75∞
带权图的代价矩阵
清华大学出版社
算法设计与分析
证明TSP问题满足最优性原理
设s, s1, s2, …, sp, s是从s出发的一条路径长度最短 的简单回路,假设从s到下一个城市s1已经求出,则 问题转化为求从s1到s的最短路径,显然s1, s2, …, sp, s 一定构成一条从设计与分析

《计算机算法设计与分析》第三章动态规划法

《计算机算法设计与分析》第三章动态规划法
解决复杂问题 动态规划可以将复杂问题分解为简单的子问题, 通过逐步求解子问题来得到原问题的解,使得复 杂问题得以解决。
发展历程及现状
发展历程
动态规划的思想起源于20世纪50年代,由美国数学家Richard Bellman提出。随着计 算机科学的发展,动态规划在算法设计和分析领域得到了广泛应用和深入研究。
第六章
总结与展望
动态规划法在计算机科学中重要性
高效求解最优化问题
动态规划法通过把原问题分解为相对简单的子问题,并保存子问题的解,避免了大量重复计算,从而高效地求解最优化问题。
广泛应用
动态规划法在计算机科学、经济学、生物信息学等领域都有广泛应用,如背包问题、最短路径问题、序列比对问题等。
提供算法设计框架 动态规划法不仅为解决特定问题提供了有效方法,而且为算法设计提供了一个通用框架,有助于理解和设 计更复杂的算法。
现状
目前,动态规划已经成为计算机算法设计和分析领域的重要工具之一。在实际应用 中,许多复杂的问题都可以通过动态规划的方法得到有效的解决。同时,随着计算 机技术的不断发展,动态规划的应用领域也在不断扩展。
第二章
动态规划法基本原理
最优子结构性质
在动态规划法中, 子问题之间是相互 独立的,即一个子 问题的求解不会影 响到其他子问题的 求解。这使得动态 规划法能够避免重 复计算,提高算法 效率。
学习相关算法和技术
学习与动态规划法相关的其他算法 和技术,如贪心算法、分治法等, 以便在实际问题中灵活应用。
关注最新研究进展
关注计算机科学和算法设计领域的 最新研究进展,了解动态规划法的 新发展和应用,保持对新技术的敏 感性和好奇心。
THANKS
感谢观看
基本思想

第三章动态规划法_new精品PPT课件

第三章动态规划法_new精品PPT课件

直接递归算法的时间复杂性随n的指数增长。
算法设计与分析
12
直接递归中有大量重复计算
• 直接递归中有大量重复计算,如A[1: 4]计算中:
1: 4
图中红框标出的
都是重复计算。
1: 2
3: 4
1: 1 2: 4
1:1 2: 2 3: 3 4: 4
1: 3 4: 4
2: 2 3: 4 2: 3 4: 4
• 后一种计算顺序的计算量竟是前者的10倍!
• 所以,求多个矩阵的连乘积时,计算的结合 顺序是十分重要的。
算法设计与分析
7
不同计算顺序的数量
• 设n个矩阵的连乘积有P(n)个不同的计算顺序。
先 由在 此第 可k得个出和关第于kP+(1n个)的矩递阵归之式间:将原矩阵序列 分成两个矩阵子序1 列,k=1,…,n =n-11;再分别 对 号两 ,个 便子 得P(序 到n) 列原= 完序全列n∑k=–11P加的(k括一) P号种(n,完–k最全) 后加n>对 括1结 号果 方加 式括 。
• 最优子结构性质:最优解的子结构也最优的。
算法设计与分析
9
建立递归关系
• 令m[i][j] , 1≤i, j≤n,为计算A[i, j] 的最少数乘 次数,则原问题为m[1][n]。
• 当i = j时,A[i, j]为单一矩阵, m[i][j] = 0;
• 当i<j时,利用最优子结构性质有:
m[i][j]
算法设计与分析
5
矩阵连乘问题
• 给定n个矩阵:A1, A2, …, An,其中Ai与Ai+1是 可乘的。确定一种连乘的顺序,使得矩阵连 乘的计算量为最小。
• 设A和B分别是p×q和q×r的两个矩阵,则乘 积C=AB为p×r的矩阵,计算量为pqr次数乘。

算法设计与分析_第3章_动态规划1

算法设计与分析_第3章_动态规划1
8
引言
分治技术的问题
子问题是相互独立的
Why?
问题:
如果子问题不是相互独立的,分治方法将重复 计算公共子问题,效率很低,甚至在多项式量 级的子问题数目时也可能耗费指数时间
解决方案:动态规划
用表来保存所有已解决子问题的答案 不同算法的填表格式是相同的
9
引言
最优化问题
Why?
可能有多个可行解,每个解对应一个 值,需要找出最优值的解。
MATRIX-MULTIPLY(A, B) 1 if columns[A] ≠ rows[B] 2 then return “error: incompatible dimensions” 3 else for i ← 1 to rows[A] 4 for j ← 1 to columns[B] 5 C[i, j] ← 0 6 for k ← 1 to columns[A] 7 C[i, j]←C[i, j]+A[i, k]·B[k, j] 8 return C
(A1 (A2 (A3 A4))) , (A1 ((A2 A3) A4)) , ((A1 A2) (A3 A4)) , ((A1 (A2 A3)) A4) , (((A1 A2) A3) A4).
15
矩阵连乘问题
采用不同的加括号方式,可导致不同的、 甚至及其富有戏剧性差别的乘法开销
设有四个矩阵A,B,C,D,它们的维数分别 是: A=50×10 B=10×40 C=40×30 D=30×5 总共有五种完全加括号的方式: (A((BC)D)) ——16000 (A(B(CD))) ——10500 ((AB)(CD)) ——36000 (((AB)C)D) ——87500 ((A(BC))D) ——34500
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
i≤k<j
其中矩阵Ai ,1≤i≤来实现。 (该程序请看书的RecurMatrxChain。)
算法设计与分析 10
算法设计与分析
11
直接递归的时间复杂性
• 根据前面的递归式不难得出RecurMatrxChain的 时间复杂性为 T(n) ≥ 1 + ∑(T(k) + T(n–k) + 1)
算法设计与分析 8
分解最优解的结构
• 将矩阵连乘积AiAi+1…Aj记为A[i: j]。 • 若A[1: n] 的一个最优解是在矩阵Ak和Ak+1处 断开的,即A[1: n] = (A[1: k] A[k+1: n]),则 A[1: k]和A[k+1: n]也分别是最优解。 • 事实上,若A[1: k]的一个计算次序所需计算量 更少的话,则用此计算次序替换原来的次序, 则得到A[1: n]一个更少的计算量,这是一个矛 盾。同理A[k+1: n]也是最优解。 • 最优子结构性质:最优解的子结构也最优的。
算法设计与分析 7
不同计算顺序的数量
• 设n个矩阵的连乘积有P(n)个不同的计算顺序。 先在第k个和第k+1个矩阵之间将原矩阵序列 由此可得出关于P(n)的递归式: 分成两个矩阵子序列,k=1,…,n-1;再分别 1 n=1 n–1 P(n) = 对两个子序列完全加括号,最后对结果加括 ∑P(k) P(n–k) n>1 k=1 号,便得到原序列的一种完全加括号方式。 解此递归方程可得P(n) = C(n–1),其中 1 2n C(n) = n+1 = Ω(4n/n3/2) n 所以P(n)随n的增长呈指数增长。因而穷举搜 索法不是有效的算法。
T(n)
n/2
=
n/2
n
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 3 算法设计与分析
算法总体思想
• 如果能够保存已解决的子问题的答案,而在需要时再 找出已求得的答案,就可以避免大量重复计算,从而 得到多项式时间算法。
第三章
动态规划
算法设计与分析 1
算法总体思想
• 动态规划算法与分治法类似,其基本思想也是将待求 解问题分解成若干个子问题
T(n)
=
n
T(n/2)
T(n/2)
T(n/2)
算法设计与分析
T(n/2)
2
算法总体思想
• 但是经分解得到的子问题往往不是互相独立的。不同 子问题的数目常常只有多项式量级。在用分治法求解 时,有些子问题被重复计算了许多次。
2: 2 3: 3
3: 4 4: 4
1: 2 1: 1
3: 3 2: 2
13
算法设计与分析
消除重复的计算
• 要消除重复计算,可以在计算过程中保存已解 决的子问题的答案。这样,每个子问题只计算 一次,而在后面需要时只要简单查一下,从而 避免重复计算。 • 计算方式可依据递归式自底向上地进行。 • 注意到在此问题中,不同的有序对 (i, j)就对应 不同的子问题,因此不同的子问题个数最多只 有Cn2+ n = (n2)个。 • 这样便可以得到多项式时间的算法。
int t = m[i][k] + m[k+1][j] + p[i–1]*p[k]*p[j]; //对i<k<j, 逐个计算A[i, j] = A[i: k] A[k+1: j] if (t < m[i][j]) {m[i][j] = t; s[i][j] = k;} //记下较小的m[i][j]及相应的断点k }}}
算法设计与分析
6
不同计算顺序的差别
• 设矩阵A1, A2和A3分别为10×100, 100×5和 5×50的矩阵,现要计算A1A2A3 。 • 若按((A1A2)A3)来计算,则需要的数乘次数为 10×100×5 + 10×5×50 = 7500 • 若按(A1(A2 A3))来计算,则需要的数乘次数为 100 ×5 ×50+ 10×100×50 = 75000 • 后一种计算顺序的计算量竟是前者的10倍! • 所以,求多个矩阵的连乘积时,计算的结合 顺序是十分重要的。
算法设计与分析 9
建立递归关系
• 令m[i][j] , 1≤i, j≤n,为计算A[i, j] 的最少数乘 次数,则原问题为m[1][n]。 • 当i = j时,A[i, j]为单一矩阵, m[i][j] = 0; • 当i<j时,利用最优子结构性质有: m[i][j] = min{m[i][k] + m[k+1][j] + pi–1pkpj}
m[1][4] m[1][2] m[2][3] m[3][4]
m[i][i+1] = pi–1pipi+1
m[i][i] = 0
15
m[1][1] m[2][2] m[3][3] m[4][4]
算法设计与分析
算法
• • • • • 输入:n个连乘矩阵的大小p0,p1,…,pn 输出:最少乘法次数记为m[1][n],最优解s 算法(思路是自底向上) 1)考虑最底层:m[i][i]=0 2)从下面的第二层到最高的n层中的某层r(相当于 r=2:n)
– 2.1)对 r层中的每个m[i][j](思考r层中有多少个m[i][j])
• 2.1.1)计算断点k在i处的乘法次数,记为当前的最优值m[i][j],当 前的最优断点 • 2.1.2)断点k=2到j,则
– 2.1.2.1)计算断点为k的乘法次数,与已有的最优值m[i][j]比较,如 果当前值更优,则替换m[i][j]和最优断点
算法设计与分析 14
自底向上的计算
• 例如对于A1A2A3A4,依据递归式以自底向上的 方式计算出各个子问题,其过程如下:
其中 例如: m[1][3] = m[1][1]+m[2][3]+p0p1p3 m[i][j] = mini≤k<j min m[1][3] m[2][4] m[1][2]+m[3][3]+p0p2p3 {m[i][k]+m[k+1][j]+pi–1pkpj}
算法设计与分析
16
消除重复的矩阵连乘算法
• • • • • • • • • • • • • • • Void MatrixChain(int p, int n, int **m, int **s) { for (int i = 1; i <= n; i++) m[i][i] = 0; //将对角线元素赋值为零,即单个矩阵计算量为0 for (int r = 2; r <= n; r++) for (int i = 1; i <= n – r +1; i++) { int j = i + r – 1; (5) m[i][j] = m[i+1][j] + p[i–1]*p[i]*p[j]; //计算A[i, j] = A[i: i] A[i+1: j] 能。此处分开是为 第(5)步与第(7)步 s[i][j] = i; //记下断点i 了给m[i][j]赋初值。 (7) for (int k = i + 1; k < j; k++) { 能否合在一起?
T(n)
n/2
T(n/4) T(n/4) T(n/4)
=
n
n/2 n/2 n/2
T(n/4) 4
T(n/4)
T(n/4) T(n/4) T(n/4)T(n/4)T(n/4) T(n/4) 算法设计与分析
动态规划基本步骤
• • • • 找出最优解的性质,并刻划其结构特征。 递归地定义最优值。 以自底向上的方式计算出最优值。 根据计算最优值时得到的信息,构造最优解。
算法设计与分析 17
MatrixChain的运行举例
MatrixChain用矩阵m[i][j],2A3A4A5A6,其维数分别 当r=2,执行第(5)句完成了相邻矩阵A[i][i+1]=p[i–1]*p[i]*p[j] 设要计算矩阵连乘积A1A s[i][j]存放子问题A[i: MatrixChain将如下面红色箭头所示的过程逐个计算 当r=3,i=2时,执行第(5)句计算A[2:2][3:4],m[2][4] = 当r=3,i=1时,执行第(5)句计算A[1:1][2:3], m[1][3]= j] 当r=3,i=3时,执行第(5)句计算A[3:3][4:5],m[3][5] = 执行for (int i = 1; i <= n; i++) m[i][i] = 0后将对角线元素全 类似的,当r=4、5、6时,可以计算出相应的m[i][j]及其相 由m[1][6]=15125可知这6个矩阵连乘积的最小运算次数为 当r=3,i=4时,执行第(5)句计算A[4:4][5:6],m[4][6] 的计算,并在s[i][j]中添入了相应的断点。其中的第(7)句因 的最小计算量以及相应的断点。 = 6000 m[3][4] + p[1]*p[2]*p[4] = 26255×10, 10×20, m[2][3] + p[0]*p[1]*p[3] = =1000 +30*35*5 = 7875 20×25, m[4][5] + p[2]*p[3]*p[5] = 750 +35*15*10 = 2500 为35×35, j]: 子问题A[i: 35×15, 15×5, +15*5*20 6250 部置零,即子问题A[i][i] 5000 +5*10*25 0。 应的断点s[i][j],如下图中所示: 15125。由s[1][6] = 3可知A[1: 6]的最优计算次序为A[1: 3] m[5][6] p[3]*p[4]*p[6] 为j =6];由s[1][3]=1可知A[1: 3]的最优计算次序为A[1: 执行第(7)句计算A[2:3][4:4],=5, m[2][3]+m[4][4]+ 6+ 1] 即p =35, p1=35, p2=15, p3 A[4: 0i+1(k=i+1)而被跳过去了,实际并没有执行。 =25。 执行第(7)句计算A[3:4][5:5], t = m[3][4]+m[5][5]+ 执行第(7)句计算A[4:5][6:6], = m[4][5]+m[6][6]+ 执行第(7)句计算A[1:2][3:3], tt = p4=10, p5m[3][3] m[1][2] + =20, p p[1]*p[3]*p[4] = 2625+0+35*5*10 = 4375<6000,所以 A[2: 3];由s[4][6]=5可知A[4: 6]的最优计算次序为A[4: p[2]*p[4]*p[5] = 750+0+15*10*20 3500<6250,所以 p[3]*p[5]*p[6] 1000+0+5*20*25 18375>7875,所以 p[0]*p[2]*p[3] = 15750+0+35*15*5==3750>2500,所以 5] m[2][4]改为4375,断点改为3。 1(A2A3))((A4A5)A6)。 A[6: 6];因此最优计算次序为:(A m[3][5]仍为2500,断点仍为3。 m[4][6]改为3500,断点改为5。 m[1][3]不变,断点仍为1。
相关文档
最新文档