动态规划算法分析实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态规划算法分析实验报告
————————————————————————————————作者: ————————————————————————————————日期:
ﻩ
动态规划算法设计
一、实验内容
编程实现图示多段图的最短路径问题的动态规划算法。(源代码见附录A)
二、实验目的及环境
实验目的:
1、理解动态规划算法的概念;
2、掌握动态规划算法的基本要素; 3、掌握设计动态规划算法的步骤;
4、通过应用范例学习动态规划算法的设计技巧与策略。 实验环境:
WIN7 系统下VC ++6.0环境
1
2
3
4
5
6
7
8
11
10
9
12
9
7 3 2
8
1 6
5 3 5 5
2 4
6 4 4 2 1 1 2
7
三、实验分析与设计
采用动态规划算法的两个基本要素:
最优子结构性质:原问题的最优解包含了其子问题的最优解。
子问题的重叠性质:每次产生的子问题并不总是新问题,有些子问题被反复计算多次。
实验定义:
#define n12/*定义顶点数*/
#define k 5 /*定义段数*/
void init(int cost [ ])//初始化图
void fgraph(int cost[],int path[ ],int d[])向前递推算法求最短路径
voidbgraph(int bcost[ ],intpath1[],int d[])向后递推算法求最短路径
向前递推算法实现:
{int r,j,temp,min;
for(j=0;j<=n;j++)
ﻩcost[j]=0;
ﻩfor(j=n-1;j>=1;j--)
{ temp=0;
min=c[j][temp]+cost[temp]; //初始化最小值
ﻩfor(r=0;r<=n;r++)
{if(c[j][r]!=MAX)
ﻩ{ ﻩif((c[j][r]+cost[r]) ﻩ{ min=c[j][r]+cost[r]; ﻩtemp=r; ﻩﻩﻩﻩ} ﻩﻩ} ﻩﻩ} ﻩcost[j]=c[j][temp]+cost[temp]; ﻩﻩd[j]=temp; ﻩ} path[1]=1; ﻩpath[k]=n; for(j=2;j<k;j++) ﻩpath[j]=d[path[j-1]]; } 后递推算法与前递推算法类似。 四、实验结果显示 五、实验总结 通过理解最优子结构的性质和子问题重叠性质,在VC++6.0环境下实现动态规划算法。动态规划算法是由单阶段的决策最优逐步转化为多阶段的决策最优,最后构造一个最优解。经过反复的调试操作,程序运行才得出结果。 六、附录 A #include #include #include #include <iostream.h> #defineMAX 100 #define n12 #define k 5 int c[n][n]; voidinit(intcost[]) { ﻩint i,j; for(i=0;i<13;i++) { ﻩfor(j=0;j<13;j++) ﻩﻩ{ ﻩﻩc[i][j]=MAX; ﻩ} } ﻩc[1][2]=9;c[1][3]=7;c[1][4]=3; c[1][5]=2; c[2][6]=4;c[2][7]=2; c[2][8]=1; ﻩc[3][6]=2; c[3][7]=7; c[4][8]=11; ﻩc[5][7]=11;c[5][8]=8; c[6][9]=6; c[6][10]=5; ﻩc[7][9]=4; c[7][10]=3; ﻩc[8][10]=5;c[8][11]=6; ﻩc[9][12]=4; ﻩc[10][12]=2; c[11][12]=5; } voidfgraph(int cost[],int path[],intd[]) { int r,j,temp,min; for(j=0;j<=n;j++) ﻩcost[j]=0; for(j=n-1;j>=1;j--) ﻩ{ temp=0; ﻩmin=c[j][temp]+cost[temp]; ﻩfor(r=0;r<=n;r++) ﻩ{ ﻩif(c[j][r]!=MAX) ﻩif((c[j][r]+cost[r])<min) ﻩ{ ﻩﻩmin=c[j][r]+cost[r]; ﻩﻩtemp=r; ﻩﻩﻩ} ﻩ} ﻩ} cost[j]=c[j][temp]+cost[temp]; ﻩd[j]=temp; ﻩ} ﻩpath[1]=1; path[k]=n; ﻩfor(j=2;j<k;j++) ﻩpath[j]=d[path[j-1]]; } voidbgraph(int bcost[],intpath1[],intd[]) { intr,j,temp,min; ﻩfor(j=0;j<=n;j++) ﻩbcost[j]=0; for(j=2;j<=n;j++) { temp=12; min=c[temp][j]+bcost[temp]; ﻩfor(r=0;r<=n;r++) ﻩ{ ﻩﻩﻩif(c[r][j]!=MAX) { ﻩﻩif((c[r][j]+bcost[r]) ﻩﻩﻩ{ ﻩﻩﻩmin=c[r][j]+bcost[r]; ﻩﻩﻩtemp=r; ﻩ} } ﻩﻩ} ﻩﻩbcost[j]=c[temp][j]+bcost[temp]; ﻩﻩd[j]=temp; ﻩ} path1[1]=1; ﻩpath1[k]=n; for(inti=4;i>=2;i--) ﻩ{ path1[i]=d[path1[i+1]]; }