import numpy as np #求最优值 并记录相关信息 def MatrixChain(p,n,m,s): #单个矩阵连乘的次数 for i in range(n): m[i][i]=0 s[i][i]=0 #R 表示连乘的个数 从2开始 2 3 4 5 for r in range(2,n+1): #从第i个矩阵Ai开始,长度为r,循环次数为n-r+1 for i in range(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 for k in range(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] if t<m[i][j]: m[i][j]=t s[i][j]=k arr=[[3,2],[2,5],[5,10],[10,2],[2,3]] n=len(arr) # 处理矩阵的行和列 p=[] for i in range(n): if i==0: p.append(arr[0][0]) p.append(arr[0][1]) else: p.append(arr[i][1]) print(p) # 存储最优值 m=np.zeros((n,n)) #存储最优决策 s=np.zeros((n,n)) MatrixChain(p,n,m,s) print(m) print(s) #记录最优决策并构造最优解 res=[] def Traceback(i,j,res,s): if i==j: res.append('A'+str(i)) else: res.append('(') 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) res.append(')') Traceback(0,n-1,res,s) print(''.join(res))
矩阵连乘问题-python实现
猜你喜欢
转载自blog.csdn.net/qq_36387683/article/details/79924574
今日推荐
周排行