动态规划基础


众所周知,动态规划(Dynamic Programming)常用于解决最优化问题。能采用动态规划的问题具有两个重要的性质:最优子结构和子问题重叠性。下面就温习一下吧。


1. 最优子结构(Optimal substructure)

如果问题的一个最优解中包含了子问题的最优解,即原问题的最优解可以通过子问题的最优解构造,或者说可以利用子问题的最优解来构造原问题的一个最优解,则问题具有最优子结构性质。

(1) 装配线调度问题的最优子结构

“找出通过装配站 Si,j的最快路线”这个问题的最优解包含了“找出通过S1,j-1 或S2,j-1的最快路线“这个子问题的最优解。即“找出通过装配站 Si,j 的最快路线”这个问题的最优解可以通过“找出通过S1,j-1 或S2,j-1的最快路线“这个子问题的最优解来构造。

(2) 矩阵链乘法问题的最优子结构

假设AiAi+1...Aj的一个最优加全部括号把乘积在 A和 Ak+1 之间分开,则对AiAi+1...Aj最优加全部括号的“前缀“子链AiAi+1...Ak的加全部括号必须是AiAi+1...Ak的一个最优加全部括号。类似的,对于Ak+1...Aj这个子问题也是一样的。


在这证明子最优子结构时可用“剪贴”(cut-and-paste)的技术。其他能用动态规划的问题也是一样的分析。

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

1) 问题的一个解可以是做一种选择。例如,选择一个前一个装配线装配站(有两个选择);或者选择一个下标以在该位置分裂矩阵链(有j-i个选择)。

2) 对一个给定的问题,假设已知的是一个导致最优解的选择。不必关心如何确定这个选择。

3) Given this choice, you determine which subproblems ensue and how to best characterize the resulting space of subproblems.

4) You show that the solutions to the subproblems used within an optimal solution to the problem must themselves be optimal by using a “cut-and-paste” tech-nique. You do so by supposing that each of the subproblem solutions is not optimal and then deriving a contradiction. In particular, by “cutting out” the nonoptimal solution to each subproblem and “pasting in” the optimal one, you show that you can get a better solution to the original problem, thus contradict-ing your supposition that you already had an optimal solution. If an optimal solution gives rise to more than one subproblem, they are typically so similar that you can modify the cut-and-paste argument for one to apply to the others with little effort.

最优子结构在问题域中以两种方式变化:

1) 多少个子问题被使用在原问题的一个最优解中,以及

2) 决定一个最优解中使用哪些子问题时有多少个选择。

在装配线调度问题中,一个最优解只使用一个子问题,但为确定一个最优解必须考虑两种选择:通过装配站 Si,j 的最快路线,选择S1,j-1 或S2,j-1。子链AiAi+1...Aj的矩阵链乘法有两个子问题:AiAi+1...AkAk+1...Aj,但为确定一个最优解需考虑 j-i 种选择。


2. 子问题重叠性(Overlapping subproblems)

问题与子问题之间,子问题与子自问题之间等,它们之间共享资源,即它们包含了公共的解,通过从下到上解保证这些公共解只解一次,用到时查看表中已有的解即可。例如,在装配线调度中,通过装配站 Si,j 的最快路线这个问题与子问题通过S1,j-1 、S2,j-1的最快路线包含了共同的子问题,它们有很多公共解。

对等子问题之间的独立性:两个子问题之间步共享资源,这两个问题之间毫无瓜葛。例如,矩阵链乘法中AiAi+1...AkAk+1...Aj这两个问题之间毫无关系,它们是独立的。


在找出最优子结构和子问题重叠性后,写出递推公式,之后就是根据递推公式写代码了。写出递推公式是关键。而如何定义递推公式中各项的含义是关键,如定义m[i][j]为计算矩阵AiAi+1...Aj所需的标量乘法运算次数的最小值;c[i][j]为序列Xi和Yj的一个LCS长度。


在求解过程中要做备忘,以便在求解出最优值的同时构造这个最优解。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值