这篇只是一些思考,没有动态规划的例子或者实现。
贪婪策略在解决计算规模非常大的NP完全问题时可以一试,虽然求出的是近似解,但这却是在计算能力不足或者允许时限内的最优方案了,不过如何找到最优解呢?
贪婪策略是取得局部的最优解,即部分的利益或效果最大化,以求得全局或最终结果的最优解(即近似最优的解决方案),
对于要解决的问题,该问题要由一些元素组成,每个元素都对最终结果有不同的影响,贪婪策略是取影响效果最大的元素来组成最终的近似结果
这是一种需要组合的问题,组成问题的各元素之间并没有什么顺序
但是有一种问题是每一步都会对下一步产生影响,他们是需要顺序的,或者说他们之间是存在联系的,这个在前一篇中中提到过。
这种联系有时候也是多样的
比如最终的容量是有限的,每走一步都会使总可用容量减少,而影响接下来每步的选择,或许有些选择产生的效果更大,但是可用容量却不足以放下这个选择
这种在约束条件下解出最优解的问题可以用动态规划解决
贪婪策略与动态规划
对于有约束条件的问题,贪婪策略会选择出所产生效果最大的那个元素,可是这样的话,选择完后整体仍然有一部分可用容量,而这些容量却不足以放下其他的选择,或者即使放下,但也会出现这样一种情况:比产生效果最大的那个元素小一些的两个或多个元素,占用空间并不多,其总和加起来却在一样的约束条件下产生了更大的效果,这是贪婪策略无法解决的。
问题就出现在当使用贪婪策略选择了效果最大的那个元素后,剩余空间即使能放下其他元素,其单位容量内所产生的效果也不如选择几个效果不及最大的元素,但占用容量更小,其总和效果却最大的组合方案。
问题变成了如何使剩余的小空间也能发挥最大的效果,这里所说的小空间其实不小,指的是在选择了一个或几个后,剩余空间的最优的解决方案(这里的最优,依旧是组合最优,而不是局部最优)
那么可以倒过来从解决小问题入手,让小空间可以产生大效果,即解决小容量时的最优解,慢慢增长解决大空间的最优解,如果有剩余空间的话那么之前解决的小空间的最优解就会派上用场,直接把之前的适合的小空间的最优解取出就可以得出全局的最优解
动态规划功能强大,它能够解决子问题并使用这些答案来解决大问题。 但仅当每个子问题都是离散的,即不依赖于其他子问题时,动态规划才管用