- 10
- 0
- 约9.83千字
- 约 10页
- 2021-04-04 发布于四川
- 举报
一、实验名称:单源最短路径问题
时间: X 年 X 月 X 日,星期 3,第三、四节
地点: 0#601
二、实验目的及要求
1、掌握分支限界法解题步骤:
1 在问题的边带权的解空间树中进行广度优先搜索 2 找一个叶结点使其对应路径的权最小
(最大 )
3 当搜索到达一个扩展结点时 ,一次性扩展它的所有儿子
4 将满足约束条件且最小耗费函数 目标函数限界的儿子 ,插入活结点 表中
5 从活结点表中取下一结点同样扩展直到找到所需的解或活动结点表
为空为止
三、实验环境
Window 下的 vs2010
四、实验内容
单源最短路径问题
以一个例子来说明单源最短路径问题:在下图所给的有向图 G 中,每一边都有一个非负边
权。
求图 G 的从源顶点 s 到目标顶点 t 之间的最短路径
五、算法描述及实验步骤
算法思想:
解单源最短路径问题的优先队列式分支限界法用一极小堆来存储活结点表。 其优先级是结点
所对应的当前路长。
算法从图 G 的源顶点 s 和空优先队列开始。 结点 s 被扩展后,它的儿子结点被依次插入堆中。
算法每次从堆中取出具有最小当前路长的结点作为当前扩展结点, 并依次检查与当前扩展结
点相邻的所有顶点。
如果从当前扩展结点 i 到 j 有边可达,且从源出发,途经 i 再到 j 的所相应路径长度,小于
当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中。
结点扩展过程一直继续到活结点优先队列为空时为止
二.单源最短路径问题
1.问题描述
下面以一个例子来说明单源最短路径问题:在下图所给的有向图 G 中,每一边都有一个非
负边权。要求图 G 的从源顶点 s 到目标顶点 t 之间的最短路径。
下图是用优先队列式分支限界法解有向图 G 的单源最短路径问题产生的解空间树。其中,
每一个结点旁边的数字表示该结点所对应的当前路长。
2. 算法思想
解单源最短路径问题的优先队列式分支限界法用一极小堆来存储活结点表。其优先级是
结点所对应的当前路长。
算法从图 G 的源顶点 s 和空优先队列开始。结点 s 被扩展后,它的儿子结点被依次插入
堆中。 此后, 算法从堆中取出具有最小当前路长的结点作为当前扩展结点, 并依次检查与当
前扩展结点相邻的所有顶点。如果从当前扩展结点 i 到顶点 j 有边可达,且从源出发,途经
顶点 i 再到顶点 j 的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插
入到活结点优先队列中。
这个结点的扩展过程一直继续到活结点优先队列为空时为止。
3. 剪枝策略
在算法扩展结点的过程中,一旦发现一个结点的下界不小于当前
找到的最短路长,则算法剪去以该结点为根的子树。
在算法中,利用结点间的控制关系进行剪枝。从源顶点 s 出发, 2 条不同路径到达图 G
的同一顶点。 由于两条路径的路长不同, 因此可以将路长长的路径所对应的树中的结点为根
的子树剪去。
下图是用优先队列式分支限界法解有向图 G 的单源最短路径问题产生的解空间树的剪枝
情况。
三.程序设计:
#includeiostream
using namespace std;
const int size = 100;
const int inf = 5000; //两点距离上界
// 第一组测试参数
const int n = 6; // 图顶点个数加 1
int prev[n]; // 图的前驱顶点
int dist[] = {0,0,5000,5000,5000,5000}; // 最短距离
原创力文档

文档评论(0)