3.1动态规划--矩阵连乘问题

news2024/9/24 5:32:50

写在前面:矩阵连乘的要点

1、最优解数组的含义--A[1:n]的最少数乘次数

2、数组的填写方向--斜着填

3、递推方程含义

今天开始动态规划的学习,动态规划与分治法类似,基本思想就是将待求解的问题分成若干子问题,先求解子问题,再结合这些子问题,得到源问题的解。

与分治法不同的是,动态规划求解的问题往往不是相互独立的,分治法来求解这些问题,子问题数目会很多,有些子问题会被重复计算很多次,如果能够保存已经解决的问题的答案,就可以避免大量重复计算

动态规划适用于求解最优化问题,通常有4个步骤

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

2、递归的定义最优值

3、以自底向下的方式计算最优值

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

问题描述

给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。

乘法次数可以理解为:A矩阵的规模为p × q ,B矩阵的规模为q × r,C=AB,则C矩阵的规模为p×r,每个位置上的元素需要q次乘法然后相加得到,一共需要p×q×r次数乘。例如,给定三个连乘矩阵{A1,A2,A3}的维数分别是10*100,100*5和5*50,采用(A1A2)A3,乘法次数为10*100*5+10*5*50=7500次,而采用A1(A2A3),乘法次数为100*5*50+10*100*50=75000次乘法,显然,最好的次序是(A1A2)A3,乘法次数为7500次。

分析:
矩阵链乘法问题描述:
给定由n个矩阵构成的序列{A1,A2,...,An},对乘积A1A2...An,找到最小化乘法次数的加括号方法。简记为:A[1:n]

1)寻找最优子结构
此问题最难的地方在于找到最优子结构。对乘积A1A2...An的任意加括号方法都会将序列在某个地方分成两部分,也就是最后一次乘法计算的地方,我们将这个位置记为k,也就是说首先计算A1...Ak和Ak+1...An,然后再将这两部分的结果相乘。简记为:A[1:k] 和A[k+1,n]
最优子结构如下:假设A1A2...An的一个最优加括号把乘积在Ak和Ak+1间分开,则前缀子链A[1:k]的加括号方式必定为A1...Ak的一个最优加括号,如果计算A[1:k]的次序需要更少的计算量,那么更新最优值之后,得到的A[1:n]的计算量也将是最优的,后缀子链同理。
一开始并不知道k的确切位置,需要遍历所有位置以保证找到合适的k来分割乘积

2)构造递归解
设m[i,j]为矩阵链Ai...Aj的最优解的代价,则

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

当i<j时,计算的A[ i : j ]在k处断开,则

 这里的 k 有 j-i 种可能。需要用一个新的循环来遍历k的值,k是这 j-i 个位置中使得乘法计算量最小的那个位置。把所有k的位置保存起来,记为S[i][j],在计算出最后的M[i][j]后,可以递归的还原k然后构造最优解。

3)构建辅助表,解决重叠子问题

对于一组矩阵:A1(30x35),A2(35x15),A3(15x5),A4(5x10),A5(10x20),A6(20x25)    个数N为6

那么p数组保存它们的行数和列数:p={30,35,15,5,10,20,25}共有N+1即7个元素

p[0],p[1]代表第一个矩阵的行数和列数,p[1],p[2]代表第二个矩阵的行数和列数......p[5],p[6]代表第六个矩阵的行数和列数

辅助表m: m[i][j]代表从矩阵Ai,Ai+1,Ai+2......直到矩阵Aj最小的相乘次数,比如A[2][5]代表A2A3A4A5最小的相乘次数,即最优的乘积代价。从矩阵A2到A5有三种断链方式:A2{A3A4A5}、{A2A3}{A4A5}、{A2A3A4}A5,这三种断链方式会影响最终矩阵相乘的计算次数,我们分别算出来,然后选一个最小的,就是m[2][5]的值,同时保留断开的位置k在s数组中。

 斜着填表,for循环的控制要写对!

 r表示问题规模,从2开始,因为1是单个矩阵不需要计算直接都填0

i表示行号,一行一行遍历,j表示列号,斜着填写,根据问题规模来,行号+问题规模-1(下标问题),m[i][j]是递推方程,k需要遍历j-i次,才能找到最优的那个位置。

#include<iostream>
using namespace std;
 
