云南大学 软件学院 计网实验8
- 格式:doc
- 大小:44.00 KB
- 文档页数:5
云南大学软件学院
实 验 报 告
课程: 计算机网络原理实验 任课教师:
姓名: 学号: 专业: 成绩:
实验八、Link States Algorithm的实现
1.实验目的:
通过编程模拟实现LSA.
2.实验环境:
软件开发平台,可以使用任何编程语言。
3.实验要求
(1)求网络中任何两个结点之间的最短路径(网络中至少有4个节点)。
(2)得到任何一个节点上的转发表。
4.实验内容、拓扑结构
通过链路状态算法计算A点到其它各点的cost,最终输出A的路由表。
# include
# include
# define maxlen 10
# define large 999 //(该处设置路径最大值,表示不存在该路线)
typedef struct
{
int vexnum;
char vexs[maxlen];
int arcs[maxlen][maxlen];
}graph;
void init_graph(graph *g)//初始化图
{
int i = 0,j = 0;
g -> vexnum = 5; //根据题目此处将图的节点数初始化为5个
for(i = 0; i < 5; i++) //经过两层循环将条路径初始化为无穷大
for(j = 0; j < 5; j++)
g -> arcs[i][j] = 999;
g -> arcs[0][1] = 7; g -> arcs[1][0] = 7; //将相邻两个节点的路径初始化为其权值 7 1
8
1 2 2 g -> arcs[0][4] = 1; g -> arcs[4][0] = 1;
g -> arcs[1][2] = 1; g -> arcs[2][1] = 1;
g -> arcs[2][3] = 2; g -> arcs[3][2] = 2;
g -> arcs[1][4] = 8; g -> arcs[4][1] = 8;
g -> arcs[3][4] = 2; g -> arcs[4][3] = 2;
g -> vexs[0] = 'A'; //将节点值初始化
g -> vexs[1] = 'B';
g -> vexs[2] = 'C';
g -> vexs[3] = 'D';
g -> vexs[4] = 'E';
}
void shortpath_dijkstra(graph g)//寻找最短路径
{
int cost[maxlen][maxlen]; //cost[i][j]: 节点i到节点j的成本
int dist[maxlen]; //dist[i]: 源节点到i节点的距离或者是成本
int path[maxlen]; //已经经过了的节点
int s[maxlen]; //如果 s[i] = 1,那么i节点已经纳入最短路径集合
int i,j,v0,min,u;
char e;
printf("Input the source point(AorBorCorDorE):");//用户输入源节点
scanf("%c",&e);
switch(e)
{
case 'A':
v0=0;
break;
case 'B':
v0=1;
break;
case 'C':
v0=2;
break;
case 'D':
v0=3;
break;
case 'E':
v0=4;
break;
}
for(i = 0; i < g.vexnum; i++)
{
for(j = 0; j < g.vexnum; j++)
cost[i][j] = g.arcs[i][j];
} for(i = 0; i < g.vexnum; i++)
{
dist[i] = cost[v0][i]; //初始化源节点到各个节点的成本,如果与源节点相邻则成本为权值,否则为无穷大
if(dist[i] < large && dist[i] > 0)
path[i] = v0;
s[i] = 0;
}
s[v0] = 1;
for(i = 0; i < g.vexnum; i++)
{
min = large;
u = v0;
for(j = 0; j < g.vexnum; j++)
if(s[j] == 0 && dist[j] < min)
{
min = dist[j];
u = j;
}
s[u] = 1;
for(j = 0; j < g.vexnum; j++)
if(s[j] == 0 && dist[u] + cost[u][j] < dist[j])
{
dist[j] = dist[u] + cost[u][j];
path[j] = u;
}
}
printf("Output%c\n\n",e);
for(i = 0; i < g.vexnum; i++)
if(s[i] == 1)
{
u = i;
while(u != v0)
{
printf(" %c <- ",g.vexs[u]);
u = path[u];
}
printf(" %c ",g.vexs[u]);
printf(" :%d \n",dist[i]);
}
else printf(" %c <- %c: no path \n",g.vexs[i],g.vexs[v0]);
}
int main()
{ graph g;
init_graph(&g);
shortpath_dijkstra(g);
system("pause");
return 0;
}
从A点开始,寻找到其余各点的最短路径截图如下:
4.实验分析,回答下列问题
(1)给出LSA算法的主要思想。
1、路由器初始化(所有节点的)状态记录集参数,将它们的长度设为“无穷大”,标号设为“暂时”。
2、路由器更新与源T节点直接相连的所有暂时性节点的状态记录集。
3、路由器在所有的暂时性节点中选择距离V1的权值最低的节点。这个节点将是新的T节点。
4、如果这个节点不是V2(目的节点),路由器则返回到步骤5。
5、如果节点是V2,路由器则向前回溯,将它的前序节点从状态记录集中提取出来,如此循环,直到提取到V1为止。这个节点列表便是从V1到V2的最佳路由。
(2)通过图表算出任何两个节点之间的最短路径,并给出每个节点上的转发表。
AB: A->E->D->C->B 最小成本为:6 AC: A->E->D->C 最小成本为:5
AD: A->E->D 最小成本为:3 AE: A->E 最小成本为:1
BD:B->C->D最小成本为:3 BC:B->C最小成本为1
BE:B->C->D->E最小成本为:5 CD:C->D 最小成本为:2
CE:C->D->E最小成本为:4 DE:D->E 最小成本为:2
(如果是源节点与目的节点反过来则路反过来即可)
各个节点的转发表:
A:
B:
C:
D: 目的地 链路
B (A,E)
C (A,E)
D (A,E)
E (A,E) 目的地 链路
A (B,C)
C (B,C)
D (B,C)
E (B,D)
目的地 链路
A (C,D)
B (C,B)
D (C,D)
E (C,D) 目的地 链路
A (D,E)
B (D,C)
C (D,C)
E (D,E) 目的地 链路
A (E,E)
B (E,D)
C (E,D) E: D (E,D)