动态规划( dynamic programming )算法是解决多阶段决策过程最优化问题的一种经常使用方法,难度比较大,技巧性也很强。利用动态规划算法,能够优雅而高效地解决不少贪婪算法或分治算法不能解决的问题。动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,而后从这些子问题的解获得原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让之后再次遇到时直接引用答案,没必要从新求解。动态规划算法将问题的解决方案视为一系列决策的结果,与贪婪算法不一样的是,在贪婪算法中,每采用一次贪婪准则,便作出一个不可撤回的决策;而在动态规划算法中,还要考察每一个最优决策序列中是否包含一个最优决策子序列,即问题是否具备最优子结构性质。算法
动态规划算法的有效性依赖于待求解问题自己具备的两个重要性质:最优子结构性质和子问题重叠性质。数组
1 、最优子结构性质。若是问题的最优解所包含的子问题的解也是最优的,咱们就称该问题具备最优子结构性质(即知足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。函数
2 、子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不老是新问题,有些子问题会被重复计算屡次。动态规划算法正是利用了这种子问题的重叠性质,对每个子问题只计算一次,而后将其计算结果保存在一个表格中,当再次须要计算已经计算过的子问题时,只是在表格中简 单地查看一下结果,从而得到较高的解题效率。优化
当咱们已经肯定待解决的问题须要用动态规划算法求解时,一般能够按照如下步骤设计动态规划算法:设计
1 、分析问题的最优解,找出最优解的性质,并刻画其结构特征;htm
2 、递归地定义最优值;递归
3 、采用自底向上的方式计算问题的最优值;ip
4 、根据计算最优值时获得的信息,构造最优解。ci
1 ~ 3 步是动态规划算法解决问题的基本步骤,在只须要计算最优值的问题中,完成这三个基本步骤就能够了。若是问题须要构造最优解,还要执行第 4 步; 此时,在第 3 步一般须要记录更多的信息,以便在步骤 4 中,有足够的信息快速地构造出最优解。get
本文来自CSDN博客
*************************************************************************************************
动态规划其实质上是经过开辟记录表,记录已求解过的结果,当再次须要求解的时候,能够直接到
那个记录表中去查找,从而避免重复计算子问题来达到下降时间复杂度的效果。其实是一个空间
换时间的算法。动态规划,一般能够把指数级的复杂度下降到多项式级别。
通常算法书都会讲能不能用动态规划来求解问题,一般是判断有没有最有解结构,一般是经过“剪
切技术”来判断:即证实问题的一个最优解中,使用的子问题的解自己也必须是最优的。一般是假
设一个子问题不是最优的,那么找到一个最优的子问题来替换这个子问题,那么产生的最优解将优
于已找到的那个最优解,从而矛盾。
其实用不用动态规划来求解问题,还有一个关键是有没有重复的子问题。这也是使用动态规划
与贪心法的区别所在。。贪心法求解的问题也知足最优解结构,只是它可以在每一步都可以“贪婪的
”选出当前惟一的最优子问题,而且当前的选择,是不依赖之前的选择的,经过这种“贪婪的选择”
选到最后时,就获得了全局的最优解了,不会产生重复的子问题。而动态规划,在一步选择的时候,
是经过从之前求出的若干个与本步骤相关的子问题最优解中选择最好的那个,加上这一步的值,来构
造这一步那个子问题的最优解,而若是之前求出的若干个子问题不保存下来,就须要从新求(一般是递
归所致)。动态规划用武之地也无非是保存这些重复的子问题而避免从新求解而达到高效的目的。
动态规划的难点在于写出递推式。动态规划的步骤实际上是很固定的,而每个问题的递推式如何下手
获得会因不一样的问题而不一样,这是个最关键的问题,没有通用的方法。一般是根据题目的问题,最终要求的问题,都会
有几个数,以两个数M,N为例,而后让求最优值。你就可使用v[M][N]数组来保存最有解,而后把问题
替换成i,j两个数的问题,试图经过v[i][j]与前面求出来的解创建递推关系。创建递推关系后,你能够简单
的写出递归形式的程序,这个程序只须要加上一条if(v[i][j]已求出) return v[i][j];就轻松改称了动
态规划,这就是lookup的形式。固然若是已经有了递推式,你也很容易写出从底向上推的迭代形式。
通常的算法书讲的动态规划都是来求解最优解的问题,或许最初是用来求解规划问题的,而规划必然是最
优解问题,其实大多数的问题只要存在重复的子问题均可以使用动态规划的思路,就看你的重复的子问题
是否是多的值得使用空间来换时间这个思路了。
***********************************
因为本人是数学系的,因此喜欢用数学离散的角度来思考:
多阶段决策过程,是指这样的一类特殊的活动过程,问题能够按时间顺序分解成若干相互联系的阶段,在每个阶段都要作出决策,所有过程的决策是一个决策序列。要使整个活动的整体效果达到最优的问题,称为多阶段决策问题。
例1是一个多阶段决策问题的例子,下面是另外一个多阶段决策问题的例子:
工厂生产某种产品,每单位(千件)的成本为1(千元),每次开工的固定成本为3(千元),工厂每季度的最大生产能力为6(千件)。经调查,市场对该产品的需求量第1、2、3、四季度分别为 2,3,2,4(千件)。若是工厂在第1、二季度将整年的需求都生产出来,天然能够下降成本(少付固定成本费),可是对于第3、四季度才能上市的产品需付存储费,每季每千件的存储费为0.5(千元)。还规定年初和年底这种产品均无库存。试制订一个生产计划,即安排每一个季度的产量,使一年的总费用(生产成本和存储费)最少。
根据过程的时间变量是离散的仍是连续的,分为离散时间决策过程(discrete-time decision process),即多阶段决策过程和连续时间决策过程(continuous-time decision process);根据过程的演变是肯定的仍是随机的,分为肯定性决策过程(deterministic decision process)和随机性决策过程(stochastic decision process),其中应用最广的是肯定性多阶段决策过程。
一个多阶段决策过程最优化问题的动态规划模型一般包含如下要素:
1.阶段
阶段(step)是对整个过程的天然划分。一般根据时间顺序或空间特征来划分阶段,以便按阶段的次序解优化问题。阶段变量通常用k=1,2,..,n表示。在例1中由A出发为k=1,由Bi(i=1,2)出发为k=2,依此下去从Di(i=1,2,3)出发为k=4,共n=4个阶段。在例2中按照第1、2、3、四季度分为k=1,2,3,4,共4个阶段。
2.状态
状态(state)表示每一个阶段开始时过程所处的天然情况。它应该可以描述过程的特征而且具备无后向性,即当某阶段的状态给定时,这个阶段之后过程的演变与该阶段之前各阶段的状态无关,即每一个状态都是过去历史的一个完整总结。一般还要求状态是直接或间接能够观测的。
描述状态的变量称状态变量(state variable)。变量容许取值的范围称容许状态集合(set of admissible states)。用xk表示第k阶段的状态变量,它能够是一个数或一个向量。用Xk表示第k阶段的容许状态集合。在例1中x2可取B1,B2,X2={B1,B2}。
n个阶段的决策过程有n+1个状态变量,xn+1表示xn演变的结果,在例1中x5取E。
根据过程演变的具体状况,状态变量能够是离散的或连续的。为了计算的方便有时将连续变量离散化;为了分析的方便有时又将离散变量视为连续的。
状态变量简称为状态。
3.决策
当一个阶段的状态肯定后,能够做出各类选择从而演变到下一阶段的某个状态,这种选择手段称为决策(decision),在最优控制问题中也称为控制(control)。
描述决策的变量称决策变量(decision variable)。变量容许取值的范围称容许决策集合(set of admissible decisions)。用uk(xk)表示第k阶段处于状态xk时的决策变量,它是xk的函数,用Uk(xk)表示了xk的容许决策集合。在例1中u2(B1)可取C1,C2,C3。
决策变量简称决策。
4.策略
决策组成的序列称为策略(policy)。由初始状态x1开始的全过程的策略记做p1n(x1),即p1n(x1)={u1(x1),u2(x2),...,un(xn)}。由第k阶段的状态xk开始到终止状态的后部子过程的策略记做pkn(xk),即pkn(xk)={uk(xk),uk+1(xk+1),...,un(xn)}。相似地,由第k到第j阶段的子过程的策略记做pkj(xk)={uk(xk),uk+1(xk+1),...,uj(xj)}。对于每个阶段k的某一给定的状态xk,可供选择的策略pkj(xk)有必定的范围,称为容许策略集合(set of admissible policies),用P1n(x1),Pkn(xk),Pkj(xk)表示。
5.状态转移方程
在肯定性过程当中,一旦某阶段的状态和决策为已知,下阶段的状态便彻底肯定。用状态转移方程(equation of state)表示这种演变规律,写做
在例1中状态转移方程为:xk+1=uk(xk)
6.指标函数和最优值函数
指标函数(objective function)是衡量过程优劣的数量指标,它是关于策略的数量函数,从阶段k到阶段n的指标函数用Vkn(xk,pkn(xk))表示,k=1,2,...,n。
可以用动态规划解决的问题的指标函数应具备可分离性,即Vkn可表为xk,uk,Vk+1 n 的函数,记为:
其中函数是一个关于变量Vk+1 n单调递增的函数。这一性质保证了最优化原理(principle of optimality)的成立,是动态规划的适用前提。
过程在第j 阶段的阶段指标取决于状态xj和决策uj,用vj(xj,uj)表示。阶段k到阶段n的指标由vj(j=k,k+1,..n)组成,常见的形式有:
阶段指标之和,即
阶段指标之积,即
阶段指标之极大(或极小),即
这些形式下第k到第j阶段子过程的指标函数为Vkj(xk,uk,xk+1,...,xj+1)。能够发现,上述(3)-(5)三个指标函数的形式都知足最优性原理。在例1中指标函数为(3)的形式,其中vj(xj,uj)是边<xj,uj(xj)>的权(边的长度),uj(xj)表示从xj出发根据决策uj(xj)下一步所到达的节点。
根据状态转移方程,指标函数Vkn还能够表示为状态xk和策略pkn的函数,即Vkn(xk,pkn)。在xk给定时指标函数Vkn对pkn的最优值称为最优值函数(optimal value function),记做fk(xk),即
其中opt可根据具体状况取max或min。上式的意义是,对于某个阶段k的某个状态xk,从该阶段k到最终目标阶段n的最优指标函数值等于从xk出发取遍全部能策略pkn所获得的最优指标值中最优的一个。
7.最优策略和最优轨线
使指标函数Vkn达到最优值的策略是从k开始的后部子过程的最优策略,记做pkn*={uk*,..un*},p1n*又是全过程的最优策略,简称最优策略(optimal policy)。从初始状态x1(=x1*)出发,过程按照p1n*和状态转移方程演变所经历的状态序列{x1*,x2*,..,xn+1*}称最优轨线(optimal trajectory)。