无线传感网络RNG算法的python仿真实现,WSN作业2

本文介绍了RNG算法在无线传感网络(WSN)中的应用,用于构建和优化节点连接关系。通过随机生成节点并确定邻居,利用相对位置信息减少冗余连接,提高能量效率和通信效率。在Python环境下,使用numpy和matplotlib实现并展示了RNG算法的效果,包括网络拓扑变化和链路数量统计对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

无线传感网络 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算法实现流程

  1. 生成节点:随机生成n个节点,每个节点包含一个随机的x坐标和y坐标。
  2. 确定邻居节点:对于每对节点(i, j),计算它们之间的距离dis。如果dis小于communication_range且i ≠ j,则将节点i和节点j标记为邻居节点,并在图像上以连线的方式表示它们之间的连接关系。
  3. RNG核心算法:
    • 对于每对邻居节点(i, j),遍历其他节点m。
    • 如果节点m也是节点i和节点j的邻居,并且满足以下条件,则认为节点m位于节点i和节点j的直接路径上:
      • 计算节点i、m和节点j之间的距离dis,并计算节点i和节点m之间的距离d(i, m)和节点m和节点j之间的距离d(m, j)。
      • 如果dis大于等于max(d(i, m), d(m, j)),则认为节点m可以在节点i和节点j之间直接进行通信,即节点i和节点j之间的直接连接是冗余的。
      • 如果节点m满足上述条件,将节点i和节点j之间的连接关系设置为非直接连接,即移除节点i和节点j之间的连线。
  4. 显示处理后的图像:在图像上显示经过RNG算法处理后的节点连接关系,即去除冗余连接后的无线传感器网络拓扑。

  • 参数设置及参数使用方法

参数设置及参数使用方法

  • n: 节点数量,指定了生成的节点个数。
  • range_X和range_Y: x和y的范围,用于确定节点生成的二维平面范围。节点的坐标随机生成在该范围内。
  • S: 一个列表,存储了每个节点的信息。每个节点是一个字典,包含了节点的x坐标和y坐标。
  • A: 邻接矩阵,用于记录节点之间的连接关系。A[i, j]表示节点i和节点j之间是否有连接,1表示有连接,0表示无连接。
  • link_count: 链路数量计数器,用于统计初始化拓扑图中的链路数量。
  • path_count: 路径数量计数器,用于统计执行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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋时的雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值