动态规划算法 Dynamic Programming

Slides:



Advertisements
Similar presentations
因数与倍数 2 、 5 的倍数的特征
Advertisements

3 的倍数的特征 的倍数有 : 。 5 的倍数有 : 。 既是 2 的倍数又是 5 的倍数有 : 。 12 , 18 , 20 , 48 , 60 , 72 , , 25 , 60 ,
一、 一阶线性微分方程及其解法 二、 一阶线性微分方程的简单应用 三、 小结及作业 §6.2 一阶线性微分方程.
2.8 函数的微分 1 微分的定义 2 微分的几何意义 3 微分公式与微分运算法则 4 微分在近似计算中的应用.
2.5 函数的微分 一、问题的提出 二、微分的定义 三、可微的条件 四、微分的几何意义 五、微分的求法 六、小结.
碰撞 两物体互相接触时间极短而互作用力较大
圆的一般方程 (x-a)2 +(y-b)2=r2 x2+y2+Dx+Ey+F=0 Ax2+Bxy+Cy2+Dx+Ey+ F=0.
第五章 二次型. 第五章 二次型 知识点1---二次型及其矩阵表示 二次型的基本概念 1. 线性变换与合同矩阵 2.
一、二阶行列式的引入 用消元法解二元线性方程组. 一、二阶行列式的引入 用消元法解二元线性方程组.
第三章 函数逼近 — 最佳平方逼近.
《高等数学》(理学) 常数项级数的概念 袁安锋
第一章 行列式 第五节 Cramer定理 设含有n 个未知量的n个方程构成的线性方程组为 (Ⅰ) 由未知数的系数组成的n阶行列式
动态规划(四).
小学生游戏.
資料結構與演算法 課程教學投影片.
第5章 定积分及其应用 基本要求 5.1 定积分的概念与性质 5.2 微积分基本公式 5.3 定积分的换元积分法与分部积分法
不确定度的传递与合成 间接测量结果不确定度的评估
第三节 格林公式及其应用(2) 一、曲线积分与路径无关的定义 二、曲线积分与路径无关的条件 三、二元函数的全微分的求积 四、小结.
第三章 导数与微分 习 题 课 主要内容 典型例题.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
第三章 多维随机变量及其分布 §2 边缘分布 边缘分布函数 边缘分布律 边缘概率密度.
第二章 矩阵(matrix) 第8次课.
第2讲 绪论(二).
§2 求导法则 2.1 求导数的四则运算法则 下面分三部分加以证明, 并同时给出相应的推论和例题 .
What have we learned?.
山东师范大学信息科学与工程学院软件工程研究所 徐连诚 2006年10月9日
动态规划(Dynamic Programming)
工业机器人技术基础及应用 主讲人:顾老师
第4章 非线性规划 4.5 约束最优化方法 2019/4/6 山东大学 软件学院.
数列.
线段的有关计算.
顺序表的删除.
线性代数 第二章 矩阵 §1 矩阵的定义 定义:m×n个数排成的数表 3) 零矩阵: 4) n阶方阵:An=[aij]n×n
线性规 Linear Programming
概 率 统 计 主讲教师 叶宏 山东大学数学院.
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
复习.
第5章 动态规划 5.1, 5.2 多阶段决策和最优化原理 2019/5/1.
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
Algorithm Design and Analysis
第16讲 相似矩阵与方阵的对角化 主要内容: 1.相似矩阵 2. 方阵的对角化.
用穷举法设计程序 南京师范大学 教育技术系 倪佳慧
§8.3 不变因子 一、行列式因子 二、不变因子.
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
1.设A和B是集合,证明:A=B当且仅当A∩B=A∪B
第4课时 绝对值.
学习任务三 偏导数 结合一元函数的导数学习二元函数的偏导数是非常有用的. 要求了解二元函数的偏导数的定义, 掌握二元函数偏导数的计算.
第七、八次实验要求.
Models and Software Practice of the Operations Research
2.2矩阵的代数运算.
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
主讲人: 吕敏 { } Spring 2012 ,USTC 算法基础 主讲人: 吕敏 { } Spring 2012 ,USTC.
2019/5/21 实验一 离散傅立叶变换的性质及应用 实验报告上传到“作业提交”。 11:21:44.
第二节 函数的极限 一、函数极限的定义 二、函数极限的性质 三、小结 思考题.
正弦、余弦函数的性质 华容一中 伍立华 2017年2月24日.
Dynamic Programming II
§2 方阵的特征值与特征向量.
生 物 信 息 学 Bioinformatics 巩晶 癌症研究中心 山东大学 医学院
动态规划 Floyd最短路径算法 高文宇
基于列存储的RDF数据管理 朱敏
定义5 把矩阵 A 的行换成同序数的列得到的矩阵,
第四节 向量的乘积 一、两向量的数量积 二、两向量的向量积.
线性规划 Linear Programming
第三节 数量积 向量积 混合积 一、向量的数量积 二、向量的向量积 三、向量的混合积 四、小结 思考题.
§4.5 最大公因式的矩阵求法( Ⅱ ).
第二次课后作业答案 函数式编程和逻辑式编程
一元一次方程的解法(-).
最小生成树 最优二叉树.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
9.3多项式乘多项式.
Presentation transcript:

