動態規劃思想詳解及示例實現

本文以兩個具體例子詳細剖析動態規劃算法設計思想,主要參考聖經《算法導論》,加上本身的一些理解,主要是附上了一些具體實現過程,因此但願能對你們有所幫助。算法

#_*_ coding:utf-8 _*_spa

import numpy as np設計

def MemoizedCutRodAux(p,n,r,s):3d

    if r[n]>=0:blog

        return r[n]utf-8

    if n==0:io

        q=0import

        c=0coding

    else:numpy

        q=-1

        c=-1

        for i in range(1,n+1):

            if q<(p[i]+MemoizedCutRodAux(p,n-i,r,s)):

                q=p[i]+MemoizedCutRodAux(p,n-i,r,s)

                c=i

    r[n]=q

    s[n]=c

    return q

def MemoizedCutRod(p,n):

    r=-np.ones(n+1)

    s = -np.ones(n + 1)

    MemoizedCutRodAux(p,n,r,s)

    return r,s

if __name__=='__main__':

    p=np.array([0,1,5,8,9,10,17,17,20,24,30])

    r,s=MemoizedCutRod(p, 10)

    print r

    print s

 

結果輸出:

r=[  0.   1.   5.   8.  10.  13.  17.  18.  22.  25.  30.]

s=[  0.   1.   2.   3.   2.   2.   6.   1.   2.   3.  10.]

import numpy as np

def BottomUpCutRod(p,n):

    r = -np.ones(n + 1)

    s = -np.ones(n + 1)

    r[0]=0

    s[0]=0

    q=-1

    for j in range(1,n+1):

        for i in range(1,j+1):

            if q<(p[i]+r[j-i]):

                q=p[i]+r[j-i]

                s[j]=i

        r[j]=q

    return r,s

if __name__=='__main__':

    p = np.array([0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30])

    r,s= BottomUpCutRod(p,10)

    print r

    print s

步驟三:採用自底向上迭代法計算最優解的值

import numpy as np

def MatrixChain(p):

    n=p.size-1

    m=np.ones((n+1,n+1))*np.inf

    s = np.zeros((n+1, n+1))

    for i in range(n+1):

        m[i,i]=0

    for lenth in range(2,n+1):

        for i in range(1,n-lenth+2):

            j=i+lenth-1

            for k in range(i,j):

                q=m[i,k]+m[k+1,j]+p[i-1]*p[k]*p[j]

                if q<m[i,j]:

                    m[i,j]=q

                    s[i,j]=k

    return m,s

if __name__=='__main__':

    p=np.array([50,10,40,30,5])

    m,s=MatrixChain(p)

    print m

print s

 

結果輸出

 

m=[[     0.     inf     inf     inf     inf]

      [    inf      0.  20000.  27000.  10500.]

      [    inf     inf      0.  12000.   8000.]

      [    inf     inf     inf      0.   6000.]

      [    inf     inf     inf     inf      0.]]

s=[[ 0.  0.  0.  0.  0.]

    [ 0.  0.  1.  1.  1.]

    [ 0.  0.  0.  2.  2.]

    [ 0.  0.  0.  0.  3.]

    [ 0.  0.  0.  0.  0.]]

 

 

----------------------------------------------------------------------------------------------

本文爲做者原創,其中代碼都是能夠運行經過(Python),但願有所幫助

相關文章
相關標籤/搜索