转自http://software.intel.com/zh-cn/blogs/2011/11/29/400009261/?cid=sw:prccsdn2078
动态规划是运筹学的一个分支,是求解决策过程最优化的数学方法,在解决实际问题中经常被使用。
动态规划三要素:阶段,状态,决策
1、阶段是对整个过程的自然划分
2、状态表示每个阶段开始时过程所处的自然状况
3、当一个阶段的状态确定后,可以作出各种选择从而演变到下一阶段的某个状态,这种选择手段称为决策
找出此类问题的关键:
1、能够用动态规划来求解(这是基本前提)
利用最优性原理来进行判断(这里不做解释)
2、获得状态转移方程(这是重点)
可以看做动态规划求解实际问题的时候,就是来获得当某阶段的状态和决策为已知,下阶段的状态可以通过该阶段来表示出来,而且它们之间满足一个状态转移方程:X[k+1]=T[k](X[k],U[k](X[k]))
3、根据题目要求对决策过程中产生的中间状态进行选取(如0/1背包问题中要求不超过重量上限的情况下获得最大效益,这里面获得大效益便是一个限制条件,可以用来在中间决策中产生的状态中进行选择
这里总结一下一般思路:
拿到多阶段决策最优化问题后,第一步要判断这个问题是否可以用动态规划解决,如果不能就要考虑搜索或贪心了。当确定问题可以用动态规划后,就要用下面介绍的方法解决问题了:
(1)模型匹配法:
最先考虑的就是这个方法了。挖掘问题的本质,如果发现问题是自己熟悉的某个基本的模型,就直接套用,但要小心其中的一些小的变动,现在考题办都是基本模型的变形套用时要小心条件,三思而后行。这些基本模型在先面的分类中将一一介绍。
(2)三要素法
仔细分析问题尝试着确定动态规划的三要素,不同问题的却定方向不同:
先确定阶段的问题:数塔问题,和走路问题
先确定状态的问题:大多数都是先确定状态的。
先确定决策的问题:背包问题
(3)寻找规律、拼凑法:
这个方法很简单,耐心推几组数据后,看他们的规律,总结规律间的共性,这里一般可以比较容易的得到状态转移方程,也就是确定下一阶段与前一阶段之间的联系
(4)边界条件法
找到问题的边界条件,然后考虑边界条件与它的领接状态之间的关系。这个方法也很起效。
(5)放宽约束和增加约束
这个思想是在陈启锋的论文里看到的,具体内容就是给问题增加一些条件或删除一些条件使问题变的清晰