const int N=7;
//p为矩阵链,p[0],p[1]代表第一个矩阵的行数和列数,p[1],p[2]代表第二个矩阵的行数和列数......length为p的长度
//所以如果有六个矩阵,length=7,m为存储最优结果的二维矩阵,s为存储选择最优结果路线的
//二维矩阵
void MatrixChainOrder(int *p,int m[N][N],int s[N][N],int length)
{
    int n=length-1;
    int l,i,j,k,q=0;
    //m[i][i]只有一个矩阵,所以相乘次数为0,即m[i][i]=0;
    for(i=1;i<length;i++)
    {
        m[i][i]=0;
    }
    //l表示矩阵链的长度
    // l=2时,计算 m[i,i+1],i=1,2,...,n-1 (长度l=2的链的最小代价)
    for(l=2;l<=n;l++)
    {
        for(i=1;i<=n-l+1;i++)
        {
            j=i+l-1; //以i为起始位置,j为长度为l的链的末位,
            m[i][j]=0x7fffffff;
            //k从i到j-1,以k为位置划分
            for(k=i;k<=j-1;k++)
            {
                q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
                if(q<m[i][j])
                {
                    m[i][j]=q;
                    s[i][j]=k;
                }
            }
        }
    }
    cout << m[1][N-1] << endl;
}
void PrintAnswer(int s[N][N],int i,int j)
{
    if(i==j)
    {
        cout<<"A"<<i;
    }
    else
    {
        cout<<"(";
        PrintAnswer(s,i,s[i][j]);
        PrintAnswer(s,s[i][j]+1,j);
        cout<<")";
    }
}
int main()
{
    int p[N]={30,35,15,5,10,20,25};
    int m[N][N],s[N][N];
    MatrixChainOrder(p,m,s,N);
    PrintAnswer(s,1,N-1);
    return 0;
}

•利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 23种设计模式(2.创建者模式-工厂设计模式)

代码分析 通过代码的不同实现方式&#xff0c;了解工厂模式 代码分析之后有具体的讲解 1.业务和逻辑分开实现 public class Operation {public static double GetResult(double numberA,double numberB,String operate){double result 0;switch (operate){case "":r…

SpringBoot+Vue项目月度员工绩效考核管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…

Kubernetes:通过 kubectl 插件 kubectl-tree 查看API对象层级关系

写在前面 分享一个小工具 kubectl-tree&#xff0c;用于查看 k8s API 对象层级关系比如对于有状态应用来讲&#xff0c;可以看到Deployment --> ReplicaSet --> Pod 的构成关系博文内容涉及&#xff1a;tree 插件的安装以及使用。理解不足小伙伴帮忙指正 岂其食鱼&#x…

Java---微服务---Nacos安装

Nacos安装1.Windows安装1.1.下载安装包1.2.解压1.3.端口配置1.4.启动1.5.访问2.Linux安装2.1.安装JDK2.2.上传Nacos安装包2.3.解压2.4.端口配置2.5.启动2.6.访问3.Nacos的依赖1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供…

Java/JavaScript有哪些图形图像处理的框架?

文章目录一个小问题引发的学习热潮其它几个图形库Eclipse GEF框架Java图像库JS 的图形框架图形处理库图像编辑物理引擎流程图/组织图/图编辑等全景图/AR/VR3D库Javascript游戏编程库尾声一个小问题引发的学习热潮 一直对Java图形图像编程念兹在兹&#xff0c;书架上有几本相关…

2、IDEA的卸载与安装

文章目录2、IDEA的卸载与安装2.1 卸载过程2.2 安装前的准备2.3 安装过程2.4注册过程方式一&#xff1a;免费试用30天方式二&#xff1a;官网购买方式三&#xff1a;教育使用2.5 闪退问题【尚硅谷】idea实战教程-讲师&#xff1a;宋红康 生活是属于每个人自己的感受&#xff0c;…

3.1 卷积神经网络的应用领域|卷积的作用|卷积特征值的计算方法|得到特征图表示|步长与卷积核大小对结果的影响|边缘填充方法

文章目录卷积神经网络的应用领域卷积的作用卷积特征值的计算方法得到特征图表示步长与卷积核大小对结果的影响边缘填充方法卷积神经网络的应用领域 检测任务分类与检索超分辨率重构医学任务无人驾驶NVIDIA Tegra X1&#xff08;显卡 GPU&#xff09; 卷积的作用 卷积神经网络…

产品设计-基础控件-信息输出控件

