动态规划原理

动态规划原理及重构最优解原理

最优子结构

  1. 运用动态规划求解最优化问题第一步
    若一个问题的最优解中包含其子问题的最优解,则此问题具有最优解的结构性质。因为使用子问题的最优解构造原问题最优解,所以我们必须确保考察了最优解中用到的所有子问题

  2. 如何发掘最优子结构性质

    1. 证明问题最优解的第一个组成部分是做出一个选择。例如切割钢条的第一次切割位置。做出该选择后,将会产生一个或者多个待解的子问题。
    2. 对于一个给定的问题,在其可能的第一步选择中,假定已经知道哪种徐哲才会得到最优解。此时我们并不关心具体选择时如何得到的,只是假定已经知道了该选择
    3. 给定了可获得最优解的选择后,我们要确定这次选择将会产生哪些子问题,以及如何最好地刻画子问题空间。
    4. 利用“剪切-粘贴”技术证明(假设法)子问题的最优解就是原问题最优解的一部分。
    5. 刻画子问题空间的好经验就是尽量保持子问题空间尽可能简单,必要时才扩展它,并且我们要保持每个子问题的性质是一样的重点也是难点 )。
  3. 对于不同问题领域,最优子结构的不同体现在两个方面:

    1. 原问题的最优解中设计多少个子问题(子问题总数n),以及
    2. 在确定最优解使用哪些子问题时,我们需要考察多少种选择(每个子问题需要考察多少种选择m)。
    3. 我们可以用 n ∗ m n*m nm粗略分析动态规划算法的运行时间。
    4. 同样,子问题图也可以用来做同样的分析—结点代表子问题数,每个结点的出度代表每个子问题所对应的选择数。

注意如何判断问题是否具有最优子结构性质

  1. 子问题必须是无关的
    同一个原问题的子问题的解不影响另一个子问题的解(求解一个子问题时,用到了某些资源,则其他子问题在求解时则不可用该资源,若不用该资源问题可以得到解决,则称子问题无关,否则称为子问题相关)。

子问题重叠

  1. 子问题空间必须足够“小”,在递归过程中的特征就是会反复求解相同的子问题,而不是一直生成新的子问题。如果采用递归形式,若要解决重复计算相同子问题的问题,则可以采用“备份”的方式,对每个子问题之求解一次,下次遇到相同的子问题时,只要返回之前解决过的相同子问题的结果即可。这样可以大大减少运行时间。

重构最优解

  1. 若要重构最优解,则我们可以将每个子问题所做出的的选择存在一个表中,这样就不必根据代价值来重新计算来重构这些信息,从而减少运行时间。这个表的规模要与子问题规模一致。具体输出最优解的方案,需要结合子结构性质,大部分情况下需要采取递归形式来输出最优解方案
点赞