动态规划——矩阵连乘的问题

动态规划——矩阵连乘问题 动态规划算法与分页发类似,基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分冶法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是相互独立的。所以若用分冶法解这类问题,则分解得到的子问题太多,以至于最后解决原问题 阅读详情

动态规划算法与分页发类似,基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

与分冶法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是相互独立的。所以若用分冶法解这类问题,则分解得到的子问题太多,以至于最后解决原问题需要消耗指数时间。

在分冶法中,保存下了已解决的子问题的答案,在需要时再找出以求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。

动态规划的步骤:

(1)找出最优解的性质,并刻画其结构特征

(2)递归地定义最优值

(3)以自底向上的方式计算出最优值

(4)根据计算最优值时得到的信息,构造最优解


给定n个矩阵,{ A1 , A2 , A3 , A4 ...... An } ,期中相邻的矩阵都是可以相乘的,由于矩阵乘法满足结合律,故存在不同的乘法顺序

比如对于矩阵 A1 , A2 , A3 , A4 , A5

可以有 (A1 (A2 (A3 (A4 A5))))   ,  (A1 (A2 (A3 A4) A5))) ... 等的组合乘法顺序


首先考虑两个矩阵乘积所需计算量,若A使p*q的矩阵,B是q*r的矩阵,则其乘积C=AB是一个p*r的矩阵,共需要pqr次数乘。


计算三个矩阵连乘{A1,A2,A3} 结舌维数分别为10*100 , 100*5 , 5*50

按此顺序计算需要的次数((A1*A2)*A3):10X100X5+10X5X50=7500次

按此顺序计算需要的次数(A1*(A2*A3)):10X5X50+10X100X50=75000次

所以问题是:如何确定运算顺序,可以使计算量达到最小化。


穷举搜索P(n)随n呈指数增长,下面考虑用动态规划法解:

1、分析最优解的结构

将AiAi+1...Aj记为A[i:j],考查计算A[1:n]的最优计算次序。设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,1<=k<n,则其相应的完全加括号方式为((A1...Ak)(Ak+1...An))。它的总计算量为A[1:k]的计算量加上A[k+1:n]的计算量,再加上A[1:k]和A[k+1:n]相乘的计算量。

这个问题的一个关键特征是:计算A[1:n]的最优次序包含的计算矩阵子链A[1:k]和A[k+1:n]的次序也是最优的。

因此,矩阵连乘积计算次序问题的最优解包含其子问题的最优解。这种性质称为最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。

2、建立递归关系

设计算A[i:j],1<=i<=j<=n所需的最少数乘次数为m[i][j],则原问题的最优值为m[1][n]。

当i=j时,A[i:j]为单一矩阵,无需计算,因此m[i][i]=0,i=1,2,...n。

当i<j时,可利用最优子结构计算m[i][j]=m[i][k]+m[k+1][j]+pi-1*pk*pj

若将对应于m[i][j]的断开位置k记为s[i][j],在计算出最优值m[i][j]后,可递归地由s[i][j]构造出相应的最优解。

3、计算最优值

用动态规划算法解此问题,可依据其递归式自底向上地计算,并保存已解决子问题的答案。


先计算出m[i][i] = 0,i=1,2,...n,然后根据递归式,按矩阵链长递增的方式依次计算m[i][i+1],i=1,2,...,n;m[i][i+2],i=...;...。易知,后边所用到的等号右边的数据都已经在前边被计算过

4、构造最优解

上算法只计算出了最优值,并未给出最优解,但已记录了构造最优解所需要的全部信息。s[i][j]中的数k表明计算矩阵链A[i:j]的最佳方式应在矩阵Ak和ak+1之间断开即最优哦的加括号方式应为(A[i:k])(A[k+1:j])。因此,从s[1][n]记录的信息可知计算A[1:n]的最优加括号方式。


#include<stdio.h>

void MatrixChain(int *p , int n , int m[][10] , int s[][10]) {
	int i , j , k , r , temp;
	// map[i][i]即为一个矩阵,所以赋值为0
	for(i=1 ; i<=n ; i++) {
		m[i][i] = 0;
	}
	// 从底向上,r代表此次每r个相邻矩阵相乘 
	for(r=2 ; r<=n ; r++) {
		// A[i:j],i表示第一个矩阵,j表示最后一个矩阵
		for(i=1 ; i<=n-r+1 ; i++) {
			j = i + r - 1;
			// k表示每次的断开点,从k= i...j-1
			k = i; 
			// k取值从i...j-1,由于开始map[i][j]为空,for循环需要对比
			// 所以把k=i第一次放在for外面
			m[i][j] = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
			// s记录每次的断开点
			s[i][j] = k;
			for(k=i+1 ; k<j ; k++) {
				// 对于每个k断开点,计算其计算量
				temp = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
				// 记录最小值和最小值时的断开点
				if(temp < m[i][j]) { 
					m[i][j] = temp;
					s[i][j] = k;
				}
			}
		}	
	}
}