产品设计-基础控件-信息输出控件1.1 走马灯1.1.1 图片轮播样式1.1.2 文字轮播样式1.2 折叠面板1.3 时间轴与步骤条1.3.1 时间轴1.3.2 步骤条1.4标签和徽标1.4.1 标签和徽标1.4.2 徽标1.5 面包屑与查询器1.5.1 面包屑1.5.2 查询器1.6 列表页与详情页1.6.1 列表页1.6.2 详情页1.7…

【实操案例十】函数操作 实例代码及运行效果图!

任务一&#xff1a;Mini计算器 # 任务一&#xff1a;Mini计算器 def calc(a, b, op):if op :return add(a, b)elif op -:return sub(a, b)elif op *:return mul(a, b)elif op /:if b ! 0:return div(a, b)else:return 0不能为除数&#xff01;def add(a, b):return a bde…

这种银行病毒是2022年12月的头号恶意软件

到 2022 年&#xff0c;全球网络攻击同比增长 38%&#xff0c;并且是由更小、更灵活的黑客和勒索软件团伙驱动的。 根据一份报告&#xff0c;全球网络攻击数量在第四季度达到历史新高&#xff0c;平均每个组织每周发生 1,168 次攻击。 现在&#xff0c;一份新报告列出了上个月…

【iMessage苹果推】iOS 当地推送(Local Push) 安装OS CSR文件尽可能多地使每个证书区分开

推荐内容IMESSGAE相关 作者✈️IMEAX推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容3.日历推 *** …

长短期记忆(LSTM)详解

入门小菜鸟&#xff0c;希望像做笔记记录自己学的东西&#xff0c;也希望能帮助到同样入门的人&#xff0c;更希望大佬们帮忙纠错啦~侵权立删。 ✨完整代码在我的github上&#xff0c;有需要的朋友可以康康✨ ​​​​​​https://github.com/tt-s-t/Deep-Learning.git 目录 一…

【C语言进阶】指针进阶(干货)

目录 一、字符指针 二、指针数组 三、数组指针 1、数组指针的定义 2、&数组名和数组名的区别 3、数组指针的使用 四、数组传参和指针传参 1、一维数组传参 2、一级指针传参 3、二维数组传参 4、二级指针传参 五、函数指针 1、函数指针的定义 2、函数指针的使用 六、…

论文阅读:《Collision Avoidance Testing of the Waymo Automated Driving System》

文章目录1 背景2 方法2.1 Overview2.2 安全测试目标2.2.1 测试目标设定方法&#xff08;Method to Set the Test Objective&#xff09;2.2.2 测试目标度量方法&#xff08;Metrics to Measure the Test Objectives&#xff09;2.3 基于潜在危机情况的测试场景&#xff08;Test…

17种编程语言实现排序算法-希尔排序

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort/ 覆盖语言&#xff1a;C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台&#xff1a;安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、…

Unity HurricaneVR 插件中的 VRIK 设置

IK&#xff08;反向动力学&#xff09;有利于提升 VR 应用中的沉浸感&#xff0c;比如我们可以通过对手部的追踪&#xff0c;再结合 IK&#xff0c;来模拟 VR 中人物的手臂和手肘的姿态。 Final IK 是 Unity 一款功能强大的 IK 插件&#xff0c;其中拥有适用于 VR 的 IK 功能&…

基于微信小程序的自驾游拼团小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…

逻辑陷阱型蜜罐合约

蜜罐是传统安全领域中的一个概念&#xff0c;通常指安全人员设置一些陷阱&#xff08;比较明显的漏洞&#xff09;&#xff0c;让攻击者自己掉入我们设置好的陷阱中&#xff0c;以便安全人员分析攻击者的作恶手法。蜜罐合约&#xff08;HoneyPots Contract&#xff09;也是类似…

pandarallel 是一个简单而有效的工具,可以在所有可用的 CPUs 上并行执行 pandas 操作

文章目录 一、简介二、特点三、用户指南CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、简介 官方文档地址:https://nalepae.github.io/pandarallel/ Github 链接:https://github.com/nalepae/pandarallel pandarallel 是一个简单而有效的工具,可以在所有可用的 CPU…

06 |「栈和队列」简析

前言 前言&#xff1a;研究一个数据结构的时候&#xff0c;首先讲的是增删改查。 文章目录前言一、简介1. 结构2. 特点3. 存储二、栈1. 类比举例2. 操作3. 实现1&#xff09;顺序栈&#xff08;常用&#xff09;a. 核心b. 要素c. 入栈d. 出栈2&#xff09;链式栈三、队列1. 类比…