您的位置:首页 > 其它

动态规划之理论基础(0)

2013-05-15 16:45 309 查看
一、基本概念

1、定义:动态规划,dynamic programming,是通过组合子问题的解而得到整个问题的解。其中的Programming指的是tabular method,可译为:表格法 --- 填表和查表。

2、应用:动态规划通常用于最优化问题,此类问题可能有很多种可行解,每一个解有一个值对应一组选择,即我们要从中作出一组合适的选择以得到一个最优(最大或最小)值的解(最优解也可能不止存在一个)。

3、与分治法的区别

动态规划法经常与分治法放在一起比较,因为他们类似:都是把问题一层一层地分解为规模逐渐减小同类型子问题

但动态规划法与分治法的一个重要区别在于:用分治法分解后得到的子问题通常都是相互独立的全新的子问题;而用动态规划法分解后得到的子问题很多都是相互独立的重叠的子问题(关于为什么动态规划法分解的子问题也必须是独立的后面会讲)。动态规划算法正是总分利用了重叠子问题,即通过每个子问题只求解一次,把解保存在一个需要时就可以查看的表中(每次查表的时间为常数),提高了算法的效率。

4、独立子问题与重叠 子问题的概念

任何的不理解或理解偏差基本上都源于对事物概念的模糊。

下面就具体说说这些概念问题---独立子问题是什么意思?什么又叫重叠子问题?这也有助于理解动态规划法本身以及其与分治法的区别。

独立子问题:是指一个子问题的解不会影响同一个问题中另外一个子问题的解,即它们之间不存在共享资源的情况。
重叠子问题:是指多个问题在求解时存在重复地调用同一个子子问题,则称该子子问题是重叠的,即重复被使用。

动态规划法要求子问题既独立又重叠。独立和重叠的概念并不互斥,它们描述了两种不同的概念,而不是同一个问题的两个方面。由上面的概念知道:独立指位于同一问题下的各子问题之间的关系;而重叠指多个问题调用同一子问题,我们称该子问题对这多个问题来说是重叠的子问题。

5、吹毛求疵:有很多书籍或文章在描述动态规划法和分治法的区别时会强调子问题之间相互独立是二者的区别,其实这种说法是不严谨的,动态规划法也要求其子问题必须是独立的。其中《Introduction to Algorithms》(Third Edition)就有说明(P384):



中文版《算法导论》(Second Edition)虽说是经典中的经典,但翻译过来的东西在其准确性和质量上未免会打点折扣,瑕疵还是有的。在第15章(P192)的开头第一段:【分治法算法是指 ....。与此不同,动态规划适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题】,再开对照下原版怎么说的:



即不是说【动态规划子问题不是独立的】而是指:overlap,即重叠之意,故应翻译为:【动态规划适用于子问题重叠的情况】,要稍微好理解一点。

当然不可否认,这本书翻译的还是相当有水平的,言简意赅,这里我吹毛求疵了。

二、基本步骤

动态规划算法的设计可以可以分为如下4个步骤

描述最优解的结构特征;
递归定义最优解的值;
递推求解最优解的值;
递归构造一个最优解(一组选择的集合---需要利用计算的结果)。

其中第1-3步构成问题的动态规划的基础;第4步在只要求计算最优解的值时可以略去。如果需要做第4步,则有时需要在第3步的计算中记录一些附加信息,这有利于更加容易地构造一个最优解。

三、基本要素

适合采用动态对话方法的最优化问题中有两个基本要素:最优子结构和重叠子问题。

1、最优子结构

定义:如果问题的一个最优解中包含了子问题的最优解,则该问题具有最优子结构。

故我们就可以利用一些子问题的最优解最终得到问题的一个最优解。

:当一个问题具有最优子结构时,提示我们动态规划法可能适用。

共同的模式:在寻找最优子结构时,可以遵循一种共同的模式:

问题的一个解可看做是:一个选择,做这种选择会得到一个或多个有待解决的子问题;
假设:对一个给定的问题,已知做出某一种选择可以得到其最优解。而不必关心怎么得到这个选择,仅仅假设已经得到了这个选择就是。
在已知这个选择后,要确定哪些子问题会随之发生,以及如何最好地描述所得到的子问题空间(描述子问题空间的经验规则:尽可能地保持这个空间简单,然后在需要时再去扩充它)。
利用一种【剪贴】(cut-and-paste)技术,证明在问题的一个最优解中,使用的子问题的解本身也是最优的。

剪贴技术,其在最优问题的证明之中,非常有用。如证明:某一问题P的最优解S使用的子问题解也是最优的。

利用反证法的思想,首先假设存在另外的子问题解Si*,且其优于当前子问题的最优解Si。则把问题P使用的子问题解Si换成Si*后,此时问题P的解要优于原来的最优解S,这与问题p的解S是最优的相矛盾。故可证明问题P的最优解使用的子问题解也是最优的。

2、重叠子问题

适用于动态规划求解的最优化问题必须具有的第二个要素:重叠子问题,在子问题的空间很小时,用来求解原问题的递归算法反复地解同样的子问题,而不是总是产生新的子问题(如分治法)。当一个递归算法不断地调用同一问题时,我们说该最优问题包含重叠子问题。即该子问题被多次重复用到。操作时对其只需计算一次,后面的多次用到时调用第一次计算的结果即可。这大大节省了计算时间。

通常,对子问题从小到大,依次递推地计算其最优解,存于表中,供较大的问题调用它时使用。这则对应于基本步骤的第3步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: