[转]: 五大基本算法——动态规划算法

每次决策依赖于当前状态,又随即引起状态的转移。一个决策的序列就是就是在变化的状态中产生出来的。

所以,这种多阶段最优化决策解决问题的过程叫动态规划。

一、算法思想

在思想上与分治法类似,将待求解问题分为若干个子问题,按顺序求解子阶段,前一子问题的解为后一子问题的求解提供了有用的休息。求解任一子问题时,可以列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢其舍弃其它局部解。依次解决各子问题。最后一个问题就是初始问题的解。

动态规划解决问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。

与分治法最大的差异是:适合于动态规划法求解的问题,经分解后问题往往不是相互独立的。

二、基本要素

1、最优子结构性质

大问题的最优解包含了小问题的最优解,小问题的最优解又可以合并成大问题的最优解。

一个最优化策略的子策略总是最优的,一个问题满足最优化原理又称其具有最优子结构性质。

2、重叠子问题性质

含有多个子问题,并且算法过程中会多次使用,这时动态规划法提供了查动态规划表的方法来简化流程,使重叠的子问题不会重复计算。

子问题之间不独立,一个子问题在下一个阶段决策中可能被多次使用。

3、无后效性

无后效性:上一阶段的解决方案一旦确定,状态就确定,只会影响下一步,而不会反向影响。

某一阶段状态一旦确定,就不会受此状态之后的决策影响。

二、基本步骤

处理的是一个多阶段决策问题,一般是由初始状态开始,对中间阶段决策的选择,达到结束时,这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线。

1、划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定是要有序的或者是可排序的。否则问题就无法求解。

2、确定状态和状态变量:将问题发展到各个阶段时所处于的客观情况用不同的状态表示出来,当然状态的选择要满足无后效性。

3、确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可以写出。但一般是根据前后的两个阶段的状态之间的关系来确定决策方法和状态转移方程的。

4、寻找边界条件:状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。

三、动态规划法与分治法的区别

1、动态规划法经分解得到的子问题往往不是互相独立的,而分治法必须要求子问题独立。
2、分治法可能会多次计算同一子问题,而动态规划法利用查动态规划表,保存已经计算过的子问题解,避免了重复计算。

四、动态规划法与贪心算法的区别

贪心算法性质:每一步选择都采取当前状态下最优的选择,而不着眼于全局最优。

动态规划法(最优子结构+重叠子问题)——>自底向上
每一步的最优解由上一步的局部最优解进行选择得出,因此需要保存之前求解的所有子问题的最优解备查。

贪心算法(最优子结构+贪心选择性质)——>自顶向下
每一步的最优解由上一步的最优解推导而得,当前最优解包含上一步的最优解,但之前的最优解不做保留。因此,在贪心算法中,做出的每一步决策都无法改变

相同点:两者都具有最优子结构性质(每一步的选择都将当前问题简化为一个规模更小的与原问题相同形式的子问题)

不同点:动态规划算法每步往往依赖于相关子问题的解,因而只有在解出相关子问题的解后才能做出选择。而贪心算法只着眼于当前状态的最优解,即局部最优选择,然后再去解出这个选择后的状态的相应的子问题。(自底向上与自顶向下)

区别两者的经典例子:0/1揹包问题与揹包问题

0/1揹包问题需采用动态规划算法达到最优解。
揹包问题采用贪心算法可求解。

对于0/1揹包问题,不能用贪心算法求解,为什么?

因为对该问题用贪心选择策略求解无法保证最后揹包被装满,闲置的揹包空间会影响每公斤揹包的价值,进而影响整体求解的最大价值。

0/1揹包问题应比较:选择与不选择两种方案的哪种更优,然后再进行下一步选择,这样会形成多个重叠子问题,须用动态规划中的动态规划表进行存储。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章