细解动态规划(一)

 
 
概述
 
  动态规划咱们在工做中会常常用到,有时候你会有这个意识,并且我相信你在项目中确定使用过,只是你不了解这种方式是“动态规划”而已。它最大的特色就是“空间换时间“。
 
  若是你想大体了解下,你能够直接略过细节,直接看“使用动态规划方法求解最优钢条切割问题”这一部分。细节部分,只是使用案例和数学公式教你们怎么去思考问题。
 
 
举例
  
 
  A公司购买长钢条,将其切割为短钢条出售(切割工序自己没有成本支出),A公司想知道最佳的切割方案。
  假定:给定一段长度为n米的钢条。长度与价格的关系为:i米的钢铁价格为p i(i=1, 2, ...)元。
  求:切割钢条方案,使得销售收益γ n最大。
  价格表的样例以下:
 
      

 

 
问题分析

   思路:经过假设法,寻找数据间的关系,进行建模。 数组

 

寻找数据间的关系1:

假设n=4,穷举全部的切割方式,找到最佳的切割方案。spa

不切(0刀):最高9元3d

1刀:最高10元blog

 

2刀:最高7元排序

 

3刀:最高4元递归

 

 
 从上面的图分析得出
  1) n米的钢条共有2 n-1种切割方案。
  2)最优策略方案为:将钢条切割为两段长度均为2米的钢条,总价值为10。
 
用数学符号开始演练:(咱们用加法符号表示切割,如  7 = 2 + 2 + 3,表示为长度7米的钢条切割段数为3段,每段分别为:2米、2米、3米。)
 
k为最优切割钢条方案中的段数,p i为i米钢条的价格,钢条切割的最大收益为γ n
 
 
寻找数据间的关系2:
 
根据价格表样例,寻找到全部最优收益值及对应的最优切个方案:
 

 

观察数据:(总长为5米的钢材最优收益是:2米刚才最优收益+3米钢材最优收益加和。)内存

 

 

 

从上述表,咱们能够得出:对于γn(n>= 1),咱们能够用更短的钢条的最优切割收益来描述它:数学

 

对于每一个i=一、二、...、n-1,方案步骤以下:class

  1)将钢条切割为长度为i和n-i的两段;效率

  2)求解这两段的最优切割收益γi和γn-i。——每种方案的最优收益为两段的最优收益之和。

因为没法预知那种方案会得到最优收益,咱们必须考察全部可能的i,选取其中收益最大者。

 
   最优子结构:为了求解规模为n的原问题,咱们先求解形式彻底同样,规模更小的子问题。经过组合两个相关子问题的最优解,并在全部可能的两段切割方案中选取组合收益最大者,构成原问题的最优解。
 
  咱们称钢条切割问题知足 最优子结构性质:问题的最优解由相关子问题的最优解组合而成,而这些子问题能够独立求解。
 
 
求解简化版本

 

原有方式:

简化版本:钢条从左边切割下长度为i的一段,对左边的一段i再也不进行切割,只对右边剩下的长度为n-i的一段继续进行切割(采用了一种自顶向下的递归方式)

 

递归方法CUT-ROD以下:
 

 

分析CUT-ROD:实际运行中,你会发现CUT-ROD的效率不好。由于CUT-ROD反复地用相同的参数值对自身进行递归调用,即它反复求解相同的子问题,以下图所示:

 

CUT-ROD的运行时间为n的指数,时间复杂度以下:

 


 
使用 动态规划方法求解最优钢条切割问题

 

  动态规划方法的核心思想是:对每一个子问题只求解一次,并将结果保存下来。若是随后再次须要此子问题的解,只需查找保存的结果,而没必要从新计算。所以,动态规划方法是付出额外的内存空间来节省计算时间,是典型的时空权衡的例子。

 

  方法1:带备忘的自顶向下法。此方法扔按天然的递归形式编写,但过程会保存每一个子问题的解(一般保存在数组或散列中)。当须要一个子问题解时,过程首先检查是否已保存过此解,无则计算,有则返回。

 

  方法2:自底向上法。将子问题按规模排序,按由小至大顺序求解。当求解某个子问题时,它所依赖的那些更小的子问题都已求解完毕,结果已保存。每一个子问题只需求解一次,当咱们求解它时,它的全部前提子问题都已经求解完成。

 

 

 


 
子问题图

 

   当思考一个动态规划问题时,咱们应该弄清所涉及的子问题及子问题之间的依赖关系。

  

  上面举得n=4时,钢条切割问题的子问题图以下:这是递归调用树的简化版,树中标号相同的节点收缩为图中的单一顶点,全部边均从父节点指向子节点。

  

上面的图中,咱们能够把每一个顶点向量化,标记为(x,y)。这个表示求解x的问题时候,咱们须要子问题y的解。

 

 
推荐
 
 
 
相关文章
相关标签/搜索