动态规划之矩阵连乘

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)

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

动态规划之——矩阵连乘(全网最详细博文,看这一篇就够了!)
扬俊的小屋
06-30 6万+
动态规划矩阵连乘
动态规划矩阵连乘问题详细解读(思路解读+填表+代码)
热门推荐
weixin_44952817的博客
11-25 7万+
动态规划简介 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填
动态规划解决矩阵连乘问题
weixin_53113130的博客
06-10 5234
给定n个矩阵{A1,A2,…,An},其中,Ai与Ai+1是可乘的,(i=1,2 ,…,n-1)。用加括号的方法表示矩阵连乘的次序,不同的计算次序计算量(乘法次数)是不同的,找出一种加括号的方法,使得矩阵连乘的次数最小。 ......
动态规划&备忘录方法&递归方法
traceorigin的专栏
04-30 7641
动态规划的基本思想是,将原问题拆分为若干子问题,自底向上的求解。其总是充分利用重叠子问题,即通过每个子问题只解一次,把解保存在一个表中,巧妙的避免了子问题的重复求解。 递归方法,采用的是自顶向下的思想,拆分为若干子问题,但是造成了子问题的重复求解。 备忘录方法,采用的也是自顶向下的思想,但是该方法维护了一个记录子问题解的表,虽然填表动作的控制结构更像递归方法,但是的确避免了子问题的重复求解。
动态规划矩阵连乘问题Python实现方法
12-24
本文实例讲述了动态规划矩阵连乘问题Python实现方法。分享给大家供大家参考,具体如下: 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算...
动态规划矩阵连乘最优值
04-02
动态规划矩阵连乘最优值,对于矩阵连乘中矩阵发排序,应用动态规划计算
C语言矩阵连乘 (动态规划)详解
08-30
主要介绍了C语言矩阵连乘 (动态规划)详解的相关资料,需要的朋友可以参考下
基于动态规划求解矩阵连乘问题
m0_49071428的博客
01-06 2040
算法设计与分析 基于动态规划求解矩阵连乘问题
矩阵连乘问题实现(最佳加括号方式-动态规划算法)
11-15
矩阵连乘问题分析和实现用于动态规划 最佳加括号方式-动态规划算法
算法分析 - 动态规划算法矩阵连乘动态规划
Spike的秃头之路
06-09 1348
【问题描述】使用动态规划算法矩阵连乘问题,具体来说就是,依据其递归式自底向上的方式进行计算,在计算过程中,保存子问题答案,每个子问题只解决一次,在后面计算需要时只要简单查一下得到其结果,从而避免大量的重复计算,最终得到多项式时间的算法。 【输入形式】在屏幕上输入第1个矩阵的行数和第1个矩阵到第n个矩阵的列数,各数间都以一个空格分隔。 【输出形式】矩阵连乘A1…An的最少数乘次数和最优计算次序。 【样例1输入】 30 35 15 5 10 20 25 【样例1输出】 15125 ((A1(A2A3))((.
动态规划——矩阵连乘问题
勿在浮沙筑高台
08-09 2224
动态规划算法与分页发类似,基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分冶法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是相互独立的。所以若用分冶法解这类问题,则分解得到的子问题太多,以至于最后解决原问题
动态规划-矩阵连乘(Matrix Chain-Product)
HETUW的博客
04-11 981
算法与数据结构-动态规划-矩阵连乘(Matrix Chain-Product)
动态规划算法解决矩阵连乘问题
愿君出走半生,归来时仍是少年
06-23 3242
对一系列的矩阵进行乘法运算,求最佳的运算结合顺序,使得所需的乘法总次数最少。 我们知道,矩阵连乘满足结合律,如对于四个矩阵相乘 ABCD,有 ABCD = (ABC)D = (AB)(CD) = A(BCD) = ... 但是结合顺序不同,所需要的乘法总次数也就不同,如对于三个矩阵连乘 A[10*30] * B[30*5] * C[5*60],有两种结合顺序,每种结合顺序所需的乘法总次数如下: (AB)C = (10×30×5) + (10×5×60) = 1500 + 3000 = 4500 次
动态规划算法矩阵连乘
ScriptFlying的博客
10-31 2265
1、动态规划算法基本思想: 与分治法类似,也是将待求解问题分解成若干个子问题,但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。 2、基本步骤: 1)找出最优解的性质,并刻划其结构特征。 2)递归地定义最优值。 3)以自底向上的方式计算出最优值。 4)根据计算最优值时得到的信息,构造最优解。 3、矩阵连乘问题: 由于矩阵乘...
矩阵连乘问题(递归与动态规划实现)
qyh的博客
07-04 3921
问题描述 给定n个矩阵{A1A2…An},其中Ai和Ai+1是可乘的,考察这n个矩阵的连乘积A1A2…An。由于矩阵的乘法满足结合律,故计算矩阵的连乘积有许多不同的计算次序,而不同的计算次序,所需要计算的连乘次数也是不同的,求解连乘次数最少的矩阵连乘最优次序。 ** 递归实现: **#include “stdafx.h” int p[100],s[100][100],n; //计算最优值 int LookupChain(int i, int j,) { if (i == j) return 0; int u
python 矩阵乘法动态规划实现_动态规划矩阵连乘问题Python实现方法
weixin_31448735的博客
02-19 361
本文实例讲述了动态规划矩阵连乘问题Python实现方法。分享给大家供大家参考,具体如下:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。例如:A1={30x35} ; A2={35x15} ;A3={15x5} ;A4={5x10} ;A5={10x20} ;A6={20x...
动态规划实现矩阵连乘
aqba2009的专栏
01-06 200
(1)问题描述 给定n个矩阵的链&lt;A 1 ,A 2 ,…,A n &gt;,其中i=1,2,…,n,矩阵A i的维数为p i-1 ×p i 。求一个完全“括号化方案”,使得计算乘积A 1 A 2 …A n 所需的标量乘法次数最小   (2)最优括号化方案的结构特征 用记号 A i,j 表示 A i A i+1 …A j 通过加括号后得到的一个最优计算模式,且恰好在A k 与A k+1 之间分...
python实现动态规划矩阵连乘
最新发布
11-18
以下是Python实现动态规划矩阵连乘的方法: 假设有n个矩阵,它们的维度分别为d0, d1, d2, ..., dn,那么这n个矩阵的连乘积的最小计算次数可以通过以下动态规划算法求解: 1. 定义一个n x n的二维数组m,其中m[i]...

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

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

热门文章

  • Transformer之编码器 8248
  • Python机器学习基础教程 3907
  • 数据结构Python版--树 3002
  • 跟李沐学AI之注意力机制+transformer 2498
  • python基础 1753

分类专栏

  • 深度学习 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、付费专栏及课程。

余额充值

深圳SEO优化公司芜湖网络营销多少钱许昌企业网站设计公司和县seo价格广州百度竞价公司钦州seo优化哪家好江门网站设计模板哪家好哈密建站价格西安网络营销多少钱楚雄建网站多少钱石家庄网站开发公司松岗高端网站设计哪家好宁波seo优化价格昭通营销型网站建设多少钱温州百度竞价包年推广多少钱保定高端网站设计报价辽源百度seo推荐永新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次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化