在看 “《算法导论》15.3动态规划原理--最优子结构通用模式” 时,感觉第四步的证明有问题,这里来分析一下,欢迎吐槽。
----------------------------------------------------------------------------------------
4. 证明:作为构成原问题最优解S的组成部分,每个子问题的解都是它自身的最优解。
使用反证法:
①假定 S是原问题 P的一个最优解,假定构成S的一个子问题 pi 的解 si,不是其自身的最优解,那么设 pi 的最优解为 si'。
②那么我们就可以从原问题的解S中“剪掉” pi 非最优解 si,将最优解 si' “粘贴”上去,从而得到原问题的一个更优的解 S'。
③这与S 是原问题的一个最优解矛盾。
命题得证。
(注:为了便于讨论,对书中给出的证明做了修改:将“子问题”修改“一个子问题”,并添加了符号。)
----------------------------------------------------------------------------------------
让我们来看看第②步推理使用的逻辑:
如果 pi的解 si' 与 si相比是一个更优的解,那么使用 si'在S中替换 si,即得一个比 S的更优的解 S'。
这并未说明其它子问题的解的变化情况,首先假设其它子问题的解均不变:
那么这样的逻辑隐含的假设是:S与 si 正相关。这没有根据。
然后我们假设构成S的其他子问题的解也均被替换为这些子问题更优的解:
那么这样的逻辑隐含的另一个假设就很明白了:
构成原问题的解的各个子问题的解之间,不存在负的相互作用(要么互不影响,要么正相关)。
这也是没有根据的。
----------------------------------------------------------------------------------------
由此,也弄清楚了的动态规划算法使用范围的两个限制:
①构成原问题解的子问题的解,与该原问题的解 正相关;
②构成原问题解的各个子问题的解之间,要么互不影响,要么正相关。
(一页之后书中给出了弱版本的说明)
当然如果只是将动态规划算法用于现实中数值非负的、系数为正的线性的问题中,是不会超出这两个限制的。