动态规划最优矩阵连乘问题


\documentclass[a4paper]{ctexart}
\usepackage{amssymb}%%导入数学包
\usepackage{amsmath}
\usepackage{indentfirst}
\usepackage{listings}
\usepackage{graphicx}
\usepackage{geometry}
\usepackage{color} %%设置字体的颜色
\author{软工1班  163XXX  xxxx}
\title{算法设计第二次作业}
\begin{document}
\maketitle
\noindent {\color{blue}动态规划最优矩阵连乘问题:}

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

(1)现在给定矩阵连乘是由7个矩阵构成:

\begin{tabular}{|c|c|c|c|c|c|c|c|} %居中
  \hline
  % after \\: \hline or \cline{col1-col2} \cline{col3-col4} ...
  矩阵 & A1 & A2 & A3 & A4 & A5 & A6 & A7 \\
  \hline
  行*列 & 30*35 & 35*15 & 15*5 & 5*10 & 10*20 & 20*25 & 25*10 \\
  \hline
\end{tabular} \\

 (2)P是用来存放各个矩阵的行的维数,对P的处理情况如下:

\begin{tabular}{|c|c|c|c|c|c|c|c|c|}
  \hline
  % after \\: \hline or \cline{col1-col2} \cline{col3-col4} ...
  \hline
  P的下标 & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\
  \hline
  P值 & 30 & 35 & 15 & 5 & 10 & 20 & 25 & 10 \\
  \hline
\end{tabular} \\

(3)m[i][j]表示第i个矩阵至第j个矩阵这段的最优解,对其用值的大小来刻画。

(4)将矩阵连乘积 简记为A[i:j] ,这里i $\leqslant$ j.假设这个最优解在第k 处断开,i$\leqslant$k$<$j,则A[i:j]是最优的,那么A[i,k]和A[k+1:j] 也是相应矩阵连乘的最优解.

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

当i=j时,A[i,j]=Ai, m[i,j]=0;(表示只有一个矩阵,如A1,没有和其他矩阵相乘,故乘的次数为0)

当i$<$j时,m[i,j]=min$\{$m[i,k]+m[k+1,j] +pi-1*pk*pj$\}$ ,其中 i$\leqslant$k$<$j。故有:

\begin{equation}
m[i][j]=
\begin{cases}
0,&{i=j} \\
\min
$\{${m[i][k]+m[k+1][j]+pi-1*pk*pj}$\}$ &{i<k<j} \\
\end{cases}
\end{equation}

(5)代码如下:

\lstset{escapeinside=``}
\begin{lstlisting}[language=java]
/**
 *
 * @author Mouse
 *
 */

public class Main {

	static int MatriNum = 7; // `表示矩阵链中矩阵的数目`
	// `存放各个矩阵的行的维数`
	static int[] p = { 30, 35, 15, 5, 10, 20, 25, 10 };
	// `下面是通过数组的形式来表示矩阵的`
	// `由于数组是从0开始标记的,我们默认从1处开始存储,故下面的MatriNum需要加1`
	static int[][][] A = new int[MatriNum][][];// `存放要进行连乘的多个矩阵`
	// `用来存放Ai到Aj的最少乘次数`
	static int[][] m = new int[MatriNum + 1][MatriNum + 1];
	// `用来存放Ai到Aj的最后断开位置`
	static int[][] s = new int[MatriNum + 1][MatriNum + 1];

	// `创建矩阵a,维数为m*n 随机数填充数组内容`
	public static void CreatMatrix(int[][] a, int m, int n) {
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++)
   a[i][j] = (int) Math.round(Math.random() * 50) - 10;
	}
// `输出连乘的所有矩阵`
	public static void printAllM() {
		for (int i = 0; i < MatriNum; i++) {
			System.out.println("A" + (i + 1) + ": " 
       + A[i].length + "*"+ A[i][0].length);
			printM(A[i]);
		}

	}
// `输出单个矩阵的值`
	public static void printM(int[][] a) {
		for (int i = 0; i < a.length; i++) {
			System.out.print("   ");
			for (int j = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值