矩阵相乘的最优顺序

 对于一个矩阵,进行乘法的顺序不一样,总的元素的乘法次数也不同。我们希望给出一系列矩阵之后,能找到元素乘法次数最少的计算顺序。

 用动态规划来求解这个问题。


/*
 * =====================================================================================
 *
 *       Filename:  MatrixMul.cpp
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  2011年12月01日 10时43分13秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  MaZheng (blog.csdn.net/mazheng1989), mazheng19891019@gmail.com
 *        Company:  Dalian University Of Technology
 *
 * =====================================================================================
 */

#include<stdio.h>

const int n=4;
int Matrix[n][2]={20,2,2,15,15,40,40,4};
int cost[n][n];
int root[n][n];

int Proc(int i,int r,int j)
{
	return Matrix[i][0]*Matrix[r][1]*Matrix[j][1];
}
int pri(int i,int r,int j)
{
	if(i==r&&r==j)
		return -1;
	pri(i,root[i][r],r);
	pri(r+1,root[r+1][j],j);
	printf(" %d ",root[i][j]+1);

}
int main()
{
	for(int i=n-1;i>=0;i--)
	{
		for(int j=i;j<=n-1;j++)
		{
			if(j==i)
			{
				cost[i][j]=0;
				root[i][j]=i;
			        continue;
			}
			for(int r=i;r<=j-1;r++)
			{
				int temp=cost[i][r]+cost[r+1][j]+Proc(i,r,j);
				if(cost[i][j]==0)
				{
					cost[i][j]=temp;
					root[i][j]=r;
				}
				else if(cost[i][j]!=0&&cost[i][j]>=temp)
				{
					cost[i][j]=temp;
					root[i][j]=r;
				}
			}
		//	printf("%d %d %d %d \n",i+1,j+1,cost[i][j],root[i][j]+1);
		}
	}
	printf("least multiply times = %d\n",cost[0][n-1]);
	printf("compute sequece is:\n");
	pri(0,root[0][n-1],n-1);

}



以下是使用动态规划思想实现矩阵相乘最优计算次序和最少计算次数的Python代码: ```python def matrix_multiply_order(matrices): """ 计算矩阵相乘最优顺序和最少计算次数 :param matrices: 矩阵列表,每个矩阵用一个元组表示,元组中有两个元素,分别为矩阵的行数和列数 :return: 最优顺序和最少计算次数 """ n = len(matrices) # 初始化dp数组 dp = [[0] * n for _ in range(n)] # 初始化路径数组 path = [[0] * n for _ in range(n)] for i in range(n): dp[i][i] = 0 # 枚举矩阵链长度 for l in range(2, n + 1): for i in range(n - l + 1): j = i + l - 1 dp[i][j] = float('inf') # 枚举划分点 for k in range(i, j): # 计算当前划分点下的计算次数 count = dp[i][k] + dp[k + 1][j] + matrices[i][0] * matrices[k][1] * matrices[j][1] if count < dp[i][j]: dp[i][j] = count path[i][j] = k # 根据路径数组构造最优顺序 order = [] def construct_order(i, j): if i == j: order.append(i) else: k = path[i][j] construct_order(i, k) construct_order(k + 1, j) construct_order(0, n - 1) return order, dp[0][n - 1] ``` 其中,`matrices`参数为矩阵列表,每个矩阵用一个元组表示,元组中有两个元素,分别为矩阵的行数和列数。例如,`[(30, 35), (35, 15), (15, 5), (5, 10), (10, 20), (20, 25)]`表示有6个矩阵,第1个矩阵的行数为30,列数为35,第2个矩阵的行数为35,列数为15,以此类推。 函数返回一个元组,第一个元素为最优顺序,第二个元素为最少计算次数。例如,对于上述矩阵列表,函数返回的结果为`([0, 1, 2, 3, 4, 5], 15125)`,表示最优顺序为先计算第0个和第1个矩阵,然后计算第2个和第3个矩阵,最后计算第4个和第5个矩阵,总共需要计算15125次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值