动态规划 报告

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

算法与分析课程设计报告

题目:最短路径

专业:网络工程

班级:1020552

学号:08

姓名:牛慧敏

太原工业学院计算机工程系2012年11 月15 日

一、算法问题描述

给定一个m*n的矩形网络,设其左上角为起点S。一辆汽车从起点S出发驶向右下角终点T。网格边上的数字表示距离。在若干个网格点处设置了障碍,表示该网格点不可到达。试设计一个算法,求出汽车从起点S出发到达终点T的一条行驶路程最短的路线。

二、算法问题形式化表示

在给定的m x n矩形网格中,得出任意可行的两点之间的距离,再从其中抽取最短路径。但,必须从顶点开始,终点结束。

三、期望输入与输出

顺序得出任意可行的两点之间的距离

四、算法分析与步骤描述

1. 用一个集合R放置最短路径的所有网格点共m*n个。

2. 点集合中的点有其对应坐标原点(0,0)的横纵坐标x,y属性。

3. 用一个集合T记录所有边,边集合中的边有其边长和所连接的两点,

4. 对于m*n的矩行网络,有横向边(m+1)*n条,纵向边m*(n+1)条,。将所有边放入T集合,然后遍历去掉所有直接链接不可达点的边。剩下的就是一张可达的网格图,对于起点S和终点T,从S开始,可以采用图论的Dijkstra算法更新S到每个点的距离d。(用距离记录集合M记录S到每个点的距离。)

d(u)=min(d(u),d(v k+1)+w(v k+1->u)). (u与v k+1相邻)

也可以直接将不可达点的连接边长设置为无穷大,然后代入Dijkstra算法

五、问题实例及算法运算步骤

循环将各行加入,即计算将k作为最大通过节点之后的最短路径,如果这个节点连通了其他节点,则察看是否将影响到当前的最短路径,如果加入当前节点和加入的节点之间是相通的,

则执行。以下为源代码:

public static String[][] getShortestPath(int data[][]) { int length = data.length;

String pathShow[][] = new String[length][length];

for (int i = 0; i < data.length; i++)

for (int j = 0; j < data[i].length; j++) {

if (data[i][j] > 0)

pathShow[i][j] = (i + 1) + "-->" + (j + 1);

else

pathShow[i][j] = "不通";

}

int k = 0;

while (k < length) {

for (int i = 0; i < length; i++) {

if (data[k][i] > 0) {

for (int m = 0; m < length; m++) {

int temp[] = data[m];

if (temp[k] > 0) {

if (temp[i] < 0) {

if (i != m) {

temp[i] = temp[k] + data[k][i];

pathShow[m][i] = (m + 1) + "-->" + (k + 1)

+ "-->" + (i + 1);

}

} else {

temp[i] = Math.min(temp[k] + data[k][i],

temp[i]);

pathShow[m][i] = pathShow[m][k] + "-->"

+ (i + 1);

}

}

data[m] = temp;

}

}

}

k++;

}

return pathShow;

}

六、算法运行截图

七、算法复杂度分析

若用T(n)表示最短路径所需要的时间复杂度,则整个算法的时间复杂度可表示为:

T(n)=O(2n²)=O(n²)。

算法的空间复杂度为:O(n²)。

相关文档
最新文档