动态规划算法 Dynamic Programming 万玲

1、概述 什么是动态规划? 它能解决哪些问题? 解决的步骤又是什么样的?

动态规划(dynamic programming)作为一种多阶段决策优化过程的通用方法,它是在20世纪50年代由一位卓越的美国数学家Richard Bellman所发明的。因此,这个技术名字中的programming是计划和规划的意思,不是代表计算机中的编程。 规划(programming)的含义意味着一系列的决策,而动态(dynammic)的含义则传递着这样一种思想,就是所作的决策可能依赖于当前状态,而与此前所作的决策无关。

3.2 举例:最短路径问题 为了找到由A到E的最短路线,可以将该问题分成A-B-C-D-E 4各阶段,在每个阶段都需要作出决策,即在A点需要决策下一步到B1还是B2或B3;同样,若到达第二阶段某个状态,比如B1,需要决定走向C1还是C2;依次类推,可以看出:各个阶段的决策不同,由A到E的路线就不同,当从某个阶段的某个状态发出一个决策,则这个决策不仅影响到下一各阶段的距离,而且直接影响后门各个阶段的行进线路。所以这类问题要求在各个阶段选择一个恰当的决策,使这些决策序列所决定的一条线路对应的线路最短。

算法总体思想 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题 n T(n/2) T(n) =

算法总体思想 但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。 n T(n) = n/2 T(n/4)

Why Divide and Conquer技术的问题 优化问题 子问题是相互独立的 如果子问题不是相互独立的,分治方法将重复计算公共子问题,效率很低 优化问题 给定一组约束条件和一个代价函数,在解空间中搜索具有最小或最大代价的优化解 很多优化问题可以分解为多个子问题,子问题相互关联,子问题的解被重复使用

What 动态规划的特点 适用范围 把原始问题分为一系列子问题 求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时直接存取,不重复结算,节约计算时间 自底向上的计算 适用范围 一类优化问题:可分为多个相关子问题,子问题的解被重复使用

How 使用动态规划的条件 优化子结构 重叠子问题 当一个问题的优化解包含了子问题的优化解时,我们说这个问题具有优化子结构 缩小子问题的集合,只要哪些优化问题包含了优化子问题,降低实现复杂性 重叠子问题 在问题的求解过程中,很多子问题的解被多次重复使用

动态规划基本步骤 找出最优解的性质,并刻划其结构特征。 递归地定义最优值。 以自底向上的方式计算出最优值。 根据计算最优值时得到的信息,构造最优解。

3.3 矩阵连乘 完全加括号的矩阵连乘积可递归地定义为: 设有四个矩阵 ,它们的维数分别是: 总共有五中完全加括号的方式 设有四个矩阵 ,它们的维数分别是: 总共有五中完全加括号的方式 (1)单个矩阵是完全加括号的; (2)矩阵连乘积 是完全加括号的,则 可 表示为2个完全加括号的矩阵连乘积 和 的乘积并加括号,即 16000, 10500, 36000, 87500, 34500

矩阵连乘问题 给定n个矩阵 , 其中 与 是可乘的, 。考察这n个矩阵的连乘积 由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。 若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积

矩阵连乘问题 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 穷举法:列举出所有可能的计算次序,并计算出每一种计算次序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。 算法复杂度分析: 对于n个矩阵的连乘积,设其不同的计算次序为P(n)。 由于每种加括号方式都可以分解为两个子矩阵的加括号问题:(A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下:

矩阵连乘问题 穷举法 动态规划 将矩阵连乘积 简记为A[i:j] ,这里i≤j 考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵 Ak和Ak+1之间将矩阵链断开,i≤k<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]的次序也是最优的。 矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。

