- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动态规划算法解矩阵连乘问题.doc
动态规划算法解矩阵连乘问题
一、实验目的
通过上机实验,要求掌握动态规划算法的问题描述、算法设计思想、程序设计和算法复杂性分析等。
二、实验环境
VC6.0 C++,vs2005
三、实验内容
1 用动态规划算法解矩阵连乘问题
(1)问题的描述
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2,…,n-1。要算出这n个矩阵的连乘积A1A2…An。由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积。完全加括号的矩阵连乘积可递归地定义为:
单个矩阵是完全加括号的(当然实际上可以不加);
矩阵连乘积A是完全加括号的,则A可表示为2个完全加括号的矩阵连乘积B和C的乘积并加括号,即A=(BC)。 例如,矩阵连乘积A1A2A3A4有5种不同的完全加括号的方式:(A1(A2(A3A4))),(A1((A2A3)A4)),((A1A2)(A3A4)),((A1(A2A3))A4),(((A1A2)A3)A4)。每一种完全加括号的方式对应于一个矩阵连乘积的计算次序,这决定着作乘积所需要的计算量。若A是一个p×q矩阵,B是一个q×r矩阵,则计算其乘积C=AB的标准算法中,需要进行pqr次数乘。
为了说明在计算矩阵连乘积时,加括号方式对整个计算量的影响,先考察3个矩阵{A1,A2,A3}连乘的情况。设这三个矩阵的维数分别为10×100,100×5,5×50。加括号的方式只有两种:((A1A2)A3),(A1(A2A3)),第一种方式需要的数乘次数为10×100×5+10×5×50=7500,第二种方式需要的数乘次数为100×5×50+10×100×50=75000。第二种加括号方式的计算量时第一种方式计算量的10倍。由此可见,在计算矩阵连乘积时,加括号方式,即计算次序对计算量有很大的影响。于是,自然提出矩阵连乘积的最优计算次序问题,即对于给定的相继n个矩阵{A1,A2,…,An}(其中矩阵Ai的维数为pi-1×pi,i=1,2,…,n),如何确定计算矩阵连乘积A1A2…An的计算次序(完全加括号方式),使得依此次序计算矩阵连乘积需要的数乘次数最少。 正如课堂中所分析,穷举法的计算量太大,它不是一个有效的算法,本实验采用动态规划算法解矩阵连乘积的最优计算次序问题。
(2)算法设计思想
动态规划算法的基本思想是将待求解问题分成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,动态规划法经分解得到的子问题往往不是相互独立的,前一子问题的解为后一子问题的解提供有用的信息,可以用一个表来记录所有已解决的子问题的答案,不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。
本实验的算法思路是:
1)计算最优值算法MatrixChain():建立两张表(即程序中的**m和**s,利用二维指针存放),一张表存储矩阵相乘的最小运算量,主对角线上的值为0,依次求2个矩阵、3个矩阵…、直到n个矩阵相乘的最小运算量,其中每次矩阵相乘的最小运算量都在上一次矩阵相乘的最小运算量的基础上求得,最后一次求得的值即为n个矩阵相乘的最小运算量;另一张表存储最优断开位置。
2)输出矩阵结合方式s,自己加括号,构造出最优加括号方式。当然也可以编程输出,这部分不作强制要求。
程序设计
//测试数据可以设为六个矩阵分别为
//A1[30*35],A2[35*15],A3[15*5],A4[5*10],A5[10*20],A6[20*25]
//p用来记录矩阵的行列,则p[1-7]={30,35,15,5,10,20,25}
//m[i][j]用来记录第i个矩阵乘至第j个矩阵的最优解(即最小乘积次数)
//s[][]用来记录从哪里断开,才可得到该最优解
计算示例:
注意上图(a)中的计算次序!
理解算法思想,读懂程序
给程序注上详细解释
通过矩阵s给出最优乘积次序
【程序及详解,最优乘积输出附此】
程序及详解
// jzlc.cpp : 矩阵连乘
#include iostream
#include conio.h
#include time.h
using std::cout;
using std::endl;
int main()
{
int p[]={30,35,15,5,10,20,25}; //p[0],p[1]确定A1行列数,p[1],p[2]确定A2行列数,依次类推
int n=sizeof(p)/sizeof(int)-1; //自动计算矩阵个数,增加程序灵活性
您可能关注的文档
- 初中代数教材几何教学培训.doc
- 初中代数知识整理简化版.doc
- 初中信息技术三级等级考试选择题集锦.doc
- 初中信息技术会考复习提要.doc
- 初中信息技术考试基础知识[].doc
- 初中力检测题.doc
- 初中化学全国竞赛二十二.doc
- 初中化学总复习知识点全集打印版.doc
- 初中化学总复习知识点全集按单元.doc
- 初中历史调研考试.doc
- 城市初中生周末休闲活动对地理信息系统应用的实践研究论文.docx
- 手工编织在小学美术教学中的创新实践与效果分析论文.docx
- 基于LBS技术的校园自行车停放管理系统设计与实施论文.docx
- 基于跨学科学习的小学自然科学实验兴趣培养研究论文.docx
- 校园食品安全监管中的食品安全监督与检查论文.docx
- 高中化学课堂中思辨能力培养与化学实验操作技能的关联研究论文.docx
- 初中物理实验创新设计与科学探究能力提升策略探讨论文.docx
- 小学环境教育:海水淡化膜材料制备的实验操作与环保意识培养论文.docx
- 基于校园手工制作活动的高中生创新思维与实践能力培养策略论文.docx
- 高中生化学成绩与学习方式的相关性研究论文.docx
文档评论(0)