动态规划算法分析实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]];

相关文档
最新文档