建立递归关系 设计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数m[i,j],则原问题的最优值为m[1,n] 当i=j时,A[i:j]=Ai,因此,m[i,i]=0,i=1,2,…,n 当i<j时, 可以递归地定义m[i,j]为: 这里 的维数为 的位置只有 种可能

计算最优值 对于1≤i≤j≤n不同的有序对(i,j)对应于不同的子问题。因此,不同子问题的个数最多只有 由此可见,在递归计算时,许多子问题被重复计算多次。这也是该问题可用动态规划算法求解的又一显著特征。 用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法

用动态规划法求最优解 public static void matrixChain(int [] p, int [][] m, int [][] s) { int n=p.length-1; for (int i = 1; i <= n; i++) m[i][i] = 0; for (int r = 2; r <= n; r++) 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; for (int k = i+1; k < j; k++) { int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j]; if (t < m[i][j]) { m[i][j] = t; s[i][j] = k;} } A1 A2 A3 A4 A5 A6 3035 3515 155 510 1020 2025

动态规划算法的基本要素 一、最优子结构 矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。 在分析问题的最优子结构性质时,所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。 利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。 注意:同一个问题可以有多种方式刻划它的最优子结构,有些表示方法的求解速度更快(空间占用小,问题的维度低)

二、重叠子问题 递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。 动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。 通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率。

3.4 0/1背包问题 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 0-1背包问题是一个特殊的整数规划问题。

对于0/1背包问题,可以通过作出变量X1,X2,...,Xi的一个决策序列来得到它的解。而对变量X的决策就是决定它是取0值还是取1值。鉴定决策这些X的次序为Xn,Xn-1,...,X1。在对Xn作出决策之后,问题处于下列两种状态之一: 背包的剩余容量是X=M,没有产生任何价值; 剩余容量是X=M-wn,价值增长了pn。 显然,剩余下来对Xn,Xn-1,...,X1的决策相对于决策X所产生的问题状态应该是最优的,否则Xn,Xn-1,...,X1就不可能是最优决策序列。

背包问题的实例分析 考虑以下情况的背包问题, n=3,W=6, (w1,w2,w3)=(2,3,4), (p1,p2,p3)=(1,2,5) f1(1)=max{f0(1),f0(1-w1)+p1}=0 f1(2)=max{f0(2),f0(2-w1)+p1}=p1=1 f1(3)到f1(6)与f1(2)相同 f2(1)=max{f1(1),f1(1-w2)+p2}=0 f2(2)=max{f1(2),f1(2-w2)+p2}=1 f2(3)=f2(4)=max{f1(3),f1(3-w2)+p2}=2 f2(5)=f2(6)=max{f1(5),f1(5-w2)+2}=3 f3(6)=max{f2(6),f2(6-w3)+p3}=max{3,f1(2)+4}=4

0-1背包问题 设所给0-1背包问题的子问题 的最优值为m(i,j),即m(i,j)是背包容量为j,在前i各物体中,能够装入载重量为j的背包中的物体的最大价值。由0-1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式如下。

