无线传感网络 WSN 课程作业2
- RNG算法的原理
RNG(Relative Neighborhood Graph,相对邻近图)算法是一种用于构建无线传感器网络中节点之间连接关系的算法。它基于节点之间的相对位置关系来确定它们的邻居关系,而不需要事先知道全局网络拓扑。
第一步,生成节点:首先,根据节点数量和指定的范围,在二维平面上随机生成一组节点。每个节点具有一个随机的x坐标和y坐标。
第二步,确定邻居节点:对于每对节点(i,j),计算它们之间的距离。如果两个节点之间的距离小于预设的通信范围(通信半径),则将它们标记为邻居节点。同时,在图像上以连线的方式表示它们之间的连接关系。
第三步,使用RNG算法优化节点拓扑结构:对于每对邻居节点(i,j),再遍历其他节点m。如果节点m也是节点i和节点j的邻居,并且满足下面的条件,那么我们认为节点m位于节点i和节点j的直接路径上,即节点i、m和节点j对应的三角形满足Delaunay三角剖分的要求。条件是:节点i、m和节点j之间的距离dis大于等于max(d(i, m), d(m, j)),其中d(i, m)表示节点i和节点m之间的距离,d(m, j)表示节点m和节点j之间的距离。如果节点m满足上述条件,那么我们认为节点i和节点j之间的直接连接是冗余的,即节点m可以在节点i和节点j之间直接进行通信。
最后,得到去除冗余连接后的无线传感器网络拓扑。
RNG算法通过减少冗余连接来优化无线传感器网络的能量消耗和通信效率,同时保持网络的连通性。该算法利用节点之间的相对位置信息,使得只有具有必要的直接连接,从而减少了网络中的链路数量。
- 实验环境
本文使用Anaconda3 环境管理工具,Python 3.9.12,Windows 10 22H2,Visual Studio Code 1.74.0编辑器下进行代码编写和运行。
此外,还需要依赖项numpy、matlpotlib作为矩阵运算和绘图的工具。
- 算法实现流程
RNG算法实现流程 |
|
- 参数设置及参数使用方法
参数设置及参数使用方法 |
在代码中,首先生成了n个随机节点,并绘制了初始拓扑图。然后,根据节点之间的距离确定邻居节点,并在图中表示它们之间的连接关系。这部分代码中使用了dis变量来计算节点之间的距离,并根据设定的阈值(30.0)来确定邻居关系。 接下来,使用RNG算法进行处理,遍历邻接矩阵A,判断节点之间的直接连接是否冗余,如果冗余则将相应的连接关系移除。这部分代码中使用了三重循环来遍历节点和判断条件。 最后,绘制经过RNG算法处理后的拓扑图,并统计链路数量和路径数量。链路数量通过link_count统计,路径数量通过path_count统计。 |
- 算法实现效果
图4.1展示了运行RNG算法前后的网络拓扑图的变化,可见RNG算法该算法利用节点之间的相对位置信息,使得只有具有必要的直接连接,从而减少了网络中的链路数量,有效减少冗余连接,同时保持网络的连通性。
图4.1 运行RNG算法前后的网络拓扑图对比
图4.2展示了运行RNG算法前后的网络链路数量统计对比,可见在保证连通性的基础上,冗余链路数得到减少。
图4.2 运行RNG算法前后的网络链路数量统计对比
- 源代码及注释
源代码及注释 |
import numpy as np import matplotlib.pyplot as plt n = 100 # 节点数量 range_X = 150 # x的范围 range_Y = 150 # y的范围 # 生成节点 S = [{'xd': np.random.rand(1) * range_X, 'yd': np.random.rand(1) * range_Y} for _ in range(n)] # 显示图像1 plt.figure(1) # 绘制节点 for i in range(n): plt.plot(S[i]['xd'], S[i]['yd'], '.') # 确定邻居节点 A = np.zeros((n, n)) link_count = 0 # 链路数量计数器 for i in range(n): for j in range(i, n): dis = np.sqrt((S[i]['xd'] - S[j]['xd'])**2 + (S[i]['yd'] - S[j]['yd'])**2) if dis < 30.0: if i != j: plt.plot([S[i]['xd'], S[j]['xd']], [S[i]['yd'], S[j]['yd']], '-') A[i, j] = 1 A[j, i] = 1 link_count += 1 # 显示图像1 plt.title("初始化网络拓扑图",fontname ="SimHei") plt.show() # RNG算法 plt.figure(2) # 绘制节点 for i in range(n): plt.plot(S[i]['xd'], S[i]['yd'], '.') # RNG核心算法 for i in range(n): for j in range(i, n): if A[i, j] == 1: for m in range(n): if A[i, m] == 1 and A[m, j] == 1: dis = np.sqrt((S[i]['xd'] - S[j]['xd'])**2 + (S[i]['yd'] - S[j]['yd'])**2) if dis >= max(np.sqrt((S[i]['xd'] - S[m]['xd'])**2 + (S[i]['yd'] - S[m]['yd'])**2), np.sqrt((S[m]['xd'] - S[j]['xd'])**2 + (S[m]['yd'] - S[j]['yd'])**2)): A[i, j] = 0 # 显示处理后的图像2 path_count = 0 # 链路数量计数器 link_count_rng = np.sum(A) // 2 # RNG图中的链路数量 for i in range(n): for j in range(i, n): if A[i, j] == 1: plt.plot([S[i]['xd'], S[j]['xd']], [S[i]['yd'], S[j]['yd']], '-') path_count+=1 # 打印链路数量和路径数量 print("初始化拓扑网络中的链路数量:", link_count) print("执行RNG算法后的链路数量:", path_count) plt.title('执行RNG算法后的拓扑图',fontname ="SimHei") plt.show() |