矩陣連乘問題 python實現

2021-08-18 17:06:23 字數 1523 閱讀 9212

importnumpyasnp

#求最優值 並記錄相關資訊

defmatrixchain(p,n,m,s):

#單個矩陣連乘的次數

foriinrange(n):

m[i][i]=0

s[i][i]=0

#r 表示連乘的個數 從2開始 2 3 4 5

forrinrange(2,n+1):

#從第i個矩陣ai開始,長度為r,迴圈次數為n-r+1

foriinrange(n-r+1):

j=i+r-1

#當前矩陣端(ai-aj)起始為ai 結尾為aj

# print(i,j)

#第乙個重複 m[i][j]=m[i][i]+m[i+1][j]+p[i]p[i+1]p[j+1] i的行列*j的列

m[i][j]=m[i+1][j]+p[i]*p[i+1]*p[j+1]

s[i][j]=i

forkinrange(i+1,j):

# p[i]p[k+1]p[j+1] i的行*k的列*j的列

t=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1]

ift3,2],[2,5],[5,10],[10,2],[2,3]]

n=len(arr)

# 處理矩陣的行和列

p=foriinrange(n):

ifi==0:

else:

print(p)

# 儲存最優值

m=np.zeros((n,n))

#儲存最優決策

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

matrixchain(p,n,m,s)

print(m)

print(s)

#記錄最優決策並構造最優解

res=

deftraceback(i,j,res,s):

ifi==j:

+str(i))

else:

) traceback(i, int(s[i][j]),res, s)

traceback(int(s[i][j] + 1), j,res, s)

# print(i,int(s[i][j]),int(s[i][j]+1),j)

)traceback(0,n-1,res,s)

print(''.join(res))

python矩陣連乘 動態規劃 矩陣連乘問題

一 問題描述 給定n個數字矩陣a1,a2,an,其中ai與ai 1是可乘的,設ai是pi 1 pi矩陣,i 1,2,n。求矩陣連乘a1a2.an的加括號方法,使得所用的乘次數最少。例子三個矩陣連乘,可以有 a1a2 a3和a1 a2a3 兩種方法求積 乘法次數分別為 p0p1p2 p0p2p3和p0...

矩陣連乘問題

矩陣連乘問題 應用動態規劃演算法,將前面計算的重複值儲存,一次來推進下一步的計算,直到得到m 1 n 的值,為最少的乘法次數 m i j 表示計算a i.j 所需的最少數乘次數 m i j min i s i j 記錄斷開位置,也就是最少計算次數的中間位置。include using namespa...

矩陣連乘問題

由於矩陣的乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算次序。這中計算次序 可以用加括號的方式來確定。例如,矩陣連乘積a1a2a3a4可以有5種不同的完全加括號方式 a1 a2 a3a4 a1 a2a3 a4 a1a2 a3a4 a1 a2a3 a4 a1a2 a3 a4 矩陣a和b可乘的條...