动态规划求解网络最优路径

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

动态规划算法求最短路径

1.问题描述:

在10×10的网格上任意指定起点和终点,运用动态规划算法从中找到最短路径。(要求:相邻格点权值在1到10之间)

2.问题分析:

运用动态规划的方法就是从后向前逆向思考,对于本题就是从终点出发,依次遍历网格格点,找到各点到终点的最短路径,最终找到起点到终点的最短路径。

因为找任意两点最短距离比较复杂,我只做了从一个对角到另一对角最短路径计算。

3.程序调试截图如下:

代码如下:

#include

#include

#define N 10

const int hen[N][N-1]=

{

{4 , 2 , 5 , 2 , 5 , 9 , 5 , 8 , 3},

{1 , 8 , 1 , 5 , 1 , 7 ,

1 , 4 , 4},

{6 , 4 , 3 , 1 , 2 , 4 , 10 , 3 , 9},

{8 , 6 , 10 , 8 , 3 , 6 ,

10 , 5 , 1},

{10 , 2 , 2 , 9 , 2 , 5 , 5 , 1 , 1},

{2 , 7 , 9 , 9 , 2 , 1 , 5 , 2 , 2},

{1 , 7 , 6 , 1 , 9 , 3 , 4 , 10 , 7},

{5 , 7 , 10 , 4 , 6 , 2 , 10 , 10 , 8},

{1 , 7 , 1 , 3 , 6 , 2 , 4 , 6 , 7},

{4 , 8 , 5 , 9 , 8 , 3 , 2 , 1 , 5}

};

const int shu[N-1][N]=

{

{6 , 4 , 7 , 6 , 3 , 10 , 3 , 1 , 6 , 9},

{3 , 10 , 8 , 7 , 2 , 5 , 2 , 10 , 3 , 10},

{8 , 8 , 7 , 6 , 3 ,

8 , 3 , 8 , 5 , 8},

{2 , 5 , 4 , 3 , 5 , 3 , 4 , 5 , 7 , 1},

{7 , 5 , 9 , 5 , 4 , 5 , 5 , 6 , 7 , 3},

{2 , 5 , 6 , 5 , 10 , 6 ,

6 , 3 , 4 , 4},

{4 , 4 , 4 , 3 , 5 , 3 , 1 , 5 , 4, 7},

{7 , 6 , 10 , 4 , 2 , 7 , 3 , 10 , 10 , 2},

{8 , 6 , 9 , 2 , 10 , 8 , 9 , 6 , 7 , 8}

};

int main()

{

int i,j,k1,k2;

int x=0;

int y=0;

int d[N][N];

int u_x[N][N];

int u_y[N][N];

d[N-1][N-1]=0;

u_x[N-1][N-1]=u_y[N-1][N-1]=N-1;

for(i=0;i<=N-2;i++)

for(j=0;j<=i+1;j++)

{

if(j==0)

{

d[N-2-i+j][N-1-j]=d[N-1-i+j][N-1-j]+shu[N-2-i][N-1];

u_x[N-2-i+j][N-1-j]=N-1-i+j;

u_y[N-2-i+j][N-1-j]=N-1-j;

}

else if(j==i+1)

{

d[N-2-i+j][N-1-j]=d[N-2-i+j][N-j]+hen[N-1][N-2-i];

u_x[N-2-i+j][N-1-j]=N-2-i+j;

u_y[N-2-i+j][N-1-j]=N-j;

}

else

{

k1=d[N-2-i+j][N-j]+hen[N-2-i+j][N-1-j];

k2=d[N-1-i+j][N-1-j]+shu[N-2-i+j][N-1-j];

if(k1<=k2)

{

d[N-2-i+j][N-1-j]=k1;

u_x[N-2-i+j][N-1-j]=N-2-i+j;

u_y[N-2-i+j][N-1-j]=N-j;

}

else

{

d[N-2-i+j][N-1-j]=k2;

u_x[N-2-i+j][N-1-j]=N-1-i+j; u_y[N-2-i+j][N-1-j]=N-1-j; }

}

}

for(i=N-2;i>=0;i--)

for(j=0;j<=i;j++)

{

k1=d[i-j][j+1]+hen[i-j][j];

k2=d[i-j+1][j]+shu[i-j][j];

if(k1<=k2)

{

d[i-j][j]=k1;

u_x[i-j][j]=i-j;

u_y[i-j][j]=j+1;

}

else

{

d[i-j][j]=k2;

u_x[i-j][j]=i-j+1;

u_y[i-j][j]=j;

}

}

printf("最短路径为:\n ");

for(i=1;i<=2*N-5;i++)

{

printf("(%d,%d)\n",x,y);

x=u_x[x][y];

y=u_y[x][y];

}

printf("最短路径长度为:%d\n",d[0][0]);

return 0;

}

相关文档
最新文档