一个问题想要使用动态规划来解决,就必须满足以下条件:
优化原则(最优子结构性质):一个最优决策序列的任何子序列本身,一定是相对于子序列的初始和结束状态的最优决策序列。
在满足优化原则的情况下,依赖关系 + 约束条件(+初始条件) -> 目标函数的最值
动态规划设计要素:
1. 问题建模,优化的目标函数是什么?约束条件是什么?
2. 如何划分子问题(边界)?
3. 问题的优化函数值与子问题的优化函数值存在着什么依赖关系?(递推方程)
4. 是否满足优化原则?
5. 最小子问题怎样界定?其优化函数值,即初值等于什么?
动态规划算法设计要素
• 多阶段决策过程,每步处理一个子问题,界定子问题的边界
• 列出优化函数的递推方程及初值
• 问题要满足优化原则或最优子结构性质,即:一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列。
投资问题
问题:m 元钱,n项投资, fi (x): 将 x 元投入第 i 个项目的效益。求使得总效益最大的投资方案。
建模:问题的解是向量 < x1, x2, ..., xn >,xi 是投给项目i 的钱数,i =1, 2, ... , n。
目标函数:max{f1(x1)+f2(x2)+…+fn(xn)}
约束条件:x1+x2+…+xn = m,xi属于N
子问题界定:由参数 k 和 x 界定
k:考虑对项目1, 2, ..., k 的投资
x:投资总钱数不超过 x
背包问题
最长公共子序列
最短路径问题
输入:n个起点,m个终点,若干个中间点,若干条边。
输出:一条从起点到终点的最短路径。
矩阵链相乘
问题:设 A1, A2 , … , An 为矩阵序列,Ai 为 Pi-1* Pi 阶矩阵,i = 1, 2, … , n. 试确定矩阵的乘法顺序,使得元素相乘的总次数最少。
输入:向量P = < P0, P1, … , Pn >,其中 P0, P1, …, Pn为 n 个矩阵的行数与列数。
输出:矩阵链乘法加括号的位置。
矩阵A: i 行 j 列,B:j 行 k 列,A*B:i行k列,总计乘法次数为ijk次。
有n个矩阵,需要加(n-1)个括号来确定运算顺序,共有1/n*C(2*(n-1),(n-1))种加括号的方法。
实例: P = <10, 100, 5, 50>, A1: 10*100, A2: 100*5, A3: 5*50。
1. (A1A2)A3: 10*100*5+10*5*50 = 7500
2. A1(A2A3): 10*100*50+100*5*50 = 75000
第一种次序计算次数最少.