动态规划简介

来源:互联网 发布:photozoom pro mac 编辑:程序博客网 时间:2024/05/18 03:07

动态规划

  • 动态规划
    是一个多阶段决策过程:

  • 关于动态规划的几个概念
    决策:在一个阶段的状态给定以后,从该状态演变到下一阶段某个状态的一种选择称为决策。也就是在两个阶段间选择发展途径的行为。
    决策变量:描述决策的变量称决策变量,用一个数或一组数表示。不同的决策对应着不同的数值。
    决策序列:事件的发展过程之中需要经历n个阶段,需要做n次“决策”,这些“决策”就构成了事件整个发展过程的一个决策序列。

  • 采用动态规划需要满足的条件:
    (1)最优化原理(2)无后效性

    • 无后效性
        无后效性:对任意的阶段i,阶段i以后的行为仅依赖于i阶段的状态,而与i阶段之前过程如何达到这种状态的方式无关,这种性质称为无后效性。
        因状态满足无后效性,故在每个阶段选择决策时只需考虑当前的状态而无须考虑过程的历史。
      • 状态转移方程:
          阶段之间状态变量值的变化存在一定的关系,如果给定i阶段的状态变量x(i)的值后,第i+1阶段的状态变量x(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+1阶段的状态转移规律称为状态转移方程。
    • 最优化原理
        过程的最优决策序列具有如下性质:无论过程的初始状态和初始决策是什么,其余的决策都必须相对于初始决策所产生的状态构成一个最优决策序列。如下:

        一个最优策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的决策必须构成最优(子)策略。
        简而言之,一个最优策略的子策略应是最优的。延伸的说法:若全局是最优的,则局部亦是最优的。特征:如果整个序列是最优决策序列,则该序列中的任何一段子序列将是相对于该子序列所对应子问题的最优决策子序列(最优子结构)。如下:
  • 对动态规划带来的改进的理解
      若问题的决策序列由n次决策构成,而每次决策有p种选择,若采用枚举法,则可能的决策序列将有p^n个。而利用动态规划策略的求解过程中仅保存了所有子问题的最优解,而舍去了所有不能导致问题最优解的次优决策序列,可能有多项式的计算复杂度。
      动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其它的算法。


举例分析

(1)不能用动态规划解决的问题
  • 模4最优路径问题
    如下图,求由s至t的一条路径,使得该路径的长度模4的余数(即Length(s,t)mod 4)最小。

    此时,问题的一个最优决策序列是:
    s-3->v2-2->v3-3->t
      但最优性原理不一定成立:最优决策序列上的任一子决策序列相对于当前子问题不是最优的。
(2)采用动态规划解决的问题
  • 利用动态规划求解问题的方法
    第一步:证明问题满足最优性原理
      如果证明了所求解问题满足最优性原理,则说明用动态规划方法有可能解决该问题。
      所谓“问题满足最优性原理”即:问题的最优决策序列具有最优性原理所阐述的性质:最优子结构性。
    第二步:获得问题状态的递推关系式(即状态转移方程)
      能否求得各阶段间状态变换的递推关系式是解决问题的关键。
    f(x1,x2,…,xi) →xi+1向后递推
    f(xi,xi+1,…,xn)→xi-1向前递推

  • 最优决策序列的表示
    假设:
    1)S0是问题的初始状态
    2)问题需要做n次决策
    3)i阶段的决策值记为xi:,1≤i≤n。

  • 多段图问题
    【问题描述】
    多段图G=(V,E)是一个有向图,且具有特性:
      结点:结点集V被分成k≥2个不相交的子集合Vi,1≤i≤k,其中V1和Vk分别只有一个结点:s(源结点)和t(汇点)。
      : 每一子集合Vi定义图中的一段——共k段。
      : 所有的边(u,v)均具有如下性质: 设<u,v>∈E,若u∈Vi,则v∈Vi+1,即边连接在相邻的两段之间,从i段的某个结点u指向i+1段的某个结点v,1≤i≤k-1。
      成本:每条边<u,v>均附有成本,记为c(u,v)。
      s到t的路径:是一条从第1段的源点s出发,依次经过第2段的某结点v2,i,第3段的某结点v3,j、…、最后在第k段的汇点t结束的路径。该路径的成本是这条路径上边的成本之和。
      多段图问题:求由s到t的最小成本路径。

    【求解过程】

    • 最优性原理
        将生成从s到t的最小成本路径看成是在k-2个阶段(除s和t外)进行某种决策的多阶段决策过程:
        从s开始,第i次决策决定Vi+1(1≤i≤k-2)中的哪个结点在从s到t的最短路径上。问题:最优性原理对多段图问题成立吗?
        假设s,v2,v3,…,vk-1,t是一条由s到t的最短路径。
        1.初始状态:s
        2.初始决策:(s,v2), v2∈V2
        3.初始决策产生的状态:v2
        则,其余的决策:v3,…,vk-1相对于v2必须是一条从v2到t的最小成本子路径——最优性原理成立。
        若不然(最优性原理不成立),设v2,q3,…,qk-1,t是一条由v2到t的更短的路径,则s,v2,q3,…,qk-1,t将是比s,v2,v3,…,vk-1,t更短的从s到t的路径。与假设矛盾。故,最优性原理成立。
    • 向前处理的递推过程
      递推关系:

      具体过程:



    • 伪代码
    procedure FGRAPH(E,k,n,P)//输入是按段的顺序给结点编号的,有n个结点的k段图。E是边集,c(i,j)是边&lt;i,j>的成本。P(1:k)带出最小成本路径//real COST(n); integer D(n-1),P(k),r,j,k,nCOST(n)←0for j←n-1 to 1 by -1 do //计算COST(j)//   设r是具有性质:&lt;j,r>∈E且使c(j,r)+COST(r)取最小值的结点   COST(j)←c(j,r) + COST(r)   D(j) ←r    //记录决策值//repeatP(1)←1; P(k)←nfor j←2 to k-1 do     //找路径上的第j个结点//   P(j) ←D(P(j-1))    //回溯求出该路径//repeatend FGRAPH
    • 向后处理的递推过程

    同理,不再赘述。

  • 多段图问题的应用实例-资源的分配问题
      将n个资源分配给r个项目的问题:如果把j个资源,0≤j≤n,分配给项目i,可以获得N(i,j)的净利。
      问题:如何将这n个资源分配给r个项目才能使各项目获得的净利之和达到最大。
      转换成一个多段图问题求解。
    分析如下:

    对应的多段图如下(注意max):

  • [0/1背包问题] KNAP(1,j,X)
    【问题描述】
    相对于背包问题而言,该问题是对于一件物品指要么放,要么不放,不能选择放其中的一部分。如下:

    • 最优性原理
      初始状态:KNAP(1,n,M)
      初始决策:决定y1等于1还是等于0,两种情况分开讨论:

      • 若y1=0, 则KNAP(2,n,M)是初始决策产生的状态。此时,y2,…,yn必将相对于KNAP(2,n,M)将构成一个最优决策序列。否则,y1,y2,…,yn也就不是KNAP(1,n,M)的最优解了。
      • 若y1=1, 则KNAP(2,n,M-w1)是初始决策产生的状态。此时,y2,…,yn相对于KNAP(2,n,M-w1)也将构成一个最优决策序列。如若不然,设存在另一0/1序列z2,z3,…,zn,将是KNAP(1,n,M)的一个有更大效益值得序列。与假设矛盾。故,最优性原理成立。
    • 策略

      背包问题: n=3,(w1,w2,w3)=(2,3,4),(p1,p2,p3)=(1,2,5),M=6,如下:



      fi是关于X的阶跃函数,阶跃点是fi的关键点。每个阶跃点用其对应坐标表示——称为一个序偶,fi阶跃点的集合称为 fi的序偶集合,即:
    Si = {(Pj,Wj)|Wj是fi曲线中使得fi产生一次阶跃的X值, Pj=fi(Wj),0≤j≤r,r是阶跃点个数 }
      Si中的序偶是背包问题KNAP(1,i,X)在X各种取值情况下子问题的最优解。

    • 支配规则:反映曲线合并过程中的取大值规则。即:
        如果Si-1和 之一有序偶(Pj,Wj),另一有(Pk,Wk),且有 Wj≥Wk , Pj≤ Pk, 则序偶(Pj,Wj)将被舍弃。
      举例:
  • 每对结点之间的最短路径,即对单源最短路径问题的优化

    • 最优性原理
        i到j的最短路径(假设该路径中不包含环),设k是该路径上的一个中间结点,由i到k和k到j的两条子路径将分别是由i到k和由k到j的最短路径。(反证,否则i,…,k,…,j也将不是由i到j的最短路径)故,最优性原理对于该问题成立。


    • 伪代码
    procedure ALL-PATHS(COST,A,n) //COST(n,n)n结点图的成本邻接矩阵;A(i,j)是结点vivj的最短路径的成本;COST(i,i)=0,1≤in// integer i,j,k,n; real COST(n,n),A(n,n) for i←1 to n do    for j←1 to n do       A(i,j) ←COST(i,j)    //用COST(i,j)对A0赋初值//    repeat repeat for k←1 to n do           //k控制Ak (i,j) //    for i←1 to n do       for j←1 to n do          A (i,j) ← min{A (i,j) ,A (i,k) + A (k,j)}       repeat    repeat repeatend ALL-PATHS

    举例如下:



  • 最优二分检索树
    概念:
    二分检索树T是一棵二元树,它或者为空,或者其每个结点含有一个可以比较大小的数据元素,且有:
    1.T的左子树的所有元素比根结点中的元素小;
    2.T的右子树的所有元素比根结点中的元素大;
    3.T的左子树和右子树也是二分检索树。
    注:
    二分检索树要求树中所有结点的元素值互异;成功检索的情况共有n种,分别代表n个标识符之一,不成功检索的情况有n+1种(类似于二分检索)
    扩展的二分检索树表示:在二分检索树中加入表示不成功检索的外部结点。如下 图所示:

    • 最优二分检索树
      定义:具有最小加权平均检索次数的二分检索树。
      二分检索树的预期成本(加权平均比较次数)=**Σ每种情况出现的概率×该情况下所需的比较次数**
      一个简单的二分检索树如下:

      平均检索成本 = 成功检索部分的成本+不成功检索部分的成本,则,预期成本公式表示如下:
    • 思考:对于给定的标识符集合,已知成功与不成功检索的概率,什么形态的二分检索树才是最优的二分检索树?
      1.枚举法:列举各种形态的二分检索树,分析比较,找出最优的。
      2.动态规划策略:把构造二分检索树的过程看成一系列决策的结果。
  • 最长公共子序列
    【问题描述】在S1和S2中找出第三个螺旋S3,使得S3中的基以同样的顺序出现在S1和S2中,但不一定连续。然后视S3的长度,确定S1和S2的相似度。S3越长,S1和S2的相似度越大,反之越小。

    前缀:给定一个序列X=<x1,x2,…,xm>,对于i=0,1,…,m,定义X的第i个前缀为Xi=<x1,x2,…,xi>,即前i个元素构成的子序列。
    已知:设有序列X=<x1,x2,…,xm>和Y=<y1,y2,…,yn>,并设序列Z=<z1,z2,…,zk>为X和Y的任意一个LCS。
    (1)若xm=yn,则zk=xm=yn,且Zk-1是Xm-1和Yn-1的一个LCS。
    (2)若xm≠yn,则zk≠xm蕴含Z是Xm-1和Y的一个LCS。
    (3)若xm≠yn,则zk≠yn蕴含Z是X和Yn-1的一个LCS。
    给出递推关系式

    • 伪代码
    LCS-LENGTH(X,Y)m←length[X], n←length[Y]for i←1 to m  do c[i,0]←0  repeatfor j←1 to n  do c[0,j]←0  repeatfor i←1 to m do    for j←1 to n do       if xi = yj then          c[i,j] ← c[i-1,j-1]+1         b[i,j] ← "↖"      else if c[i-1,j]≥c[i,j-1] then               c[i,j] ← c[i-1,j]              b[i,j] ← "↑"           else c[i,j] ← c[i,j-1]                b[i,j] ← "←"           endif      endif  repeatrepeatEND LCS-LENGTH
  • 矩阵链乘法
      已知n个要相乘的矩阵构成一个矩阵链(序列)<A1,A2,…,An>,要计算矩阵乘积:A1A2…An。
      如,已知四个矩阵A1,A2,A3,A4,乘积A1A2A3A4可用五种不同的加括号方式完成:
    (A1(A2(A3A4))) (A1((A2A3)A4))
    ((A1A2)(A3A4)) ((A1(A2A3))A4)
    (((A1A2)A3)A4)
    问题:不同的加括号方式带来不同的计算模式,而不同的计算模式计算矩阵乘积的代价是不同的。如何使得代价最小?

  • 货郎担问题
    【问题描述】:某售货员要到若干个村庄售货,各村庄之间的路程是已知的,为了提高效率,售货员决定从所在商店出发,到每个村庄售一次货然后返回商店,问他应选择一条什么路线才能使所走的总路程最短?

    • 周游的问题
      1)欧拉回路:对一个连通有向图G=(V,E),欧拉回路是一条遍历图G中每条边一次,但可能不止一次地访问同一个结点的回路。可以在O(E)的时间内找出欧拉回路。
      2)哈密顿回路:一个有向图G=(V,E)的哈密顿回路是一个简单回路,它包含V中的每一个顶点。确定一个有向图是否存在哈密顿回路问题是NP完全的。
      3)货郎担回路:从指定结点出发,再回到该结点的最小成本简单回路。
    • 递推过程

      举例:

1 0
原创粉丝点击