// 计算A[i:j]的乘法顺序
void Traceback(int i , int j , int s[][10]) {
	if(i == j) {
		return;
	}
	// s[i][j]记录A[i:j]最佳方式的断开点,即( A[i,s[i][j]] )( A[s[i][j]+1][j])
	// 递归调用断开点的左侧和右侧
	printf("A%d...A%d 在k = %d处断开\n" , i , j , s[i][j]);
	Traceback(i , s[i][j] , s);
	Traceback(s[i][j]+1 , j , s);
}

int main() {
	int m[10][10] , s[10][10];
	int n = 5;
	// 这里假设n =5,
	// 矩阵的维数分别为30X35,35X15,15X5,5X10,10X20,20X25
	int p[10] = {30,35,15,5,10,20,25};
	MatrixChain(p,n,m,s);

	Traceback(1,n,s);
	printf("\n");
	return 0;
}

转载: http://blog.youkuaiyun.com/hb188753472/article/details/6672590




动态规划解决矩阵连乘问题 给定n个矩阵{A1,A2,…,An},其中,Ai与Ai+1是可乘的,(i=1,2 ,…,n-1)。用加括号的方法表示矩阵连乘的次序,不同的计算次序计算量(乘法次数)是不同的,找出一种加括号的方法,使得矩阵连乘的次数最小。 ...... 阅读详情

相关推荐

动态规划之矩阵连乘问题详细解读(思路解读+填表+代码)

动态规划简介 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填

weixin_44952817的博客 8万+

矩阵连乘动态规划

1.最优子结构证明: 将矩阵连乘积AiAi+1Ai+2…Aj简记为A[i,j]。考察计算[1,n]的最优计算次序,设这个计算次序再k处断开,则先计算A[1,k]和A[k+1,n],然后两者相乘得到A[1,n,s],则计算量为A[i,k]的计算量加上A[k+1,n]的计算量再加上A[1,k]和A[k+1,n]相乘的计算量。可用反证法证明最优子结构,计算A[1,n]的最有次序包括的子结构A[1,k]和...

qq_44786115的博客 1567

动态规划:矩阵连乘问题(C++实现,含备忘录方法)

动态规划与分治法的异同: 相同点:其基本思想都是将待求解问题分解为若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解。 差异点:与分治法不同的是,适合用动态规划法求解的问题经分解得到的子问题往往不是相互独立的。有些问题分解后的子问题往往是重复的,此时若用分支法则会重复计算耗费时间内存。 总结:为了达到避免重复计算,可以用一个表来记录所有已解决的子问题的答案。不管该子问题以后是否被用...

BJM‘s blog. 2万+

矩阵连乘问题

矩阵连乘问题 问题分析 最优子结构性质 假设n个矩阵连乘的最优加括号方案为(A1...Ak)(Ak+1...An))(注:此处省略了A1...Ak, Ak+1...An两个子矩阵内部的括号)。则加括号方案(A1...Ak)是子矩阵链A1...Ak的最优加括号方案,(Ak+1...An)是Ak+1...An的最优加括号方案。 证明略。但可证明该假设成立。

Ming 2857

动态规划——矩阵连乘问题算法及实现详解(附完整代码)

问题分析 矩阵连乘问题是经典的动态规划问题,其主要是n个矩阵进行矩阵乘法运算时,通过括号改变运算的先后顺序,减少运算次数,找到最佳划分方法,求解最少运算次数。 算法分析 矩阵连乘问题中动态规划可以帮助我们找到从每个矩阵到另一个矩阵的最小运算次数以及对应的划分,我们用dp[i][j]存储从矩阵A[i]到矩阵A[j]的运算次数。每当对从矩阵A[i]连乘到矩阵A[j]求解最小连乘括号划分时,我们引入A[i]到A[j]连乘序列中的一个矩阵A[k]。我们从第i+1个矩阵开始尝试,直到矩阵A[j],如果有更优解——得到

freezing_00的博客 2万+

动态规划求解矩阵连乘问题Java实现

动态规划求解矩阵连乘问题Java实现,并且使用备忘录方法对动态规划算法改进

weiweiyixiaocsdn的专栏 1万+

《算法导论》学习(十八)----动态规划之矩阵链乘(C语言)

本文主要讲解了动态规划中的矩阵链乘问题:给定一个矩阵链,得到它的最小代价计算次序。给出了动态规划方案的分析,并且给出了C语言实现。

