贪婪策略、枚举策略及动态规划都是常用的算法策略。贪婪策略和动态规划常常用于解决分阶段优化问题,枚举策略则理论上基本可以用于一切优化问题。对于多阶段的优化问题,动态规划是一个重要的算法策略。而使用算法策略的前提是要对该策略有深刻的认识,本文从贪婪策略和动态规划的联系以及枚举策略和动态规划的联系两个方面对动态规划进行分析和理解,并作出总结,动态规划是对贪婪策略和枚举策略之间的一个折衷方法。
我们知道贪婪策略的算法时间复杂度低,因为算法在个阶段作出的决策仅为当前阶段状态下的一个局部极值,这导致算法产生的最终结果可能不是一个全局最值。由1951年美国数学家R.Bellman等人提出的解决多阶段优化问题的最优化原理我们可以知道,算法满足贪婪策略是算法构成多阶段优化问题最优解的必要条件。多阶段优化问题的最优化原理描述为:一个过程的最优决策具有这样的性质,无论其初始状态和初始决策如何,其今后诸策略对以第一个决策所形成的状态作为初始状态的过程而言,必须构成最优策略;也就是说,对于任何一个整数k(1<k<n),不论前面k个决策时怎样的,以后的最优决策只取决于由前面决策所确定的当前状态。那么算法满足贪婪策略是不是算法构成多阶段优化问题最优解的充分条件呢?当然不是,只需要举出一个反例就可以证明。
枚举策略,又称为蛮力法,就是不加思索的在问题所有可能的解构成的空间中比较搜索,找出问题的最优解。该方法虽然是能够保证找到问题的最优解,但是算法时间复杂度高导致对于很多优化问题该算法策略是不可行的。
动态规划则在贪婪策略和枚举策略这两种“极端”的算法策略之间取得了较好的折衷,分析如下:
1.动态规划与贪婪策略
动态规划是一个多路的贪婪策略,贪婪策略各阶段决策为唯一结果(唯一局部极值),而动态规划各阶段决策为一组结果(多个局部极值)。
2.动态规划与枚举策略
动态规划在各阶段作出决策,排除那些不可能成为最优解的部分,随着阶段的递推,进而对枚举策略中构成的解空间进行裁剪,缩小了包含最优解的搜索空间,减少了搜索时间。
从上述分析我们可以将动态规划表示为:动态规划 = 多路贪婪策略 + 递推(裁剪枚举策略解空间) + 存储递推结果(构成下一阶段的状态)。
特别的,动态规划的阶段划分可以是递增式的也可以是递减式的。一般递减式使用的更多,但有时递增式会有意想不到的效果,而且有时递增式(用于构造解空间)和递减式(用于在解空间中搜索最优解)也同时使用。了解更多可以参考下面博文:
http://remyspot.blog.51cto.com/8218746/1327830
http://remyspot.blog.51cto.com/8218746/1543821