实验三动态规划

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

实验二动态规划

(一)、实验目的

通过编程实现动态规划的有关算法,理解动态规划的原理,掌握动态规划基本思想与应用技巧。

(二)、实验题目与要求:

实验题目1:最长公共子序列问题的算法

若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk}是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k 有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X 和Y的公共子序列。

给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。

实验要求:

1.理解动态规划算法的原理,认真阅读题目。完善程序,实现该算法;

2.结果显示最长公共子序列。

实验提示:

先求最长公共子序列,X和Y的最长公共子序列的长度记录于c[m][n]中

public static int lcsLength(char [ ]x,char [ ]y,int [ ][ ]b)

{ int m=x.length-1;

int n=y.length-1;

int [][]c=new int [m+1][n+1];

for (int i = 1; i <= m; i++) c[i][0]=0;

for (int i = 1; i <= n; i++) c[0][i]=0;

for (int i = 1; i <= m; i++)

for (int j = 1; j <= n; j++) {

if (x[i]= =y[j]) { c[i][j]=c[i-1][j-1]+1; b[i][j]=1;}

else if (c[i-1][j]>=c[i][j-1]) { c[i][j]=c[i-1][j]; b[i][j]=2;}

else { c[i][j]=c[i][j-1]; b[i][j]=3;}

}

return c[m][n];

}

然后构造最长公共子序列

public static void lcs(int i,int j,char [] x,int [][] b)

{ if (i = =0 || j= =0) return;

if (b[i][j]= = 1){

lcs(i-1,j-1,x,b);

System.out.print(x[i]);

}

else if (b[i][j]= = 2) lcs(i-1,j,x,b); else lcs(i,j-1,x,b);

}

实验题目2:用两台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,有ai≥bi,而对于某些j,j≠i,有aj

1.理解动态规划算法的原理,认真阅读题目。完善程序,实现该算法;

2.研究一个实例:

(a1, a2, a3, a4, a5, a6) = (2, 5, 7, 10, 5, 2) ;

(b1, b2, b3, b4, b5, b6)=(3, 8, 4, 11, 3, 4)。

结果显示处理完所有作业的最短时间。

实验题目3:计算矩阵连乘积

给定n个矩阵{A1,A2 ,...,An},其中Ai与Ai+1是可乘的,i=1,2,...,n-1。考察这n个矩阵的连乘积A1A2...An,给出其最优计算次序,使矩阵连乘运算乘法次数最少。

实验要求:

1.理解动态规划算法的原理,认真阅读题目。完善程序,实现该算法;

2.给定五个矩阵:A1:5*10;A2:10*4;A3:4*6;A4:6*10;A5:10*2,给出最优计算次序和乘法次数。

实验提示:

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

[][][]{}

⎪⎩⎪⎨⎧<+++==-<≤j i p p p j k m k i m j i j i m j k i j k i 1,1,min 0,最优值为m[1,n]。

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

public static void matrixChain(int [] p, int [][] m, int [][] s)

{ int n=p.length-1;

for (int i = 1; i <= n; i++) 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;

m[i][j] = m[i+1][j]+ p[i-1]*p[i]*p[j];

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; }

}

}

}

实验题目4:0-1背包问题

给定n 种物品和一背包。物品i 的重量是wi ,其价值为vi ,背包的容量为C 。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 实验要求:

1. 理解动态规划算法的原理,认真阅读题目。完善程序,实现

该算法;

2. 自行设计输入数据和输出格式。

实验提示:

设n 个物品的重量存储在数组w[n]中,价值存储在数组v[n]中,背包容量为C ,数组V[n+1][C+1]存放迭代结果,其中V[i][j]表示前i 个物品装入容量为j 的背包中获得的最大价值,数组x[n]存储装入背包的物品,动态规划法求解0/1背包问题的算法如下:

public static int KnapSack(int C, int w[ ], int v[ ],int[][]V)

{ int n=v.length;

for (int i=0; i<=n; i++) V[i][0]=0; //初始化第0列

for (int j=0; j<=C; j++) V[0][j]=0; //初始化第0行

相关文档
最新文档