weixin_52042488的博客 3417

矩阵连乘问题(从动态规划超详细解析)

概述 本文将先介绍动态规划,再分析矩阵连乘问题,对动态规划了解或者直接想抄算法分析实验报告的小伙伴可选择性的直接跳到下面。 动态规划 1.概念 动态规划(英语: Dynamic programming,简称 DP) 是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 那动态规划算法要表达的核心思想到底是什么?我们来看一个例子 A : "2+2+2+2+2=? 请问这个等式的值是多少? " B : "计算 ing 。。。。。。结果为

JYplute的博客 7718

算法分析 - 动态规划算法解矩阵连乘(动态规划)

【问题描述】使用动态规划算法解矩阵连乘问题,具体来说就是,依据其递归式自底向上的方式进行计算,在计算过程中,保存子问题答案,每个子问题只解决一次,在后面计算需要时只要简单查一下得到其结果,从而避免大量的重复计算,最终得到多项式时间的算法。 【输入形式】在屏幕上输入第1个矩阵的行数和第1个矩阵到第n个矩阵的列数,各数间都以一个空格分隔。 【输出形式】矩阵连乘A1…An的最少数乘次数和最优计算次序。 【样例1输入】 30 35 15 5 10 20 25 【样例1输出】 15125 ((A1(A2A3))((.

Spike的秃头之路 1494

矩阵连乘问题实现(最佳加括号方式-动态规划算法)

矩阵连乘问题分析和实现用于动态规划 最佳加括号方式-动态规划算法

C语言矩阵连乘 (动态规划)详解

主要介绍了C语言矩阵连乘 (动态规划)详解的相关资料,需要的朋友可以参考下

动态规划之矩阵连乘问题C++版

动态规划矩阵连乘

于建章的博客 5589

SAP LTMC实战指南:物料主数据高效导入全解析

本文详细解析了SAP LTMC工具在物料主数据高效导入中的实战应用,包括工具选择、项目搭建、模板定制、数据导入全流程及常见问题解决方案。重点介绍了LTMC的预置模板、LTMOM灵活配置、数据校验机制等核心功能,帮助用户快速掌握SAP数据迁移技巧,提升工作效率。

weixin_33738555的博客 434

0010算法笔记——【动态规划】矩阵连乘问题

问题描述:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数。       问题解析:由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一

liufeng_king的专栏 10万+

OpenCV实战(24)——相机姿态估计

如果物体的 3D 结构是已知的,那么就可以预测物体如何投影到相机的传感器上,图像形成的过程由投影方程描述。当方程的大部分项已知时,就可以通过观察一些图像来推断其他元素 (2D 或 3D) 的值。相机姿态估计就是通过几个已知坐标的特征点,以及这些点在照片中的成像位置,求解出相机位于坐标系内的坐标与旋转角度。在本节中,我们将研究观察已知 3D 结构时的相机姿态估计问题。

盼小辉丶的博客 2万+

PreScan快速入门到精通第三十九讲基于车道线识别传感器的车道保持辅助算法Demo讲解

车道保持辅助系统使用一个前置的摄像头,一般安装在车内后视镜附近,用来检测车辆前方的车道线,并监测车辆在其车道上的位置。在有电动助力转向EPS的车辆中,它轻轻地,但明显地反转向,以保持车辆在车道上。在简单车辆动力学的Simulink模型中,一个25%的油门开度常数被设定为输入,作为车辆行驶的纵向动力。首先是近似的角度α,它是传感器航向(=车辆航向)与右侧车道车道线的切线的近似角。一个配备了车道线传感器和简单动力学模型的车辆(MAZDA),将在没有任何规定轨迹的情况下跟随道路车道线行驶。3D浏览器中的多视图。

小明师兄的博客 1842

动态规划解决矩阵连乘问题(C语言)

动态规划 一.问题分析 问题描述:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 要求:给定由n个矩阵构成的序列{A1,A2,…,An},对乘积A1A2…An,找到最小化乘法次数的加括号方法。 二.问题的解决方案/算法选择/设计思路 首先看到找最小值,优先考虑动态规划的算法思路得到最值。 我们可以试一下普通的办法: 1.蛮力算法: 设矩阵为{A1,A2,…,An},其行列用P0,P1,…

qq_46827043的博客 7963

【DL经典回顾】距离度量大汇总(7-余弦距离(Cosine Distance))

余弦距离(Cosine Distance)衡量的是两个向量在方向上的差异性,而不是在大小上的差异。

悦学共鸣,温柔以待,汇聚光芒,共同成长 2576

动态规划——矩阵连乘问题(Java)

###纪小七### First of all:不知那年那月那日,我纪小七也头脑开窍、屁股开花了…这辈子一定要挣钱滋润自己!!! 讲一哈:动态规划 (1)动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到远问题的解。 (2)与分治法不同的是适合于用动态规划法求解的问题,经分解得到的子问题往往不是相互独立的。 (3)若用分治法解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。 (4)动态规划适用于解最优问题。 矩

qq_43692287的博客 3437

Android Studio无法启动,Failed to create JVM:error code -1. JVM Path 完美解决方案

Android Studio无法启动,Failed to create JVM:error code -1. JVM Path 完美解决方案。 找到Android studio的启动文件bin目录,把studio64.exe.vmoptions 删除或改名(推荐改名,方便恢复),如果你是32位系统这个文件就是 studio.exe.vmoptions

陈万洲的专栏 4848

ESP32-C3蓝牙透传通信的BLE协议栈工程实践

蓝牙低功耗(BLE)透传是一种基于GATT服务模型的数据透明传输机制,其核心原理在于Peripheral设备通过广播建立连接,并在GATT Server层暴露可读写特征值实现双向数据通道。该技术具备低功耗、跨平台兼容性强、开发门槛适中等优势,广泛应用于智能硬件、工业传感器与嵌入式网关等场景。在实际工程中,透传稳定性高度依赖BLE协议栈的分层协同——Link Layer负责可靠连接建立,GATT Server则定义数据交互语义;而ESP32-C3的AT指令集正是对这两层能力的封装调度。本文聚焦BLE透传的关键

weixin_29859471的博客 121

【算法】动态规划 矩阵连乘问题 python

博主根据老师讲义,自己手撸代码,若有错误,多谢指出。直接上代码 目录 0 讲义 问题 动态规划算法→伪代码 举个例子说明 1 代码 迭代实现 输出连乘顺序 主函数 0 讲义 0.1 问题定义 0.2 问题分析 0.3 动态规划算法 0.4 伪代码 迭代实现动态规划code:迭代实现 0.5 举个例子说明 备忘录里的数据...

还有很长很长的路 3259

断层错动和近断层地震动联合作用下软岩隧洞衬砌损伤分析

摘要 本文提出了一种基于Python的软岩隧洞衬砌损伤分析系统,重点研究断层错动和近断层地震动的联合作用效应。系统采用有限元方法建立隧洞-围岩体系模型,通过非线性动力分析评估衬砌结构损伤。研究内容包括:1)建立考虑应变软化的软岩本构模型;2)基于位错理论模拟断层错动过程;3)合成具有速度脉冲效应的近断层地震动;4)开发完整的动力响应分析流程。结果表明,所提出的方法能有效评估软岩隧洞在复杂地质条件下的抗震性能,为工程设计提供理论依据。 关键词:软岩隧洞、断层错动、近断层地震动、损伤分析、Python、有限元法

