动态规划之矩阵连乘

18 篇文章 2 订阅
订阅专栏
10 篇文章 0 订阅
订阅专栏

动态规划算法:

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

2.递归的定义最优值

3.自底向上的方式计算出最优值

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

 1.分解最优解的结构

将矩阵连乘积Ai.....Aji:j],计算A[1:n]的一个最优次序,设这个计算次序在矩阵Ak和Ak+1之间断开,加括号的方式为((A1A2...Ak)(Ak+1Ak+2....An)),这个问题的关键是一个最优次序所包含的计算矩阵子问题次序夜市最优的。矩阵连乘积计算次序问题的最优解包含着其子问题的最优解,这种性质称为最优子结构性质。

2.建立递归关系

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

当i=j时,A[i:j]=A为单一矩阵,无需计算,m[i][i]=0

当i<j时,可是由最优子结构性质来计算,但我们不知道断开点k的位置,所以k未定,但k有j-i个可能位置,k是j-i个位置中使得计算量达到最小的那个位置。

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

3.计算最优解

用动态规划算法解决此问题,依据其递归式子以自底向上的方式进行计算,在计算过程中,保存已解决的子问题答案,每个子问题只计算一次,在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间算法,处理计算最优值的数组外,还输出记录最优断开位置的数组。 

 4.构造最优解

目前只给出了最优值,没有给出最优解,通过计算,我们只知道要计算所给矩阵连乘积所需的最少数乘次数,还不知道具体应该按照什么次序来做矩阵乘法。s[i][j]中的告诉我们计算矩阵链A[i:j]的最佳方式应该在矩阵Ak和Ak+1,逐层递推就可以确定A[1:n]的最优计算次序。

class Matrix:
    def __init__(self,row_num=0,col_num=0,matrix=None):
        if matrix != None:
            self.row_num = len(matrix)
            self.col_num = len(matrix[0])
        else:
            self.row_num = row_num
            self.col_num = col_num
        self.matrix = matrix

def matrix_chain(matrixs):
    matrix_num = len(matrixs)
    # 生成两个二维数组
    # 存储最优值
    count = [[0 for j in range(matrix_num)] for i in range(matrix_num)]
    # 存储K值
    flag = [[0 for j in range(matrix_num)] for i in range(matrix_num)]
    
    for interval in range(1,matrix_num+1):
        for i in range(matrix_num-interval):
            j = i + interval
            count[i][j] = count[i][i] + count[i+1][j] + matrixs[i].row_num*matrixs[i+1].row_num *matrixs[j].col_num
            # 将断开的位置记在flag中
            flag[i][j] = i
            for k in range(i+1,j):
                temp = count[i][k]+count[k+1][j]+matrixs[i].row_num*matrixs[k+1].row_num*matrixs[j].col_num
                if temp<count[i][j]:
                    count[i][j] = temp
                    flag[i][j] =k
    traceback(0,matrix_num-1,flag)
    return count[0][matrix_num-1]

# 输出最优解
def traceback(i,j,flag):
    if i == j:
        return
    if j-i>1:
        print(str(i+1)+'~'+str(j+1),end=':')
        print(str(i+1)+":"+str(flag[i][j]+1),end=',')
        print(str(flag[i][j]+2)+":"+str(j+1))
    traceback(i,flag[i][j],flag)
    traceback(flag[i][j]+1,j,flag)


matrixs = [Matrix(30,35),Matrix(35,15),Matrix(15,5),Matrix(5,10),Matrix(10,20),Matrix(20,25)]
result = matrix_chain(matrixs)
print(result)

运行结果:
1~6:1:3,4:6
1~3:1:1,2:3
4~6:4:5,6:6
15125


package com.company;

