动态规划求解矩阵连乘

目录

1.两个矩阵相乘

2. 三个矩阵相乘

3.n个矩阵相乘与动态规划递推公式 

4.伪代码 

 5.伪代码实现


 

1.两个矩阵相乘

对于两个矩阵乘法:A(row1,col1)*B(row2,col2)=C(row3,col3)

有以下性质:

1.row3 = row1

2.col3 = col1

3.col1 = row2

4.乘法次数 = row1*col1*col2。(C中的元素(i,j)是由A中的第i行与B中的第j列中的元素对应乘而来,而C中又有row1*col2个这样的元素)。

2. 三个矩阵相乘

再来考虑下三个矩阵相乘A1A2A3。

可以是(A1A2)A3也可以是A1(A2A3)。

而两种算式虽然结果是一样的,但是过程中需要计算的乘法次数是不一样的。

如以下例子:

3个矩阵{A1, A2, A3}连乘,设3个矩阵的维数分别为10×100, 100×5, 5×50。

若按((A1A2)A3)计算,需要数乘次数为:10×100×5+10×5×50=7500;

若按(A1(A2A3))计算,需要数乘次数为:100×5×50+10×100×50=75000。

因此是可以通过乘的次序不同来简化运算的,所以才有了此篇。

3.n个矩阵相乘与动态规划递推公式 

显然对上一个例子,我们在第二个矩阵之后断开,先分别算A1A2相乘的结果再将这结果与A3相乘的计算次数最少。

那么假设我们要算n个矩阵相乘也是一样的,需要选择在第i个矩阵后断开。然后对比在每个节点断开时的运算次序,选择最少的就是最优解。

由此动态规划的递推公式就出来了:

其中pi表示第i个矩阵的列,也即第i+1个矩阵的行。

图中的m数组即动态规划的dp数组。

从递推公式中可以看出算m[i,j]需要事先知道m[i,k]还有m[k+1,j],而无论是m[i,k]还是m[k+1,j]的长度都比m[i,j]短,所以计算整个m数组的顺序应该是从矩阵链长度短的推到长度长的,最后得到结果m[1][n]。 

4.伪代码 

for i<-1 to n do
    dp[i][i] = 0
for length<-2 to n do				//length是相乘矩阵链的长度
    for begin<-1 to n-length+1 do	//begin是相乘矩阵链的第一个矩阵
        end = begin + length - 1	//end是相乘矩阵链的最后一个矩阵
        dp[begin][end]<-∞
        for index <- begin to end-1 do
            temp = dp[begin][index] + dp[index+1][end] + p[begin-1]*p[index]*p[end]
            if temp < dp[begin][end] then
                dp[begin][end] = temp

 5.伪代码实现

public class MatrixMul {

	public static void main(String[] args) {
		int num = 6;
		int p[] = {30, 35, 15, 5, 10, 20, 25};
		int result = mul(num,p);
		System.out.println(result);
	}

	private static int mul(int num, int[] p) {
		int dp[][] = new int[num+1][num+1];
		for (int i = 1; i < dp.length; i++) {
			dp[i][i] = 0;
		}
		for (int length = 2; length < dp.length; length++) {
			for (int begin = 1; begin <= dp.length-length; begin++) {
				int end = begin + length -1;
				dp[begin][end] = Integer.MAX_VALUE;
				for (int index = begin; index < end; index++) {
					int temp = dp[begin][index] + dp[index+1][end] + p[begin-1]*p[index]*p[end];
					if(temp < dp[begin][end]) {
						dp[begin][end] = temp;
					}
				}
			}
		}
		return dp[1][num];
	}
}

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于动态规划求解矩阵连乘问题的MATLAB代码如下所示: ```matlab function \[m, s\] = matrixChainOrder(p) n = length(p) - 1; m = zeros(n, n); s = zeros(n, n); for l = 2:n for i = 1:n-l+1 j = i + l - 1; m(i, j) = inf; for k = i:j-1 q = m(i, k) + m(k+1, j) + p(i)*p(k+1)*p(j+1); if q < m(i, j) m(i, j) = q; s(i, j) = k; end end end end end ``` 这段代码实现了基于动态规划矩阵连乘问题求解。其中,输入参数p是一个包含矩阵维度的向量,例如p = \[10, 20, 30, 40\]表示有3个矩阵,维度分别为10x20、20x30和30x40。函数返回两个矩阵,m是最小乘法次数的矩阵,s是最优括号化方案的矩阵。 请注意,这段代码只是解决了矩阵连乘问题,与您提供的引用内容\[1\]和\[2\]中的TSP问题和优化函数无关。如果您有关于TSP问题和优化函数的具体问题,请提供更多信息,我将尽力回答。 #### 引用[.reference_title] - *1* [基于CHNN求解TSP问题](https://blog.csdn.net/qq_36276758/article/details/128078120)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [matlab线性规划问题---------基于问题求解函数optimproblem**](https://blog.csdn.net/weixin_52901292/article/details/119385051)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东东咚咚东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值