max500600的博客 842

动态规划之矩阵连乘问题

在动态规划算法中,局部最优并不一定会使得全局最优,它在每一个阶段的决策都会影响到后面的决策。所以我们在将问题划分为若干阶段时,需要将各个阶段所发生的不同状态存储起来,提供后一阶段做决策。一般都是子问题重叠的时候使用动态规划。下面是一个矩阵连乘的问题。 问题:n个矩阵连乘问题 描述:矩阵连乘满足结合律,在n个矩阵连乘时,什么样的结合方式可以使得整个过程中所做的乘法次数最小。 数量化:记 Mi

芳草源的博客 1347

危废焚烧优化控制系统设计与实现:基于数据驱动的控制参数预测

本文提出了一种基于数据驱动的危险废物焚烧过程优化控制方法。系统利用历史运行数据和实时监测数据,通过深度学习模型预测关键控制参数,实现焚烧过程的智能化控制。系统采用Python开发,结合TensorFlow/PyTorch框架,构建了完整的数据采集、预处理、特征工程、模型训练和实时预测闭环系统。该系统能够处理多变量非线性关系,适应工况变化,从历史数据中学习最优控制策略,相比传统PID控制方法具有显著优势。论文详细介绍了系统架构、算法设计和实现细节,为危废焚烧过程的优化控制提供了有效解决方案。

huanghm88的专栏 206

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

算法分析 动态规划解决矩阵连乘问题

矩阵连乘问题 问题: 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1 是可乘的,i=1,2…,n-1。 如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 1、按设计动态规划算法的步骤解题。 (1)找出最优解的性质,并刻划其结构特征。 (2)递归地定义最优值。 (3)以自底向上的方式计算出最优值。 (4)根据计算最优值时得到的信息,构造最优解(由子结构的...

晓小的博客 4329

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: Java反射机制初探
下一篇: 动态规划——最长公共子序列问题
java_wliang
博客等级 码龄15年 19粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值