国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

動態規劃之矩陣連乘問題Python實現方法

2020-02-16 10:53:05
字體:
來源:轉載
供稿:網友

本文實例講述了動態規劃之矩陣連乘問題Python實現方法。分享給大家供大家參考,具體如下:

給定n個矩陣{A1,A2,…,An},其中Ai與Ai+1是可乘的,i=1,2 ,…,n-1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。

例如:

A1={30x35} ; A2={35x15} ;A3={15x5} ;A4={5x10} ;A5={10x20} ;A6={20x25} ;

結果為:((A1(A2A3))((A4A5)A6))  最小的乘次為15125。

原問題為n個矩陣連乘,將原問題分解為子問題,即當n等于1,2,3.....時。
n==1時,單一矩陣,不需要計算。最小乘次為0
n==2時,根據n==1時的結果,遍歷計算出每相鄰兩個矩陣的最小乘次
n==3時,根據n==1和n==2時的結果,此時已經求出每相鄰1個、2個矩陣的最小乘次,遍歷計算出該相鄰三個矩陣的最小乘次
依次類推……
當n==n時,根據n==1、2、……n-1時的結果,此時已經求出每相鄰1個、2個、3個……n-1個矩陣的最小乘次,由此求出n==n時的最小乘次

每當n增加1時,就利用已求出的子結構來求解此時的最優值。

數學描述如下:

設矩陣Ai的維數為Pi × Pi+1。
設A[i:j]為矩陣AiAi+1....Aj的連乘積,即從Ai到Aj的連乘積,其中,0 <= i <= j <= n-1
設m[i][j]為計算A[i:j]的最小乘次,所以原問題的最優值為m[0][n-1]。
當 i==j 時,單一矩陣,無需計算。m[i][i]=0,i=0,1,....n-1
當 i < j 時,利用最優子結構,計算m[i][j]。即尋找斷開位置k(i <= k < j),使得m[i][k]+m[k+1][j]+Pi*Pk+1*Pj+1最小。

該算法的python實現:

# coding=gbk# 矩陣連乘問題__author__ = 'ice'# row_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 = matrixdef 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):    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  if j - i > 1:    print(str(i + 1) + '~' + str(j + 1), end=': ')    print(str(i + 1) + ":" + str(flag[i][j] + 1), end=',')    print(str(flag[i][j] + 2) + ":" + str(j + 1))  traceback(i, flag[i][j], flag)  traceback(flag[i][j] + 1, j, flag)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)# 1~6: 1:3,4:6# 1~3: 1:1,2:3# 4~6: 4:5,6:6# 15125            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 儋州市| 泾川县| 台东县| 栾城县| 汨罗市| 涡阳县| 沙河市| 聂荣县| 南城县| 广州市| 灵丘县| 乐清市| 巴东县| 石屏县| 三亚市| 泗水县| 汉川市| 新丰县| 九台市| 莲花县| 绥江县| 罗平县| 东安县| 富蕴县| 大化| 肇庆市| 绥芬河市| 峨山| 公安县| 巴南区| 客服| 通化县| 临高县| 昌邑市| 监利县| 南通市| 塘沽区| 甘肃省| 谷城县| 栾川县| 徐水县|