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