算法设计初步之动态规划

理论知识

动态规划通常用来求解最优化问题。
最优化问题:这类问题的解可能有多个,每一个解对应一个值,我们希望寻找具有最优值的一个解。
适用于动态规划求解对最优子问题一般有两个要素:最优子结构和重叠子问题。
最优子结构是指:一个问题的最优解包含子问题的最优解;重叠子问题是指:问题的递归算法会反复求解相同的子问题
这里有一个要点,如何证明一个问题具有最优子结构性质?
我们采用复制—粘贴法:一般用反证法证明:假定子问题的解不是其自身的最优解,而存在“更优的解” ,那么我们可以从原问题的解中“剪切”掉这些“最优解”的部分,而将“更优的解”粘贴进去,从而得到原问题的一个“更优”解,这与最初的解是原问题最优解的前提假设相矛盾。因此,不可能存在“更优的解”。反之,原问题的子问题的解应是其自身的最优解——最优子结构性成立。

理解上面的知识之后,一般动态规划求解问题的步骤如下:
第一步:证明问题满足最优性原理
第二步:获得问题状态的递推关系式(即状态转移方程)
第三步:递归求解最优解的值
第四步:重构最优解
其中,状态转移方程的解释如下
状态转移方程: 第i+1阶段的状态变量x(i+1) 的值随x(i)和第i阶段的决策u(i)的值变化而变化,可以把这一关系看成(x(i),u(i))与x(i+1)的函数对应关系,用x(i+1)=Ti(x(i),u(i))表示。
我们也可以用子问题图来模拟递归求解过程
子问题图: 用于描述子问题与子问题之间的依赖关系。
值得注意,动态规划具有无后效性
无后效性: 对任意的阶段i,阶段i以后的行为仅依赖于i阶段的
状态,而与i阶段之前过程是如何达到这种状态的方式无关,这种性
质称为无后效性。

最后我们理解一下动态规划为什么能够给计算性能带来改变?
若问题的决策序列由n次决策构成,而每次决策有p种选择,若采用枚举法,则可能的决策序列将有p的n次方个。而利用动态规划策略的求解过程中仅保存了所有子问题的最优解,而舍去了所有不能导致问题最优解的次优决策序列,所以可能有多项式的计算复杂度。

一、钢条切割问题

在这里插入图片描述
实际该问题也是完全背包问题
第一步:我们假设dpi表示长度为i的钢条的最大收益,可以用反证法证明其划分的子问题dpj和dpi-j均具有最优子结构性(这个方法是两半都可能再次切割),这个问题还可以简化,如果划分的两半,一段可以继续切割记dpj,固定另一端值为ri-j,问题可以更简化
第二步:求递推方程,由上可以知道dpi可以划分为dpj和ri-j,则dpi就等于max(dpj+ri-j)其中,j从1到i
第三步:递归或者迭代求解最优解
在这里插入图片描述
在这里插入图片描述
两种方法实质就是递归求解和迭代求解的过程,一般推荐用第二种方法,由较小的子问题求解较大的子问题,这个时候上文所述的子问题图就可以发挥作用,通过它你可以清晰的了解你最先要求解的较小子问题是什么࿰

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值