动态规划

动态规划概述

动态规划(dynamic programming)是运筹学的一个分支,是求解决策历程(decision process)最优化的数学方式。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策历程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段历程转化为一系列单阶段问题逐个求解,创立了解决这类历程优化问题的新方式——动态规划。

在现实生活中,有一类行为的历程,由于它的特殊性,可将历程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个历程达到最好的行为效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的进展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个历程的一条行为路线。这种把一个问题看做是一个前后关联具备链状结构的多阶段历程就称为多阶段决策历程,这种问题称为多阶段决策最优化问题。每个阶段中,都求出本阶段的各个初始状态到历程终点的最短路径和最短距离,当逆序倒推到历程起点时,便得到了全历程的最短路径及最短距离,同时附带得到了一组最优结果。

动态规划算法基本思想

动态规划算法通常用于求解具备某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具备最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法区别的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具备相同的填表格式。

动态规划算法基本结构

多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,称这种解决多阶段决策最优化问题的方式为动态规划方式。

动态规划程序设计是对解最优化问题的一种途径、一种方式,而不是一种特殊算法。不象前面所述的那些搜索或数值计算那样,具备一个标准的数学表达式和明确清晰的解题方式。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质区别,确定最优解的条件也互不相同,因而动态规划的设计方式对区别的问题,有各具特色的解题方式,而不存在一种万能的动态规划,可以解决各类最优化问题。因此在学习时,除了要对基本概念和方式正确理解外,必须具体问题具体解析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。根据上例解析和动态规划的基本概念,可以得到动态规划的基本模型如下:

  • (1)确定问题的决策对象。
  • (2)对决策历程划分阶段。
  • (3)对各阶段确定状态变量。
  • (4)根据状态变量确定费用函数和目标函数。
  • (5)建立各阶段状态变量的转移历程,确定状态转移方程。

动态规划的基本定理和基本方程

动态规划进展的早期阶段,从简单逻辑出发给出了所谓最优性原理,然后在最优策略存在的前提下导出基本方程,再由这个方程求解最优策略。后来在动态规划的应用历程中发现,最优性原理不是对任何决策历程普遍成立,它与基本方程不是无条件等价,二者之间也不存在任何确定的蕴含关系。基本方程在动态规划中起着更为本质的作用。

对于初始状态,策略是最优策略的充要条件是对于任意的k,,有

若是最优策略,则对于任意的k,1<k<n,它的子策略对于由x1和确定的以为起点的第k到n后部子历程而言,也是最优策略。

上述推论称为最优化原理,它给出了最优策略的必要条件,通常略述为:不论过去的状态和决策如何,对于前面的决策形成的当前的状态而言,余下的各个决策必定构成最优策略。

根据基本定理的推论可以得到动态规划的基本方程:

(1)

其中fn + 1(xn + 1) = δ(xn + 1)是决策历程的终端条件,δ为一个已知函数。当xn + 1只取固定的状态时称固定终端;当xn + 1可在终端集合Xn + 1中变动时称自由终端。最终要求的最优指标函数满足(2)式:

(2)

(1)式是一个递归公式,如果目标状态确定,当然可以直接利用该公式递归求出最优值(这种递归方式将在后文介绍,称作备忘录法),但是一般在实际应用中我们通常将该递归公式改为递推公式求解,这样一般效率会更高一些。

动态规划适用条件

任何思想方式都有一定的局限性,超出了特定条件,它就失去了作用。同样,动态规划也并不是万能的。适用动态规划的问题必须满足最优化原理和无后效性。

  • 1.最优化原理(最优子结构性质)
    • 最优化原理可这样阐述:一个最优化策略具备这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具备最优子结构性质。
  • 2.无后向性
    • 将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。
  • 3.子问题的重叠性
    • 动态规划将原来具备指数级复杂度的搜索算法改进成了具备多项式时间的算法。其中的关键在于解决冗余,这是动态规划算法的根本目的。

动态规划实质上是一种以空间换时间的技术,它在实现的历程中,不得不存储产生历程中的各种状态,所以它的空间复杂度要大于其它的算法。

动态规划应用

在经济经营管理、出产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存经营管理、资源分配、设备更新、排序、装载等问题,用动态规划方式比用其它方式求解更为方便。

动态规划应用的历史事件

  • 1956年,C·庞特里雅金提出了最优控制的极大值原理,1957年R·贝尔曼创立了动态规划方式,这些方式首先提出了用目标函数指标来设计控制系统的思想,并能解诀非线性和时变系统的设计问题。
  • 1969年,Merton对在完全市场中,服票价格历程服从扩散历程,股票无红利,投入者也无非资本利得且效用函数为常数相对危机厌恶、常数绝对危机厌恶等严格条件下,将动态规划方式运用于最优投入与消费选择策略的求解,给出了连续时间下两类资产的最优投入与消费问题的解决办法。
  • 1969,1971年,Merton最早将动态规划方式运用到最优投入与消费问题的求解,以后的许多学者都运用了此方式。
  • 1973年,Johnson等人把动态规划方式和模拟技术结合起来使用,确定联台运用系统的工程规模取得了成功。
  • 1974年HuPpe产,采用动态规划方式来规划气田的出产。
  • 1982年,曾赛星、李寿声采用动态规划方式确定内蒙古河套灌区各种作物的灌水定额及灌水次数。
  • 1988年黄强把模糊动态规划方式用于求解水电站水库长期优化调度问题,较随机动态规划法简便,计算速度快。
  • 1989年,曾赛星、李寿声等针对内蒙古河套灌区永联试区的具体状况,运用大系统分解协调方式建立了灌区优化灌溉制度及地面水、地下水联合运用的谱系模型,模型中第一层子系统优化采用动态规划方式确定各种作物的灌溉制度。
  • 1989年,曾树星等在内蒙古河套地区水资源优化调度中,采用动态规划方式确定各种作物的灌水定额及灌水次数。
  • 1991年,林学钛等人在对河南平顶山市地表水与地下水的联合经营管理研究中,运用动态规划方式对白龟山水库实行了优化调度。

