动态规划(Dynamic Programming)
动态规划(DP):是求解多阶段决策
最优化的过程。将一个原问题按照时间或空间的特征分成若干个前后衔接的时空阶段,这样原问题将被拆分为一系列的子问题,求解多阶段问题过程就是求解一系列单阶段决策的问题过程。通过求得的子问题的解经组合就可得到原问题的解。
适用动态规划方法求解的最优化问题需要具备的两个要素:最优子结构
和子问题重叠
。
最优子结构:原问题的最优解包含子问题的最优解,即通过子问题的最优解来构造原问题的最优解。
子问题重叠:每个阶段求解产生的子问题不总是一个新问题,一个子问题可能在下一阶段决策中被多次使用到,为了避免重复计算子问题,将求解的每个子问题的解存入一张表中,当碰到相同的子问题时只需要查找表即可得到子问题的解,这样求解子问题只计算了一次,节省时间开销,查找表的时间代价是很小的,为常量时间。
动态规划算法的关键在于解决子问题重复计算的问题,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术。
动态规划与分治算法:
动态规划与分治算法思想是类似的,都是将原问题拆分为多个子问题,对子问题求解后再组合得到原问题的解。
分治算法经分解得到子问题往往是互相独立的,可能会重复计算子问题,所以适合用分治方法求解的问题通常在递归的每一步都生成全新的子问题。
动态规划算法经分解得到子问题往往不是互相独立的,该方法就是为了解决子问题重复计算的问题。适用动态规划方法求解的问题要有以下性质:最优子结构、无后效应和子问题重叠(这个不是必须的,不具备子问题重叠,也可以使用动态规划,但相对于分治算法来说占用空间多)。
相关概念
阶段变量:将求解问题的过程
适当地分成若干个相互联系的阶段
。描述阶段的变量称为阶段变量,比如用 “k” 表示。
状态变量:状态表示每个阶段开始面临的自然状况或客观条件,就是当前阶段(过程)的起点
,前一阶段终点,状态需要满足无后效应。描述状态的变量称状态变量,比如用 “x(k)” 表示。
无后效性
:无后效性是指在某个阶段上过程的状态已知,此阶段以后过程的发展变化仅与此阶段的状态有关,而与此阶段以前的阶段所经历过的状态无关。
决策变量:当一个阶段的状态(起点)给定以后,从该状态演变到下一阶段某个状态的一种选择
(行动)称为决策,决策(选择)可以有一个或多个。每个状态可供选取的策略范围称为允许策略集合。描述决策的变量称决策变量,比如用 “u(k)” 表示。
策略:由每个阶段的决策(选择)组成的序列称为策略。
状态转移方程:从第 k 阶段的状态经过决策得到第 k+1 阶段的状态,把这一关系看成 (x(k),u(k)) 与 x(k+1) 确定的对应关系,用 x(k+1) = Tk(x(k),u(k)) 表示,称为状态转移方程。
指标函数与最优值函数:用来衡量实现决策优劣的一个性能指标。如 "f(k,x)"表示。
边界条件:在求解区域边界上所满足的已知条件。状态转移方程是一个递推关系式,需要一个递推的终止条件或边界条件。
使用动态规划求解问题,最重要的就是确定动态规划三要素:
1、问题的阶段划分;
2、每个阶段的状态;
3、从当前阶段转化到下一个阶段的递推关系式。
实现方案:
自底向上法:
带备忘录的自顶向下法(记忆化搜索或备忘录法):
备忘录方法是动态规划方法的变形。与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上的。