您的位置:首页 > 其它

动态规划 dynamic programming 

2007-06-10 21:43 225 查看
       动态规划(dynamic programming)是运筹学的一个重要分支,它是解决多阶段决策问题的一种有效的数量化方法 .1957年贝尔曼发表了《动态规划》一书,标志着运筹学这一重要分支的诞生.

     一般来说,适合动态规划的问题需要有两个特性。

    1 优化子机构(optimal substructre)

    2 重叠子问题( overlapping subproblems), 这与分治(divide -conquer)正好相反。分治总是产生新的子问题。而dp求解过的子问题结果可以在以后的计算中重复使用。

 3 无后向性

    dp的一个变形是备忘录方法。备忘录方法采取自顶向下的方法,dp采用自底向上的方法。

矩阵链乘(matrix chain order)问题:

给定n个矩阵{A1,A2,…,An}。其中Ai与Ai+1是可乘的,i=1,2,…,n-1。要求计算出这n个矩阵的连乘积A1A2…An。

设这3个矩阵的维数分别为10×100,100×5和5×50。若按第一种加括号方式((A1A2)A3)来计算,总共需要10×100×5+10×5×50=7500次的数乘。若按第二种加括号方式(A1(A2A3))来计算,则需要的数乘次数为100×5×50+10×100×50=75000。第二种加括号方式的计算量是第一种加括号方式的计算量的10倍。由此可见,在计算矩阵连乘积时,加括号方式,即计算次序对计算量有很大影响。

对于矩阵连乘积的最优计算次序问题,设计算Ai…j ,1≤i≤j≤n,所需的最少数乘次数为m[i,j],原问题的最优值为m[1,n]。

当i=j时,Ai…j=Ai为单一矩阵,无需计算,因此m[i,i]=0,i=1,2,…,n ;

当i<j时,可利用最优子结构性质来计算m[i,j]。事实上,若计算Ai…j的最优次序在Ak和Ak+1之间断开,i≤k<j,则:m[i,j]=m[i,k]+m[k+1,j]+pi-1pkpj

算法按照
    m[1,1]
    m[2,2]   m[1,2]
    m[3,3]   m[2,3]   m[1,3]
    ...      ...      ...
    m[n,n]   m[n-1,n] ... ....  ... m[1,n]
的顺序根据公式(2.1)计算m[i,j]。
该算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)。由此可见,动态规划算法比穷举搜索法要有效得多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 matrix 优化