栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

矩阵连乘python动态规划实现

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

矩阵连乘python动态规划实现

import numpy as np

"""
对于矩阵{A_0,A_1,... ...,A_n}
对应阶数{P_0,P_1,... ...,P_n,P_n+1}
它们的行列表达为 A_0 = P_0 * P_1
"""


def matrixChain(p, n=1, memo=None, seq=None):
    #
    size = len(p) - n  # 子问题个数
    if n == 1:  # 长度为1的矩阵链,数乘次数为0
        memo = np.zeros([size, size], dtype=int)
        seq = np.zeros([size, size], dtype=int)

    else:  # 其他长度
        for i in range(size):  # 左边界
            j = i + n - 1  # 右边界
            for k in range(i, j):  # 分界位置
                t = memo[i, k] + memo[k + 1, j] + p[i] * p[k + 1] * p[j + 1]
                if t < memo[i, j] or memo[i, j] == 0:
                    memo[i, j] = t
                    seq[i, j] = k
    # 进入n+1
    if n < len(p) - 1:
        matrixChain(p, n + 1, memo, seq)
    return memo, seq

def prtSeq(seq, i, j):
    size = j-i+1
    if size ==1:
        return 'A%d'%i
    else:   # 至少有三个元素,才要考虑数乘顺序
        k = seq[i,j]  # 分界位置
        res = ''
        res += '('+ prtSeq(seq, i,   k)
        res += prtSeq(seq, k+1, j) + ')'
        return res

n = eval(input('请输入矩阵个数:'))
p = eval(input('请输入矩阵尺寸:'))
m,seq = matrixChain(p)
res = prtSeq(seq,0,n-1)
print('最佳数乘次序:%s, 此时数乘次数:%d'%(res[1:-1], m[0,-1]))

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/468018.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号