动态规划
- 格式:pptx
- 大小:811.02 KB
- 文档页数:6
第6章 动态规划动态规划(Dynamic Programming )是解决多阶段决策过程最优化的一种有用的数学方法。
它是由美国学者Richard .Bellman 在1951年提出的,1957年他的专著《动态规划》一书问世,标志着运筹学的一个重要分支-动态规划的诞生.动态规划也是一种将多变量问题转化为单变量问题的一种方法。
在动态规划中,把困难的多阶段决策问题变换成一系列相互联系的比较容易的单阶段问题一个个地求解。
动态规划是考察解决问题的一种途径 ,而不是一种特殊的算法,不像线性规划那样有统一的数学模型和算法(如单纯形法).事实上,在运用其解决问题的过程中还需要运用其它的优化算法。
因此,动态规划不像其它方法局限于解决某一类问题,它可以解决各类多阶段决策问题。
动态规划在工程技术、经济管理等社会各个领域都有着广泛的应用,并且获得了显著的效果。
在经济管理方面,动态规划可以用来解决最优路径问题、资源分配问题、生产调度问题、库存管理问题、排序问题、设备更新问题以及生产过程最优控制问题等,是经济管理中一种重要的决策技术。
许多规划问题用动态规划的方法来处理,常比线性规划或非线性规划更有效。
特别是对于离散的问题,由于解析数学无法发挥作用,动态规划便成为了一种非常有用的工具。
动态规划可以按照决策过程的演变是否确定分为确定性动态规划和随机性动态规划;也可以按照决策变量的取值是否连续分为连续性动态规划和离散性动态规划。
本教材主要介绍动态规划的基本概念、理论和方法,并通过典型的案例说明这些理论和方法的应用。
6.1动态规划的基本理论6.1.1多阶段决策过程的数学描述有这样一类活动过程,其整个过程可分为若干相互联系的阶段,每一阶段都要作出相应的决策,以使整个过程达到最佳的活动效果。
任何一个阶段(stage ,即决策点)都是由输入(input )、决策(decision )、状态转移律(transformation function )和输出(output )构成的,如图6-1(a )所示.其中输入和输出也称为状态(state ),输入称为输入状态,输出称为输出状态。
什么是动态规划?⼀、基本思想态规划算法的基本思想与分治法类似,都是将问题⼤问题拆分为⼩问题,通过⼩问题的求解来得到最后的解。
与分治法不同的是,分治法是分⽽治之,分治法将⼤问题拆分为相同性质的⼦问题,最后合并⼦问题的解来构成最终解。
⽽动态规划是,将⼦问题拆解后,按顺序求解⼦问题,前⾯阶段的求解为后⼀阶段提供有⽤信息,通过动态的选择来到达最终解。
⽤图来表⽰就是如下所⽰:⼆、适⽤情况(1)最优化原理:如果问题的最优解所包含的⼦问题的解也是最优的,就称该问题具有最优⼦结构,即满⾜最优化原理。
(2)⽆后效性:即某阶段状态⼀旦确定,就不受这个状态以后决策的影响。
也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。
(3)有重叠⼦问题:即⼦问题之间是不独⽴的,⼀个⼦问题在下⼀阶段决策中可能被多次使⽤到。
(该性质并不是动态规划适⽤的必要条件,但是如果没有这条性质,动态规划算法同其他算法相⽐就不具备优势)----摘⾃百度百科三、求解步骤动态规划中有三个⾮常重要的概念:最优⼦结构、边界、状态转移公式。
最优⼦结构:最优⼦结构指的是,问题的最优解包含⼦问题的最优解。
反过来说就是,我们可以通过⼦问题的最优解,推导出问题的最优解。
边界:就是问题的出⼝。
状态转移公式:动态规划问题的这⼀阶段的最优解是可以通过前⾯阶段的解和上⼀阶段的决策推导出来的。
这个推导过程就是⼀个状态转移公式我们通常按照如下4个步骤设计⼀个动态规划算法:1.刻画⼀个最优解的结构特征2.递归地定义最优解的值3.计算最优解的值,通常采⽤⾃底向上的⽅法(采⽤⼀张表格记录之前的状态)4.利⽤计算出的信息构造⼀个最优解我们之前的和也是⼀样的求解步骤。
以硬币找零问题为例:⾸先,⾯对⼀枚新的硬币,我们有两个选择:使⽤和不使⽤。
构成当前阶段的最优解 = min{使⽤这枚硬币的解,不使⽤这枚硬币的解} ----(1.刻画⼀个最优解的结构特征)然后,我们就得到转移⽅程 Value(i) = min {Value(i-1), Value(s-c[i])) + 1} ---- (2.递归地定义最优解的值)之后我们从找零1⾓开始算起,⼀直到达我们想要找零的数⽬。
什么是动态规划动态规划( D ynamic P rogramming ,所以我们简称动态规划为 DP )是的⼀个分⽀,是求解决策过程(decision process) 最优化的数学⽅法。
20 世纪 50 年代初数学家R.E.Bellman 等⼈在研究多阶段决策过程 (multistep decision process) 的优化问题时,提出了著名的最优化原理 (principle of optimality),把多阶段过程转化为⼀系列单阶段问题,利⽤各阶段之间的关系,逐个求解,创⽴了解决这类过程优化问题的新⽅法 —— 动态规划。
1957 年出版了他的名著《 Dynamic Programming 》,这是该领域的第⼀本著作。
动态规划算法通常基于⼀个递推公式及⼀个或多个初始状态。
当前⼦问题的解将由上⼀次⼦问题的解推出。
使⽤动态规划来解题只需要多项式时间复杂度,因此它⽐回溯法、暴⼒法等要快许多。
说了这么多术语,想必⼤家都很头疼,现在让我们通过⼀个例⼦来了解⼀下DP 的基本原理。
⾸先,我们要找到某个状态的最优解,然后在它的帮助下,找到下⼀个状态的最优解。
这句话暂时理解不了没关系,请看下⾯的例⼦ :如果我们有⾯值为1 元、 3 元和 5 元的硬币若⼲枚,如何⽤最少的硬币凑够 11 元?我们凭直观感觉告诉⾃⼰,先选⾯值最⼤,因此最多选 2枚 5 元的硬币,现在是 10 元了,还差⼀元,接下来我们挑选第⼆⼤的 3 元硬币,发现不⾏( 10+3=13 超了),因此我们继续选第三⼤的硬币也就是 1元硬币,选⼀个就可以( 10+1=11 ),所以总共⽤了 3 枚硬币凑够了 11 元。
这就是贪⼼法,每次选最⼤的。
但是我们将⾯值改为 2 元, 3 元和 5 元的硬币,再⽤贪⼼法就不⾏了。
为什么呢?按照贪⼼思路,我们同样先取 2 枚最⼤ 5 元硬币,现在 10 元了,还差⼀元,接下来选第⼆⼤的,发现不⾏,再选第三⼤的,还是不⾏,这时⽤贪⼼⽅法永远凑不出 11 元,但是你仔细看看,其实我们可以凑出 11 元的, 2 枚 3元硬币和 1 枚五元硬币就⾏了,这是⼈经过思考判断出来了的,但是怎么让计算机算出来呢?这就要⽤动态规划的思想:⾸先我们思考⼀个问题,如何⽤最少的硬币凑够i 元 (i<11) ?为什么要这么问呢?两个原因: 1. 当我们遇到⼀个⼤问题时,总是习惯把问题的规模变⼩,这样便于分析讨论。
运筹学动态规划的概念运筹学中的动态规划是一种解决多阶段决策问题的数学方法。
它适用于需要做出一系列决策才能获得最优解的情况。
在这种情况下,每个决策都会对接下来的决策产生影响,因此需要考虑整个过程的影响。
动态规划的实质是将多阶段决策过程拆解成一系列子问题,每个子问题都可以用一个状态来描述。
通过求解每个子问题的最优解,就可以逐步得到整个过程的最优解。
动态规划的基本思想是以最优子结构为基础,避免重复计算已经求解过的子问题的过程。
也就是说,如果我们已经知道了子问题的最优解,那么整个问题的最优解就可以通过这些子问题的最优解推导出来。
通常情况下,动态规划问题需要满足以下几个条件:1.具有最优子结构特征:问题的最优解是由子问题的最优解组合而成的。
2.无后效性:子问题的解一旦确定,就不会被改变。
3.子问题重复性:不同的子问题可能会对应相同的状态。
4.边界性:即为问题的较小的子问题需要单独处理。
通过以上条件,我们就可以将动态规划问题分解为一个个子问题,并求解每个子问题所对应的最优值。
动态规划的基本流程分为三个步骤:1.定义状态:构建状态转移方程需要定义状态,状态通常用一个或多个变量来表示,变量的取值代表状态。
2.写出状态转移方程:根据定义好的状态,写出各个状态之间的转移方程。
3.确定边界条件:对较小的子问题需要单独处理,因此当状态变量为边界值时,需要特殊处理。
动态规划的应用广泛,它可以用于解决大量的问题。
例如,求解最长公共子序列问题、背包问题、最短路问题、字符串编辑距离问题等等。
它在图像处理、自然语言处理、生物信息学等领域中也有广泛的应用,如图像去噪、序列比对、DNA 序列匹配等。
总之,动态规划是运筹学中一种解决多阶段决策问题的重要方法,它通过将问题分解成子问题,并求解每个子问题的最优解,得出整个问题的最优解。
在实际应用中,我们需要根据具体问题特点,定义好状态,写出好的状态转移方程,才能有效地解决问题。
数据结构之动态规划动态规划的基本思想和常见应用场景动态规划(Dynamic Programming,DP)是一种通过将问题分解为更小的子问题来解决复杂问题的方法。
它的基本思想是利用已解决过的子问题的解来求解当前问题的解,从而避免重复计算,提高算法效率。
动态规划的应用广泛,可以用于解决一些优化问题、最优化问题以及组合优化问题等。
动态规划的基本思想可以用以下三个步骤来概括:1. 定义子问题:将原问题划分为一个或多个子问题,并找到它们之间的关系。
2. 构建状态转移方程:根据子问题之间的关系,找到问题的递推关系,将问题转化为子问题的解。
3. 解决问题:通过递推计算或者自底向上的方法,求解问题的最终解。
动态规划的核心是状态转移方程。
状态转移方程描述了子问题与原问题之间的关系,通过它可以求解原问题的解。
在构建状态转移方程时,需要考虑如何选择最优子结构并进行状态转移,以及确定初始状态和边界条件。
动态规划常见的应用场景包括:1. 最优化问题:如最短路径问题、最长递增子序列问题、背包问题等。
这类问题中,动态规划可以帮助我们找到最优解。
2. 组合优化问题:如旅行商问题(TSP)、任务分配问题等。
这类问题中,动态规划可以帮助我们找到最佳的组合方案。
3. 概率计算问题:如概率图模型中的推断问题、隐马尔可夫模型中的预测问题等。
这类问题中,动态规划可以帮助我们计算复杂的概率。
举例来说,我们可以通过动态规划求解最长递增子序列问题。
给定一个序列,我们希望找到其中最长递增的子序列的长度。
首先,定义状态dp[i]表示以第i个元素结尾的最长递增子序列的长度。
然后,我们可以根据dp[i-1]和第i个元素的大小关系来更新dp[i]的值,即dp[i]= max(dp[i], dp[j]+1),其中j为i之前的某个位置,且nums[j] < nums[i]。
最后,我们通过遍历数组,找到dp数组中的最大值,即可得到最长递增子序列的长度。