动态规划课程设计(矩阵链乘问题)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

动态规划程序设计

实验目的:掌握并实现动态规划算法。

实验内容:对维数为序列(5,10,3,12,5,50,6)的各矩阵。找出其矩阵链乘的一个最优加全括号。实验要求:利用动态规划思想写出算法的伪代码和C程序代码

(一)算法思想

穷举所有的计算次序,且对每一计算次序确定其乘法次数。由此可找出n个矩阵进行连乘积A1A2…An的最小乘法次数。

将矩阵链乘积简记为A[i:j] ,这里i≤j

考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,i≤k

计算量:A[i:k]的计算量加上A[k+1: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,i]=0,i=1,2,…,n

当i

可以递归地定义m[i,j]为:

k位置只有j-i种可能

(二)程序代码

//动态规划

import java.io.*;

public class Testsuanfa {

public final int len = this.GetN()+1;

public int[] A = new int[len];

public double[][] M = new double[len][len];

public double[][] S = new double[len][len];

//取得用户需要规划的矩阵连乘的个数。

public int GetN(){

int dvalue = 0;

String value;

System.out.println("请输入连乘矩阵个数:");

BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));

try {

value = bfr.readLine();

dvalue =Integer.parseInt(value);

//捕捉输入异常

} catch (IOException e) {

System.out.println("输入出错了,请重新输入:");

System.exit(0);

}catch (NumberFormatException e2) {

System.out.println("请输入正确的数字!!");

System.exit(0);

}

return dvalue;

}

//输入矩阵的序列

public int GetA(){

int dvalue = 0;

String value;

System.out.println("请输入分别矩阵维数序列:");

BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));

try {

value = bfr.readLine();

dvalue =Integer.parseInt(value);

//捕捉输入异常

} catch (IOException e) {

System.out.println("输入出错了,请重新输入:");

System.exit(0);

}catch (NumberFormatException e2) {

System.out.println("请输入正确的数字!!");

System.exit(0);

}

return dvalue;

}

public void f(){

//调用GetA方法,拿到每个序列值

for(int i=0;i

A[i] = this.GetA();

}

for(int i=0;i

M[i][i] = 0;

}

//依次从长度为2到len,求解每一个长度的最有加全括号。

for(int l=2;l

for(int i=1;i

int j = i+l-1;

M[i][j] = Double.MAX_V ALUE;

for(int m=i;m

double temp = M[i][m]+M[m+1][j]+A[i-1]*A[m]*A[j];

if(temp

M[i][j] = temp;

S[i][j] = m;

}

}

}

}

//调用输出方法print()

System.out.print("你输入的一组矩阵序列为:");

for(int i=0;i

System.out.print(A[i]+" ");

}

System.out.println();

System.out.println();

System.out.print("通过动态规划,其最优加全括号为:");

this.print(1,len-1);

}

//输出方法

public void print(int i,int j){

if(i==j){

System.out.print("A"+i);

}else{System.out.print("(");

this.print(i,(int) S[i][j]);

this.print((int) (S[i][j]+1),j);

System.out.print(")");

}

}

public static void main(String[] args) {//主函数定义一个对象,调用方法f(),实现动态规划。

Testsuanfa tsf = new Testsuanfa();

tsf.f();

}

}

相关文档
最新文档