演算法實驗報告2——矩陣連乘問題——2020.12.17
阿新 • • 發佈:2020-12-21
技術標籤:python演算法-每日一練演算法python資料結構java線性代數
演算法實驗報告2——矩陣連乘問題
一丶矩陣連乘問題
A1 A2 A3 A4 A5 A6
3035 3515 155 510 1020 2025
求最小數乘次數。
二丶矩陣連乘程式碼
# coding=gbk
__author__ = 'Blockchain_Key'
__time__ = '2020.12.17'
# row_num 行數
# col_num 列數
class Matrix:
def __init__(self, row_num=0, col_num=0, matrix=None):
if matrix != None:
self.row_num = len(matrix)
self.col_num = len(matrix[0])
else:
self.row_num = row_num
self.col_num = col_num
self.matrix = matrix
def matrix_chain(matrixs):
matrix_num = len(matrixs) # 求取矩陣個數
count = [[0 for j in range(matrix_num)] for i in range(matrix_num)] # 建立二維動態規劃表
flag = [[0 for j in range(matrix_num)] for i in range(matrix_num)] # 建立二維標識矩陣
for interval in range(1, matrix_num + 1): # 從1開始,方便計算
for i in range(matrix_num - interval): # 剩餘的矩陣
j = i + interval
count[i][j] = count[i][i] + count[i + 1][j] + matrixs[i].row_num * matrixs[i + 1].row_num * matrixs[j].col_num
flag[i][j] = i
for k in range(i + 1, j):
temp = count[i][k] + count[k + 1][j] + matrixs[i].row_num * matrixs[k + 1].row_num * matrixs[j].col_num
if temp < count[i][j]:
count[i][j] = temp
flag[i][j] = k
traceback(0, matrix_num - 1, flag)
return count[0][matrix_num - 1] # 最終結果
def traceback(i, j, flag):
if i == j:
return
# 遞迴處理
traceback(i, flag[i][j], flag)
traceback(flag[i][j] + 1, j, flag)
if __name__=="__main__":
matrixs = [Matrix(30, 35), Matrix(35, 15), Matrix(15, 5), Matrix(5, 10), Matrix(10, 20), Matrix(20, 25)]
result = matrix_chain(matrixs)
print(result)