public class Main {
    //求解最优值
    public static int matrixChain(int[] p, int[][] m, int[][] s) {
        int n = p.length - 1;
        for (int i = 1; i <= n; i++)
            //本身为0
            m[i][i] = 0; //初始化二维数组
        for (int r = 2; r <= n; r++) {
            for (int i = 1; i <= n - r + 1; i++) {
                int j = i + r - 1;
                //先以i进行化为
                m[i][j] = m[i + 1][j] + p[i - 1] * p[i] * p[j];//求出Ai到Aj的连乘
                s[i][j] = i;//记录划分位置
                for (int k = i + 1; k < j; k++) {
                    //寻找是否有可优化的分割点
                    int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];//公式
                    if (t < m[i][j]) {
                        m[i][j] = t;
                        s[i][j] = k;
                    }
                }

            }
        }
        return m[1][n];

    }

    //输出A[i][j]的最优计算次序
    public static void traceback(int i, int j, int[][] s) {
        //输出A[i:j]的最有计算次序
        if (i == j) {
            //递归出口
            System.out.print("A" + i);
            return;
        } else {
            System.out.print("(");
            //递归的输出左边
            traceback(i, s[i][j], s);
            //递归的输出右边
            traceback(s[i][j] + 1, j, s);
            System.out.print(")");
        }
    }


    public static void main(String[] args) {
        int[] p = new int[]{5, 7, 4, 3, 5};
        int[][] m = new int[p.length][p.length];
        int[][] s = new int[p.length][p.length];
        System.out.println("最优值为: " + matrixChain(p, m, s));
        traceback(1, p.length - 1, s);


    }

}

运行结果:
最优值为: 264
((A1(A2A3))A4)

以上涉及代码是借鉴其他博主滴,自己没有复现出来~

动态规划矩阵连乘问题Python实现方法
12-24
本文实例讲述了动态规划矩阵连乘问题Python实现方法。分享给大家供大家参考,具体如下: 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 例如: A1={30×35} ; A2={35×15} ;A3={15×5} ;A4={5×10} ;A5={10×20} ;A6={20×25} ; 结果为:((A1(A2A3))((A4A5)A6))  最小的乘次为15125。 原问题为n个矩阵连乘,将原问题分解为子问题,即当n等于1,2,3…..时。 n==1时,单一矩阵,不
动态规划之——矩阵连乘(全网最详细博文,看这一篇就够了!)
扬俊的小屋
06-30 7万+
动态规划矩阵连乘
动态规划矩阵连乘问题详细解读(思路解读+填表+代码)
热门推荐
weixin_44952817的博客
11-25 7万+
动态规划简介 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填
动态规划解决矩阵连乘问题
weixin_53113130的博客
06-10 5368
给定n个矩阵{A1,A2,…,An},其中,Ai与Ai+1是可乘的,(i=1,2 ,…,n-1)。用加括号的方法表示矩阵连乘的次序,不同的计算次序计算量(乘法次数)是不同的,找出一种加括号的方法,使得矩阵连乘的次数最小。 ......
动态规划---例题1.矩阵连乘问题
PG13okc的博客
10-29 5502
一.问题描述 矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数.若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵.其标准计算公式为: 计算C=AB总共需要pqr次的数乘. 给定n个矩阵{A1,A2,…,An}.其中Ai与Ai+1是可乘的,i=1,2,…,n-1.要求计算出这n个矩阵的连乘积A1A2…An. 二.解题思路 矩阵乘法满足结合律,故连乘积的计算可以有许多不同的计算次序.这种计算次序可以用加括号的方式来确定.若一个矩阵连乘积的计算次序已完全确定,也就是说该连乘积已
C语言矩阵连乘 (动态规划)详解
08-30
矩阵连乘动态规划方法可以将矩阵连乘问题分解成小问题,每个小问题都可以通过矩阵连乘的方式来解决,然后组合这些小问题的解决方案来得到最优的矩阵连乘顺序。 矩阵连乘动态规划方法可以分为两个步骤:第一步是...
动态规划矩阵连乘最优值
04-02
动态规划矩阵连乘最优值,对于矩阵连乘中矩阵发排序,应用动态规划计算
动态规划实现矩阵连乘-C++.doc
12-02
动态规划实现矩阵连乘-C++是一种高效的矩阵乘法算法,使用动态规划技术来计算矩阵的最佳乘法顺序。该算法可以解决矩阵连乘问题,找到矩阵之间的最优乘法顺序,以减少计算时间和空间复杂度。 Knowledge Point 1: ...
Java矩阵连乘问题(动态规划)算法实例分析
08-28
Java矩阵连乘问题(动态规划)算法实例分析 本文主要介绍了Java矩阵连乘问题的动态规划算法实例分析。矩阵连乘问题是指给定n个矩阵,确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 ...
动态规划矩阵连乘代码实现
05-06
动态规划算法矩阵连乘的实现代码,主要是用C语言编写;
动态规划C语言矩阵连乘
04-08
"动态规划C语言矩阵连乘" 动态规划是一种非常重要的算法思想,它可以解决很多 Optimization 问题。在这个资源中,我们将学习如何使用动态规划来解决矩阵连乘问题。 动态规划的基本思想是将待解决的问题分解成若干...
算法】【动态规划矩阵连乘.doc
05-07
矩阵连乘动态规划 矩阵连乘是矩阵运算中的一种重要操作,它是指两个矩阵的元素逐个相乘,矩阵连乘的结果是一个新的矩阵。矩阵连乘有很多实际应用,如图像处理、机器学习、数据分析等。 动态规划是解决矩阵连乘...
动态规划--矩阵连乘
06-28
关于使用动态规划解决矩阵连乘问题的Java代码及必要注释
动态规划&备忘录方法&递归方法
traceorigin的专栏
04-30 7653
动态规划的基本思想是,将原问题拆分为若干子问题,自底向上的求解。其总是充分利用重叠子问题,即通过每个子问题只解一次,把解保存在一个表中,巧妙的避免了子问题的重复求解。 递归方法,采用的是自顶向下的思想,拆分为若干子问题,但是造成了子问题的重复求解。 备忘录方法,采用的也是自顶向下的思想,但是该方法维护了一个记录子问题解的表,虽然填表动作的控制结构更像递归方法,但是的确避免了子问题的重复求解。
动态规划矩阵连乘问题(文末附有手写版例题)
m0_47352999的博客
04-06 4230
动态规划矩阵连乘问题(文末附有手写版例题)
动态规划(一)——矩阵连乘
persimmon_xh的博客
12-25 1967
矩阵连乘 题目:给定 n 个矩阵 hA 1 ,A 2 ,…,A n i, 其中 A i 和 A i+1 是可乘的, i = 1,2,…,n − 1. 考虑这 n 个矩阵的连乘积 A 1 × A 2 × ··· × A n 的计算方法? 首先可以暴力枚举,列举所有矩阵连乘的方法所需要的计算量,然后选出最小的那个一个,但是矩阵连乘的方法数很大,可以通过p2函数进行计算,见下列代码。 计算矩阵连乘的方法数的公式为: int p2(int num)//num为矩阵个数 { if(num==1) { r
python实现动态规划矩阵连乘
最新发布
11-18
以下是Python实现动态规划矩阵连乘的方法: 假设有n个矩阵,它们的维度分别为d0, d1, d2, ..., dn,那么这n个矩阵的连乘积的最小计算次数可以通过以下动态规划算法求解: 1. 定义一个n x n的二维数组m,其中m[i]...

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Transformer之编码器 8374
  • Python机器学习基础教程 3944
  • 数据结构Python版--树 3036
  • 跟李沐学AI之注意力机制+transformer 2524
  • python基础 1774

