通信网基础课程设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(5)标记点i。如果所有点已标记,则算法完全推出,否则记k=i,转到2)再继续。
2.3Dijkstra算法的实现
从上面可以看出,在按标记法实现Dijkstra算法的过程中,核心步骤就是从未标记的点中选择一个权值最小的弧段。这是一个循环比较的过程,如果不采用任何技巧,未标记点将以无序的形式存放在一个链表或数组中。那么要选择一个权值最小的弧段就必须把所有的点都扫描一遍,在大数据量的情况下,这无疑是一个制约计算速度的瓶颈。
Dijkstra算法的基本思路是:假设每个点都有一对标号(dj, pj),其中dj是从起源点s到点j的最短路径的长度(从顶点到其本身的最短路径是零路(没有弧的路),其长度等于零);pj则是从s到j的最短路径中j点的前一点。求解从起源点s到点j的最短路径算法的基本过程如下:
(1)初始化。起源点设置为:ds=0, ps为空;所有其他点: di=∞, pi=?;标记起源点s,记k=s,其他所有点设为未标记的。
(1)访问路网中里起始点最近且没有被检查过的点,把这个点放入OPEN组中等待检查。
(2)从OPEN表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到CLOSE表中。
(3)遍历考察这个点的子节点。求出这些子节点距起始点的距离值,放子节点到OPEN表中。
(4)重复2,3,步。直到OPEN表为空,或找到目标点。
通过本次通过这次课程设计,我们要对上课所学得知识进行巩固,掌握图、子图、结点的度数、有向图、无向图、多重图、完全图、补图、生成子图、图的同构、路、回路、连通图、弱连通、强连通等概念及其性质;掌握图的矩阵表示,给定图的邻接矩阵会求任一结点的入度、出度和度数;一个结点到另一个结点长度为k的路径的条数;该图的可达性矩阵。
网络在数学和计算机领域中被抽象为图,所以其基础是图的存储表示。一般而言,无向图可以用邻接矩阵和邻接多重表来表示,而有向图则可以用邻接表和十字链表示。
图1带权有向图
2.4 Dijkstra算法的基本原理
Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻发现的。算法解决的是有向图中最短路径问题。举例来说,如果图中的顶点表示城市,而边上的权重表示著城市间开车行经的距离。Dijkstra算法可以用来找到两个城市之间的最短路径。这个算法是通过为每个顶点v保留目前为止所找到的从s到v的最短路径来工作的。初始时,源点s的路径长度值被赋为0(d[s]=0),同时把所有其他顶点的路径长度设为无穷大,即表示我们不知道任何通向这些顶点的路径(对于V中所有顶点v除s外d[v]= ∞)。当算法结束时,d[v]中储存的便是从s到v的最短路径,或者如果路径不存在的话是无穷大。
对T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值比不加W的路径要短,则修改此距离值重复上述步骤,直到S中包含所有顶点,即S=V为止。
3、设计结果与分析
3.1设计内容
根据所学通信网基础得知识,使用D算法,编写一C++程序,它能根据读入得带
沈阳大学
课程设计说明书NO.6
权有向图G的数据,构造并输出图G的顶点Vi到其它每个顶点的最短路径及长度,最后输出图G的拓扑序列。图的输入形式为n i i0 j0 w0 i1 j1 w1 i2 j2 w2 ... im jm wm -1 -1 -1(-1 -1 -1为输入结束标记)。它们都是整数,n是图的顶点个数且30>n>0;i是顶点Vi的编号;ik jk wk表示两个顶点编号分别为ik、jk权为wk的一条边(顶点名字依次是V0,V1,V2,…Vn-1)。(输入时,两个相邻的整数用空格隔开)。注:例子:输入数据3 0 0 1 1 0 2 3 -1 -1 -1。表示:图G有3个顶点,一条边是V0->V1权为1,另一条边是V0->V2权为3,求V0到各个顶点的最短路径及长度。
if(edge_end(i) == EDGE_END)break;
if(node_edge[i][EDGE_SRC] == node){
if(node_state[node_edge[i][EDGE_DST]][STATE_DEPTH] == DEPTH_MAX)
{node_state[node_edge[i][EDGE_DST]][STATE_DEPTH] = node_state[node][STATE_DEPTH] + node_edge[i][EDGE_WEIGHT];
EDGE_DST,
EDGE_WEIGHT,
EDGE_MAX};
enum{
EDGE_NORMAL,EDGE_END};
沈阳大学
课程设计说明书NO.7
else{if(node_state[i][STATE_DEPTH] < min_depth)
{min_depth = node_state[i][STATE_DEPTH];
沈阳大学
课程设计说明书NO.4
Dijstra算法的基础操作是边的拓展:如果存在一条从u到v的边,那么从s到u的最短路径可以通过将边(u,v)添加到尾部来拓展一条从s到v的路径。这条路径的长度是d[u]+w(u,v)。如果这个值比目前已知的d[v]的值要小,我们可以用新值来替代当前d[v]中的值。拓展边的操作一直执行到所有的d[v]都代表从s到v最短路径的花费。这个算法经过组织因而当d[u]达到它最终的值的时候没条边(u,v)都只被拓展一次。算法维护两个顶点集S和Q。集合S保留了我们已知的所有d[v]的值已经是最短路径的值顶点,而集合Q则保留其他所有顶点。集合S初始状态为空,而后每一步都有一个顶点从Q移动到S。这个被选择的顶点是Q中拥有最小的d[u]值的顶点。当一个顶点u从Q中转移到了S中,算法对每条外接边(u,v)进行拓展。
对最小生成树、最短路径、Dijkstra算法,最短路由有了更深得理解。本次课程实验,要了解最短得路由得算法,掌握Dijkstra算法,Floyd-Warshall算法等算法得概念,基本原理和思想。加深对通信网基础这门课程的理解,并且在VC++环境下进行运行,得到输出结果图,并对图进行结果与分析。课程设计要求学生独立完成。
按路径长度递增次序产生最短路径算法:把V分成两组。S:已求出最短路径的顶点的集合V-S=T:尚未确定最短路径的顶点集合将T中顶点按最短路径递增的次序加入到S中,先从源点V0到S中各顶点的最短路径长度都不大于从V0到T中任何顶点的最短路径长度。然后每个顶点对应一个距离值S中顶点:从V0到此顶点的最短路径长度T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度依据:可以证明V0到T中顶点Vk的最短路径,或是从V0到Vk的直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和初使时令S={V0},T={其余顶点},T中顶点对应的距离值ƒ若存在<V0,Vi>,为<V0,Vi>弧上的权值ƒ若不存在<V0,Vi>,为∝从T中选取一个其距离值为最小的顶点W,加入S。
{node_state[node][STATE_CHOSEN] = STATE_CHOSEN_TRUE;return 0;
}iwenku.baidu.comt update_node_depth(int node)
{int i;for(i = 0; i < MAX_EDGES; i ++)
{/*check if reach the end*/
沈阳大学
课程设计说明书NO.2
(1)Dijkstra算法
(2)A*算法
(3)SPFA算法
(4)Bellman-Ford算法
(5)Floyd-Warshall算法
(6)Johnson算法
所谓单源最短路径问题是指:已知图G=(V,E),我们希望找出从某给定的源结点S∈V到V中的每个结点的最短路径。
2.2经典Dijkstra算法的主要思想
#define DEPTH_MAX (-1)
#define PATH_INVALID (-1)enum{
STATE_DEPTH,
STATE_PATH,
STATE_CHOSEN,
STATE_MAX};enum{
STATE_CHOSEN_FALSE,
STATE_CHOSEN_TRUE
};enum{
EDGE_SRC,
图2求最短路径流程图
2.4.1 Dijkstra算法的基本过程
Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出
沈阳大学
课程设计说明书NO.5
最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等Dijkstra算法-大概过程创建两个表,OPEN, CLOSE。OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。
2、设计方案与论证
2.1最短路径算法的分类
所谓最短路径(shortest path)问题指的是:如果从图中某顶点出发(此点称为源点),经图的边到达另一顶点(称为终点)的路径不止一条,如何找到一条路径使沿此路径上各边的权值之和为最小。设一有向网络G =(V,E),已知各边的权值,并设每边的权均大于零,以某指定V0为源点,求从V0到图的其余各点的最短路径。用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:
(2)检验从所有已标记的点k到其直接连接的未标记的点j的距离,并设置lkj是从点k到j的直接连接距离。
(3)选取下一个点。从所有未标记的结点中,选取dj中最小的一个i:di=min[dj,所有未标记的点j]点i就被选为最短路径中的一点,并设为已标记的。
(4)找到点i的前一点。从已标记的点中找到直接连接到点i的点j*,作为前一点,设置:i=j*
课程设计说明书NO.1
VC++环境下D算法完成最短路径求解
1、课程设计得目的
本次课程设计我门要在VC++环境的最短路径,常用得有D算法和F算法等,这次我们要应用D算法完成课程设计。Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
min_depth_node = i;}}}/*printf("get_min_depth_node: get min node %d depth %d\n", min_depth_node, min_depth);*return min_depth_node;
}int set_node_chosen(int node)
node_state[node_edge[i][EDGE_DST]][STATE_PATH] = node;
}else if(node_state[node_edge[i][EDGE_DST]][STATE_DEPTH] > (node_state[node][STATE_DEPTH] + node_edge[i][EDGE_WEIGHT]))
3.2设计程序
/* file: dijksta.c++
* usage: dijkstra.exe < dijkstra_input.txt
* author: jim 20080106*/#include<stdio.h>#define MAX_NODES 20#include"stdio.h"
#define MAX_EDGES 200
沈阳大学
课程设计说明书NO.3
要解决这个问题,最有效的做法就是将这些要扫描的点按其所在边的权值进行顺序排列,这样每循环一次即可取到符合条件的点,可大大提高算法的执行效率。另外,GIS中的数据(如道路、管网、线路等)要进行最短路径的计算,就必须首先将其按结点和边的关系抽象为图的结构,这在GIS中称为构建网络的拓扑关系(由于这里的计算与面无关,所以拓扑关系中只记录了线与结点的关系而无线与面的关系,是不完备的拓扑关系)。如果用一个矩阵来表示这个网络,不但所需空间巨大,而且效率会很低。下面主要就如何用一个简洁高效的结构表示网的拓扑关系以及快速搜索技术的实现进行讨论。
相关文档
最新文档