首页 > 编程学习 > 关于动态规划法

关于动态规划法

发布时间:2022/10/1 4:17:55

动态规划法是20世纪50年代由贝尔曼(R. Bellman)等人提出,用来解决多阶段决策过程问题的一种最优化方法。所谓多阶段决策过程,就是把研究问题分成若干个相互联系的阶段,由每个阶段都作出决策,从而使整个过程达到最优化。许多实际问题利用动态规划法处理,常比线性规划法更为有效,特别是对于那些离散型问题。实际上,动态规划法就是分多阶段进行决策,其基本思路是:按时空特点将复杂问题划分为相互联系的若干个阶段,在选定系统行进方向之后,逆着这个行进方向,从终点向始点计算,逐次对每个阶段寻找某种决策,使整个过程达到最优,故又称为逆序决策过程。

在这种多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,这种解决多阶段决策最优化问题的方法即动态规划方法。动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。

其基本思想是将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。

由此可知,动态规划法与分治法和贪心法类似,它们都是将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优解。其中贪心法的当前选择可能要依赖已经作出的所有选择,但不依赖于有待于做出的选择和子问题。因此贪心法自顶向下,一步一步地作出贪心选择;而分治法中的各个子问题是独立的(即不包含公共的子子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解。但不足的是,如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到全局最优解;如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。用分治法递归求解问题时,每次遇到子问题都会视为新问题,如果存在大量的重叠子问题,会极大地降低算法的效率,而动态规划法总是充分利用重叠子问题,对每个重叠的子问题仅计算1次,把解保存在一个需要时就可以查询的表中,并使得每次查表的时间为常数,从而提高了算法的执行效率。动态规划法以自底向上的方式计算出最优值,和贪心法一样要求问题具有最优子结构,但不同的是贪心法要求问题具有贪心选择性质,即问题的整体最优解能够通过贪心选择来得到。

动态规划法主要应用于最优化问题,这类问题会有多种可能的解,每个解都有一个值,而动态规划找出其中最优(最大或最小)值的解。若存在若干个取最优值的解的话,它只取其中的一个。但是要保证该问题的无后效性,即无论当前取哪个解,对后面的子问题都没有影响。在求解过程中,该方法也是通过求解局部子问题的解达到全局最优解,但与分治法和贪心法不同的是,动态规划允许这些子问题不独立,(亦即各子问题可包含公共的子子问题)也允许其通过自身子问题的解作出选择,该方法对每一个子问题只解一次,并将结果保存起来,避免每次碰到时都要重复计算。

动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法,动态规划方法并不具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划,可以解决各类最优化问题。

因此,在学习时除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。动态规划的基本模型分为如下5部分:

(1)确定问题的决策对象;

(2)对决策过程划分阶段;

(3)对各阶段确定状态变量;

(4)根据状态变量确定费用函数和目标函数;

(5)建立各阶段状态变量的转移过程,确定状态转移方程。

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

动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以,动态规划算法的空间复杂度要大于其它的算法。动态规划法所针对的问题有一个显著的特征,即它所对应的子问题树中的子问题呈现大量的重复。动态规划法的关键就在于,对于重复出现的子问题,只在第一次遇到时加以求解,并把答案保存起来,让以后再遇到时直接引用,不必重新求解。

作为一个非常有效的算法设计技术,在什么情况下应被采用呢?适合动态规划算法解决的问题往往具有以下两个性质:

(1)最优子结构。指一个问题的最优解中包含了其子问题的最优解。当一个问题具有最优子结构时,说明动态规划法可能适用。但是,在在这种情形下,贪心法也是有可能适用的。

(2)重叠子问题。指用来解决原问题的递归算法可反复地解同样的子问题,而不是总在产生新的子问题。即当一个递归算法不断调用同一个问题时,就可认为该问题包含重叠子问题。此时采用动态规划法优于分治法递归求解的原因是:分治法每次遇到子问题会视为是新问题,算法的效率被降低了,而动态规划法对于重叠子问题只进行一次,于是可以获得较好的计算效率。动态规划方法的典型应用场景包括解决背包问题、图象压缩、矩阵乘法链、最短路径、无交叉子集和元件折叠等。

如背包问题:解决背包问题的方法有多种,动态规划,贪心算法,回溯法,分支定界法都能解决背包问题。其中动态规划,回溯法,分支定界法都是解决0-1背包问题的方法。背包问题与0-1背包问题的不同点在于在选择物品装入背包时,可以只选择物品的一部分,而不一定是选择物品的全部。

Copyright © 2010-2022 mfbz.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号