分类专栏

  • 深度学习 10篇
  • LeetCode 10篇
  • 机器学习 13篇
  • python学习 18篇

最新评论

  • 跟李沐学AI--深度学习之模型选择

    ZhengYL0302: 为啥我的is_train=False后面的False会报红?

  • 数据结构Python版--递归

    yuanshuo0914: 讲的真好,跟我老师讲的一模一样

  • Python机器学习基础教程10

    小小小方: 是的 我只是把我看的做了整理 怕我自己会忘

  • Python机器学习基础教程10

    空白座: 我记得这个是《python机器学习基础教程》这本书上原原本本的东西

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 跟李沐学AI之注意力机制+transformer
  • Hugging Face学习
  • 跟李沐学AI之计算性能+图像分类
2022年47篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码南山百度标王深圳关键词排名福永网站优化广州网站推广工具平湖网站建设设计大芬百度竞价罗湖网页设计西乡百度标王平湖网站制作设计西乡百搜标王荷坳网站推广系统广州高端网站设计荷坳网站制作爱联设计公司网站大芬模板网站建设大运SEO按天计费塘坑外贸网站设计罗湖关键词按天收费南澳阿里店铺托管宝安网站定制坪地百度标王同乐网站优化推广永湖网站优化推广坑梓网页制作荷坳模板制作布吉网站改版坂田标王吉祥seo网站推广沙井网站优化推广坪山如何制作网站歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化