动态规划算法设计
设计要素
- 问题建模,优化的目标函数是什么?约束条件是什么?
- 如何划分子问题(边界) ?
- 问题的优化函数值与子问题的优化函数值存在着什么依赖关系?(递推方程)
- 是否满足优化原则?
- 最小子问题怎样界定?其优化函数值,即初值等于什么?
矩阵链相乘
问题:设A1,A2,……,An为矩阵序列,Ai为Pi-1 X Pi阶矩阵,i =1,2,…,n.
试确定矩阵的乘法顺序,使得元素相乘的总次数最少。
输入:向量
P=< P0,P1,……,Pn>,其中P0,……Pn为n个矩阵的行数与列数
输出:矩阵链乘法加括号的位置.
动态规划算法
子问题划分
Ai… j:矩阵链AiAi+1…Aj,边界i,j
输入向量:< Pi-1,Pi,…Pj>
其最好划分的运算次数: m[i,j]
子问题的依赖关系
最优划分最后一次相乘发生在矩阵k的位置,即
Ai…j=Ai…k Ak+1…j
k+1.j
Ai…j最优运算次数依赖于Ai…k与Ak+1…j的最优运算次数
动态规划算法设计要素
- 多阶段决策过程,每步处理一个子问题,界定子问题的边界
- 列出优化函数的递推方程及初值
- 问题要满足优化原则或最优子结构性质,即:一个最优决策序列的任 何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列
动态规划算法的递归实现
- 动态规划算法的递归实现效率不高,原因在于同一子问题多次重复出现,每次出现都需要重新计算一遍.
- 采用空间换时间策略,记录每个子问题首次计算结果,后面再用时就直接取值,每个子问题只算一-次.
动态规划算法的迭代实现
迭代计算的关键
-
每个子问题只计算一次
-
迭代过程
从最小的子问题算起
考虑计算顺序,以保证后面用到的值
前面已经计算好
存储结构保存计算结果——备忘录 -
解的追踪
设计标记函数标记每步的决策
考虑根据标记函数追踪解的算法
两种实现的比较
递归实现:时间复杂性高,空间较小
迭代实现:时间复杂性低,空间消耗多
原因:递归实现子问题多次重复计算,子问题计算次数呈指数增长。迭代实现每个子问题只计算一次。
动态规划时间复杂度:
备忘录各项计算量之和+追踪解工作量
通常追踪工作量不超过计算工作量,是问题规模的多项式函数
动态规划算法的要素
- 划分子问题,确定子问题边界,将问 题求解转变成多步判断的过程
- 定义优化函数,以该函数极大(或极小 值作为依据,确定是否满足优化原则
- 列优化函数的递推方程和边界条件
- 自底向上计算,设计备忘录(表格)
- 考虑是否需要设立标记函数
- 用递推方程或备忘录估计时间复杂度