无线传感器网络实现含源代码
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
typedef struct{
int vexs[MAXNUM];
AdjMatrix arcs1, arcs2; //1 表示时间,2 表示能耗
int vexnum, arcnum;
}MGraph;
//图
***********************************************************
typedef struct minside{
//记录从顶点集 U 到 v-U 的代价最小的边的辅助数组
int adjvex;
float lowcost;
}Minside[MAXNUM];
***********************************************************
Dijkstra 算法:该算法能够以 Prim 算法为基础来理解,两种算 法的区别在于集合 TE 的理解不同,Prim 算法中集合 TE 作为一个整 体而存在,lowcost 更新的过程也是重新判断结点与集合 TE 距离的 过程,而在该算法中集合 TE 的作用则不同,不同之处体现在 lowcost
Prim 算法:实现过程中构建了 minside 数据类型,其功能可以 简单理解为解题过程中的表格,其有两个数据成员 adjvex 表示邻接 结点 lowcost 表示汇点与邻接结点的能耗,比较巧妙的一点是判断某 结点是否属于集合 TE 的方法,当某一结点并入集合 TE 时,将其 minside 数组中对应的 lowcost 置 0,在寻找下一个要并入集合 TE 的
typedef struct EDGE
{
int begin;
int end;
float weight;
}Edge; //边集数组的结构
2 / 18
*********************************************************** 5.3 算法设计思想Hale Waihona Puke Baidu
难点分析: (1)将坐标信息转换成图的结点信息,并且按照题目中给的时间和 能耗关系将无向图的权值计算好 (2)即问题一,解决方法是最短路径问题的 Dijkstra 算法 (3)即问题二,解决方法是 Prim 算法或者 kruskal 算法,这两种算 法本程序都实现了。
3 / 18
结点时只需要加一个判断 lowcost 是否为 0 的判断条件即可。当有新 节点并入集合 TE 时,需要将 minside 数据类型的数组变量中的 lowcost 进行更新,更新方式为将新加入结点的距离和原来距离相比 较,取小值即可。
Kruskal 算法:该算法是以边集为基础实现的,即每次寻找最低 代价的边,如果该边的两点未连通则将该边加入集合 T,否则继续寻 找,实现难点仍然在于如何判断两点的连通性。该算法的实现使用的 数据结构为 Edge 边集,其数据成员有 begin 表示该边连接的起点, end 表示该边连接的终点,weight 表示该边的权重即本题中的能耗。 该算法的实现过程如下,首先将邻接矩阵信息录入到边集中,然后对 边集按照权重进行排序,对于两个结点是否连通的判断使用了一种很 巧妙的方式,基本思想是建树,只使用了一个整形数组 parent,以 m 和 n 两个结点为例,假设这两个结点未连通,则可令 parent[m]=n, 意思是 m 的根结点为 n。那么判断两个结点是否连通的方式为,看这 两个结点的最终根结点是否相同。如果相同则连通,如果不同则不连 通,实现寻找根结点的函数为 Find 函数。解决了判断两点连通性问 题后,那么从边集中按照从小到大的顺序寻找符合条件的边,并将其 并入集合 T,依次进行即可。
源代码中共有 11 个函数,它们的功能分别是:LocateVex 函数 根据结点名找结点下标、ReadTxt 函数从文件中读取坐标信息、 CreatUDN 函数创建无向网(包括对坐标信息的处理)、print 函数输 出图的结点信息和邻接矩阵信息(辅助用于调试)、ShortestPath_DIJ 函数 Dijkstra 算法的实现、minimum 函数最小生成树算法的辅助函 数、MiniSpanTree_PRIM 函数最小生成树(prim)算法的实现、cmp 函 数(帮助实现快速排序)、Find 函数(kruskal 算法的辅助函数用于 寻 找 根 节 点 )、 print 函 数 边 集 的 输 出 函 数 ( 主 要 用 于 调 试 )、 MiniSpanTree_Kruskal 函数最小生成树(Kruskal)算法。
1 / 18
typedef float AdjMatrix[MAXNUM][MAXNUM]; //邻接矩阵
typedef int PathMatrix[MAXNUM][MAXNUM];//路径记录
typedef float ShortPathTable[MAXNUM];//最短路径
***********************************************************
5.1 题目简介 [问题描述]
在一个直角坐标(设为 100*100)平面中,随机分布 n 无线传感 器结点,汇聚点为原点(0,0),要求将每个无线传感器结点的信息 传输到汇聚点,传输可以通过多跳方式实现,设无线传感器结点最大 无线通信距离为 10,传输能耗与距离平方成正比,传输时间与距离成 正比。 问题一:建立每个结点传输到汇聚点的最短时间通道,并找出无法实 现传输的结点,将其排除。 问题二:建立整个网络传输到汇聚点的平均能耗最小网络结构。 [基本要求] 输入格式: 输入的第一行包含一个正整数 n,表示无线传感器结点数 量。结点使用 1, 2, 3, ……n 依次标号。 接下来 n 行,每行包含 三个整数 ni, xi, yi,其中 xi, yi 表示第 ni 个结点的坐标,要求 从文本文件中输入。 输出格式: 问题一:输出每个结点到汇聚点的最短时间通道,包括最短时间和经 过结点。 问题二:输出整个网络到汇聚点的平均能耗最小网络结构,包括平均 最小能耗和连接方式。 5.2 数据结构 ***********************************************************