實驗題目3:矩陣鏈乘法 (11.1日實驗) 要求:
(1)設計暴力法,產生所有矩陣鏈相乘以組合情況,寫出**,並除錯成功;
(2)設計動態規劃演算法,寫出**,尋找最小乘法次數和對應相乘的順序,並除錯成功;(3)隨機產生由10個矩陣,測試(2)的**,輸出最小乘法次數和相乘的順序。
from random import
*def
matchain
(c,n,path,r)
:for d in
range(1
,n):
#填充對角線
for i in
range(1
,n-d+1)
: j=i+d
c[i]
[j]=
2147483647
#無窮大
for k in
range
(i+1
,j+1):
#k開始分割
if c[i]
[j]>
(c[i]
[k-1
]+c[k]
[j]+r[i]
*r[k]
*r[j+1]
):path[i]
[j]=k
c[i]
[j]=
min(c[i]
[j], c[i]
[k -1]
+ c[k]
[j]+ r[i]
* r[k]
* r[j +1]
)# i的行*k的行*j的列數
return c[1]
[n]def
findpath
(c,path,i,j)
:if i==j :
#只有乙個矩陣
print
(i,end='')
else
: k=path[i]
[j]#分割點
print
('('
,end='')
findpath(c,path,i,k-1)
#左邊 findpath(c,path,k,j)
#右邊print
(')'
, end='')
if __name__==
'__main__'
: r=
[randint(1,
10)for i in
range(11
)]r.insert(0,
-1)print
(r) path =[[
0for i in
range(11
)]for j in
range(11
)]c=[[
0for i in
range(11
)]for j in
range(11
)]count=matchain(c,
10,path,r)
print
(count)
# print(path)
findpath(c,path,1,
10)
執行結果為:
[-1, 10, 2, 5, 4, 3, 2, 9, 3, 9, 2, 6]348(1(((((23)4)5)((67)(89)))10))
動態規劃 矩陣鏈相乘
設s1,a2,a3,an為n個矩陣的序列,其中ai為pi 1 pi階矩陣,這個矩陣鏈的輸入用向量p 給出。給定向量p,確定一種乘法次序,使得基本運算的總次數達到最小。我才用的矩陣為 a1 30 35 a2 35 15 a3 15 5 a4 5 10 a5 10 20 a6 20 25 那麼得到的p ...
動態規劃之矩陣鏈相乘
在看這張之前,最好看看我寫的 動態規劃詳解 裡面都是講理論基礎,我下面的分析都是在此基礎上進展的。問題描述 詳見演算法導論p197 p198 已知 給定n個矩陣構成的乙個矩陣鏈 a1,a2,an 矩陣ai的維數為pi 1 pi 求 決定該矩陣鏈的乘法結合順序 即加括號 使得矩陣鏈乘法的執行時間最短 ...
動態規劃之矩陣鏈相乘
題目 n個矩陣連乘,求最少的乘法運算次數以及結合方式 假設矩陣a為r1 r2,矩陣b為r2 r3,所以m a b r1 r2 r3。當有多個矩陣相乘的時候,矩陣以不同的方式結合的時候其運算次數是不同的。例如 m m1 m2 m3 m4 5 20 20 50 50 1 1 100 m1 m2 m3 m...