动态规划实现中的问题

应用动态规划解决问题,在有了基本的思路之后,一般来说,算法实现是比较好考虑的。但有时也会遇到一些问题,而使算法难以实现。动态规划思想设计的算法从整体上来看基本都是按照得出的递推关系式实行递推,这种递推相对于计算机来说,只要设计得当,效率往往是比较高的,这样在时间上溢出的可能性不大,而相反地,动态规划需要很大的空间以存储中间产生的结果,这样可以使包含同一个子问题的所有问题共用一个子问题解,从而体现动态规划的优越性,但这是以牺牲空间为代价的,为了有效地访问已有结果,数据也不易压缩存储,因而空间矛盾是比较突出的。另一方面,动态规划的高时效性往往要通过大的测试数据体现出来(以与搜索作比较),因而,对于大规模的问题如何在基本不影响运行速度的条件下,解决空间溢出的问题,是动态规划解决问题时一个普遍会遇到的问题。

对于这个问题,可以考虑从以下一些方面去尝试:

一个思考方向是尽可能少占用空间。如从结点的数据结构上考虑,仅仅存储必不可少的内容,以及数据存储范围上精打细算(按位存储、压缩存储等)。当然这要因问题而异,实行解析。另外,在实现动态规划时,一个我们经常采用的方式是用一个与结点数一样多的数组来存储每一步的决策,这对于倒推求得一种实现最优解的方式是十分方便的,而且处理速度也有一些提高。但是在内存空间紧张的状况下,我们就应该抓住问题的紧要矛盾。省去这个存储决策的数组,而改成在从最优解逐级倒推时,再计算一次,选择某个可能达到这个值的上一阶段的状态,直到推出结果为止。这样做,在程序编写上比上一种做法稍微多花一点时间,运行的时效也可能会有一些(但往往很小)的下降,但却换来了很多的空间。因而这种思想在处理某些问题时,是很有意义的。

但有时,即使采用这样的方式也会发现空间溢出的问题。这时就要解析,这些保留下来的数据是否有必要同时存在于内存之中。因为有很多问题,动态规划递推在处理后面的内容时,前面比较远处的内容实际上是用不着的。对于这类问题,在已经确信不会再被使用的数据上覆盖数据,从而使空间得以重复利用,如果能有效地使用这一手段,对于相当大规模的问题,空间也不至于溢出(为了求出最优方案,保留每一步的决策仍是必要的,这同样需要空间)。

一般地说,这种方式可以通过两种思路来实现:一种是递推结果仅使用Data1和Data2这样两个数组,每次将Data1作为上一阶段,推得Data2数组,然后,将Data2通过复制覆盖到Data1之上,如此反复,即可推得最终结果。这种做法有一个局限性,就是对于递推与前面若干阶段相关的问题,这种做法就比较麻烦;而且,每递推一级,就需要复制很多的内容,与前面多个阶段相关的问题影响更大。另外一种实现方式是,对于一个可能与前N个阶段相关的问题,建立数组Data[0..N],其中各项为最近N各阶段的保存数据。这样不采用这种内存节约方式时对于阶段k的访问只要对应成对数组Data中下标为kmod(N+1)的单元的访问就可以了。这种处理方式对于程序修改的代码很少,速度几乎不受影响,而且需要保留区别的阶段数也都能很容易实现。

当采用以上方式仍无法解决内存问题时,也可以采用对内存的动态申请来使绝大多数状况能有效出解。而且,使用动态内存还有一点好处,就是在重复使用内存而实行交换时,可以只对指针实行交换,而不复制数据,这在实践中也是十分有效的。]

郑重声明:东方财富网发布此信息的目的在于传播更多信息,与本站立场无关。东方财富网不保证该信息(包含但不限于文字、数据及图表)全部或者部分内容的准确性、真实性、完整性、有效性、及时性、原创性等。相关信息并未经过本网站证实,不对您构成任何投资建议,据此操作,风险自担。

扫一扫下载APP

扫一扫下载APP
信息网络传播视听节目许可证:0908328号 经营证券期货业务许可证编号:913101046312860336 违法和不良信息举报:021-61278686 举报邮箱:jubao@eastmoney.com
沪ICP证:沪B2-20070217 网站备案号:沪ICP备05006054号-11 沪公网安备 31010402000120号 版权所有:东方财富网 意见与建议:4000300059/952500