动态规划求解0/1背包的算法描述 template<class Type> Type knapsack_dynamic(int w[],Type p[],int n,int m,BOOL x[]){ int I,j,k; Type v,(*optp)[m+1]=new Type[n+1][m+1]; for(i=0;i<=n;i++){ optp[i][0]=0;x[i]=FALSE;} for(i=0;i<=m;i++) optp[0][i]=0; //初始化

动态规划0/1背包算法 for(i=1;i<=n;i++){ //计算optp[i[]j] for(j=1;j<=m;j++){ optp[i][j]=optp[i-1][j]; if((j>=w[i])&&(optp[i-1,j-w[i]]+p[i])>optp[i-1][j]) optp[i][j]=optp[i-1,j-w[i]]+p[i]; } j=m; //递推装入背包的物体 for(i=n;i>0;i--){ if(optp[i][j]>optp[i-1][j]){ x[i]=FALSE; j=j-w[i]; } v=optp[n][m]; Delete optp; Return v; }//结束

例题 0/1背包问题 有五个物体,其重量分别为2,2 ,6 ,5 ,4,价值分别是6,3,5,4,6,背包的载重量为10,求装入背包的物体及其总价值表。 1 2 3 4 5 6 7 8 9 10 11 14 13 12 15 答案是11001

3.5 最长公共子序列 若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。 给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。 给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。

最长公共子序列的结构 设序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}的最长公共子序列为Z={z1,z2,…,zk} ,则 (1)若xm=yn,则zk=xm=yn,且zk-1是xm-1和yn-1的最长公共子序列。 (2)若xm≠yn且zk≠xm,则Z是xm-1和Y的最长公共子序列。 (3)若xm≠yn且zk≠yn,则Z是X和yn-1的最长公共子序列。 由此可见,2个序列的最长公共子序列包含了这2个序列的前缀的最长公共子序列。因此,最长公共子序列问题具有最优子结构性质。

子问题的递归结构 由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。用c[i][j]记录序列和的最长公共子序列的长度。其中, Xi={x1,x2,…,xi};Yj={y1,y2,…,yj}。当i=0或j=0时,空序列是Xi和Yj的最长公共子序列。故此时C[i][j]=0。其他情况下,由最优子结构性质可建立递归关系如下:

计算最优值 由于在所考虑的子问题空间中,总共有θ(mn)个不同的子问题,因此,用动态规划算法自底向上地计算最优值能提高算法的效率。 Algorithm lcsLength(x,y,b) 1: mx.length-1; 2: ny.length-1; 3: c[i][0]=0; c[0][i]=0; 4: for (int i = 1; i <= m; i++) 5: for (int j = 1; j <= n; j++) 6: if (x[i]==y[j]) 7: c[i][j]=c[i-1][j-1]+1; 8: b[i][j]=1; 9: else if (c[i-1][j]>=c[i][j-1]) 10: c[i][j]=c[i-1][j]; 11: b[i][j]=2; 12: else 13: c[i][j]=c[i][j-1]; 14: b[i][j]=3; 构造最长公共子序列 Algorithm lcs(int i,int j,char [] x,int [][] b) { if (i ==0 || j==0) return; if (b[i][j]== 1){ lcs(i-1,j-1,x,b); System.out.print(x[i]); } else if (b[i][j]== 2) lcs(i-1,j,x,b); else lcs(i,j-1,x,b);

动态规划 最长公共子序列 例题 求A=xyxzyxyzzy,B=xzyzxyzxyzxy的最长公共子序列。 解:用两个表,来分别用来存放搜索过程中所得到的子序列的长度c[i][j]和状态b[i][j]. 最终得到的最长公共子序列是A(1,2,3,4,6,7,8,10)=xyxzxyzy

最长公共子序列的两个存储表 1 2 3 4 5 6 7 8 9 10 11 12 子序列的长度表

最长公共子序列的状态表及搜索 1 2 3 4 5 6 7 8 9 10 11 12 ↖ ← ↖ ← ↖ ← ↖ ↑ ↖ ↖ ↖ ← ↑ ↖

3.6最大子段和 给定由n个整数(可能为负整数)组成的序列a1,a2,…,an, 求该序列形如 的子段和的最大值。当所有整数均为负整数时定义其最大子段和为0。 例如,当(a1,a2,a3,a4,a5,a6)={-2,11,-4,13,-5,-2}时,最大子段和为20。

简单算法 int MaxSum(int n,int* a) { int max=0; for (int i=1;i<=n;i++) 由题意直接求解,用数组a[]存储给定的n个整a1,a2,…,an。 int MaxSum(int n,int* a) { int max=0; for (int i=1;i<=n;i++) for (int j=I;j<=n;j++) int tmp=0; for (int k=i;k<=j;k++) tmp+=a[k]; if (tmp>max) max=tmp; } return max; 时间复杂度为O(n^3)

动态规划算法 若记b[j]为从第i个数加到第j个数的最大值。那么最大字段和就是b[1], b[2],…,b[n]中的最大值。 由b[j]的定义易知,当b[j-1]>0时b[j]=b[j-1]+a[j],否则b[j]=a[j]。 由此可得计算b[j]的动态规划递归式 b[j]=max{b[j-1]+a[j],a[j]}, 1<=j<=n

动态规划代码 int MaxSum(int n,int* a) { int max=0,b=0; for (int i=1;i<=n;i++) if (b>0) b+=a[i]; else b=a[i]; if (b>max) max=b; } return max;