毕业设计复盘:无线传感器网络 DV-Hop 定位算法改进(多通信半径 + 加权优化)

146 阅读10分钟

一、项目背景:为什么要改进DV-Hop算法?

无线传感器网络(WSN)在环境监测、智能交通、矿井监控等场景中,节点位置信息是核心——比如监测森林火灾时,必须知道哪个位置的传感器检测到高温。但传统定位方法有明显短板:

  • GPS定位:室外好用,但室内/地下信号弱,且传感器节点成本高、功耗大;
  • 基于测距的算法(如RSSI、TOA):需要硬件支持测距,传感器节点能耗高,不适合大规模部署;
  • 经典DV-Hop算法:无需测距硬件,成本低,但定位误差大——比如把“通信半径内的所有节点都算1跳”,忽略了节点间实际距离差异,导致平均跳距估算不准,最终定位误差可达30%以上。

我的毕业设计目标就是解决经典DV-Hop算法的误差问题,提出“基于多通信半径修正的加权DV-Hop算法(WDVTH)”,在不增加硬件成本的前提下,把定位误差降低20%以上,满足WSN实际应用需求。

二、核心知识铺垫:先搞懂经典DV-Hop算法

在讲改进前,先简单说下经典DV-Hop算法的核心逻辑——它分3步实现未知节点定位,本质是“用跳数估算距离,再用数学方法解坐标”:

  1. 计算最小跳数:锚节点(已知位置)通过“泛洪”广播自身位置,未知节点记录到每个锚节点的“最小跳数”(比如A锚节点到未知节点B经过2个节点,跳数就是2);
  2. 估算平均跳距:锚节点之间通过已知的跳数和实际距离,计算“平均每跳距离”(公式:锚节点A到B的直线距离 ÷ 两节点间跳数);
  3. 解算未知节点坐标:未知节点用“到锚节点的跳数 × 平均跳距”估算距离,再通过三边测量法/最小二乘法,计算自身坐标。

经典算法的问题很明显:

  • 跳数误差:通信半径内的节点都算1跳,但实际距离可能差好几米(比如锚节点通信半径20m,节点A离锚节点5m、节点B离锚节点18m,都算1跳,明显不合理);
  • 平均跳距误差:只用“最近锚节点的平均跳距”,忽略了其他锚节点的影响,比如网络拓扑不均匀时,单锚节点的平均跳距无法反映全局情况;
  • 坐标解算误差:当锚节点共线时,三边测量法无法确定唯一交点,导致解算失败。

三、改进方案:多通信半径+加权平均跳距

针对经典DV-Hop的3个误差点,我做了两处核心改进,最终形成WDVTH算法:

3.1 改进1:多通信半径修正跳数——解决“跳数粗糙”问题

经典DV-Hop把锚节点通信半径(设为R)内的节点都算1跳,忽略了距离差异。我们的改进思路是“把通信半径拆分成多个同心圆,细化跳数”:

  1. 拆分通信半径:把锚节点的最大通信半径R拆成n个同心圆,每个小圆的半径是R/n、2R/n、…、R(比如n=5,R=20m,小圆半径就是4m、8m、12m、16m、20m);
  2. 分阶段广播跳数:锚节点先以R/n为半径广播,接收节点记录跳数为1/n;再以2R/n为半径广播,未记录过跳数的节点记录为2/n;直到以R为半径广播结束;
  3. 保留最小跳数:如果节点多次收到同一锚节点的广播,只保留最小跳数(比如节点在8m处,先收到2/n跳的广播,后续更大半径的广播就不再更新)。

举个例子:n=5,R=20m时,离锚节点5m的节点跳数是2/5(1.6m/跳),离锚节点18m的节点跳数是5/5=1(18m/跳),跳数能反映实际距离差异,比经典算法的“一刀切1跳”精准多了。

3.2 改进2:加权平均跳距——解决“单锚节点跳距片面”问题

经典DV-Hop只用“最近锚节点的平均跳距”,我们的改进思路是“让近锚节点权重更高,远锚节点权重更低”,综合所有锚节点的平均跳距:

  1. 计算加权系数:未知节点到锚节点的跳数越少(距离越近),权重越大。加权系数公式:
    δp,i=1/hp,ip=1m1/hp,i\delta_{p,i} = \frac{1/h_{p,i}}{\sum_{p=1}^m 1/h_{p,i}}
    其中,hp,ih_{p,i}是未知节点i到锚节点p的跳数,m是锚节点总数。比如未知节点到A锚节点跳数1,到B锚节点跳数3,A的权重就是(1/1)/(1/1+1/3)=0.75,B的权重是0.25;
  2. 计算加权平均跳距:用每个锚节点的平均跳距乘以对应权重,求和得到未知节点的“加权平均跳距”;
  3. 估算距离:未知节点到锚节点的距离 = 跳数 × 加权平均跳距,比经典算法的“单跳距估算”更全面。

3.3 改进后算法流程(WDVTH)

把两处改进整合,WDVTH算法分6步实现定位,比经典算法多了“跳数修正”和“加权跳距”两步:

  1. 初始化网络:确定锚节点(设为M个)、未知节点(N个),锚节点通信半径R;
  2. 多通信半径修正跳数:按3.1的方法,让未知节点得到到每个锚节点的“细化跳数”;
  3. 锚节点计算平均跳距:用经典算法的方法,锚节点间计算各自的平均跳距;
  4. 未知节点计算加权平均跳距:按3.2的方法,结合细化跳数计算加权系数和加权平均跳距;
  5. 估算未知节点到锚节点的距离:跳数 × 加权平均跳距;
  6. 解算坐标:当未知节点收到3个以上锚节点信息时,用最小二乘法计算自身坐标。

四、实验验证:Matlab仿真下的性能对比

为了验证改进效果,我用Matlab搭建了WSN仿真环境,对比经典DV-Hop、两种单一改进算法(仅多通信半径WDV、仅跳数加权HPDV)和我们的WDVTH算法。

4.1 仿真环境设置

  • 区域:100m×100m正方形区域,节点随机分布;
  • 节点总数:100个(锚节点10个,未知节点90个);
  • 通信半径R:20m;
  • 评价指标:归一化定位误差(公式:误差=(x真实x估算)2+(y真实y估算)2R\text{误差} = \frac{\sqrt{(x_{真实}-x_{估算})^2 + (y_{真实}-y_{估算})^2}}{R}),误差越小越好;
  • 实验次数:50次取平均值,避免随机分布导致的误差。

4.2 核心实验结果

我们从“锚节点密度”“通信半径”“节点总数”三个关键因素,对比四种算法的定位误差,核心结果如下:

1. 锚节点密度对误差的影响

  • 条件:节点总数100,通信半径20m,锚节点密度从5%(5个)到40%(40个);
  • 结果:
    • 所有算法误差随锚节点密度增加而下降,但WDVTH下降最明显;
    • 当锚节点密度10%时,经典DV-Hop误差32.7%,WDVTH误差28.9%,降低11.6%;
    • 当锚节点密度40%时,经典DV-Hop误差19.8%,WDVTH误差17.0%,降低14.1%。

2. 通信半径对误差的影响

  • 条件:节点总数100,锚节点密度10%,通信半径从15m到50m;
  • 结果:
    • 通信半径15m时,经典DV-Hop误差54.9%,WDVTH误差43.0%,降低21.7%(改进效果最明显,因为小半径下经典算法跳数误差更突出);
    • 通信半径超过35m后,所有算法误差下降放缓,WDVTH仍保持最低误差(26.5% vs 经典38.1%)。

3. 节点总数对误差的影响

  • 条件:锚节点密度10%,通信半径20m,节点总数从100到240;
  • 结果:
    • 节点总数100时,WDVTH误差26.4% vs 经典35.8%,降低26.3%;
    • 节点总数240时,WDVTH误差18.6% vs 经典23.9%,降低22.2%;
    • 关键结论:节点越密集,网络连通性越好,但WDVTH始终比其他算法误差低5%-10%,稳定性更强。 在这里插入图片描述

4.3 算法复杂度分析

改进后算法会不会更复杂、更耗能耗?我们做了复杂度计算:

  • 经典DV-Hop复杂度:O(n3)+O(n)+O(mn)O(n^3) + O(n) + O(mn)(n是总节点数,m是锚节点数);
  • WDVTH算法复杂度:O(n3)+O(n)+2O(mn)+O(m(nm))O(n^3) + O(n) + 2O(mn) + O(m(n-m))
  • 结论:当n足够大时,两者复杂度都是O(n3)O(n^3),改进部分增加的复杂度可忽略,且不增加节点硬件能耗,符合WSN“低功耗”需求。

五、毕业设计复盘:踩过的坑与经验

5.1 那些踩过的坑

  1. 多通信半径的“n值”选多大?

    • 问题:一开始把n设为10(拆10个同心圆),结果锚节点广播次数太多,网络通信量激增,仿真时出现“数据拥堵”;
    • 解决:通过对比n=3、5、7、10的误差和通信量,发现n=5时最优——误差降低足够多(比n=3低8%),且通信量仅增加20%,平衡了精度和能耗。
  2. 加权系数公式推导错误

    • 问题:一开始用“跳数越大权重越大”,结果平均跳距估算更不准,误差反而上升;
    • 解决:重新推导逻辑——锚节点离未知节点越近(跳数越小),其平均跳距越能反映未知节点周围的网络拓扑,所以权重应与跳数成反比,修正后误差立刻下降15%。
  3. Matlab仿真“节点碰撞”问题

    • 问题:随机生成节点时,偶尔出现“两个节点坐标重叠”,导致跳数计算错误,仿真结果波动大;
    • 解决:在节点生成代码中加入“距离判断”——新生成节点与已有节点的距离必须大于0.5m,否则重新生成,仿真结果标准差从5%降到2%。

5.2 给学弟学妹的建议

  1. 先吃透经典算法,再谈改进
    一开始我没搞懂DV-Hop的“平均跳距计算逻辑”,就盲目加改进,结果仿真报错。后来花1周时间手动计算经典算法的定位过程,才找到误差根源——这一步不能省。

  2. 仿真参数要“贴近实际”
    比如WSN节点通信半径通常是15-30m,锚节点密度5%-20%,别选极端参数(如通信半径50m、锚节点50%),否则实验结果没有实际意义。

  3. 多做对比实验,突出改进价值
    不仅要对比自己的改进算法和经典算法,还要对比“单一改进算法”(如仅多通信半径),才能证明“组合改进”的优势,论文说服力更强。

六、项目资源获取

完整项目包含:

  • 算法代码:Matlab仿真代码(经典DV-Hop、WDV、HPDV、WDVTH四种算法,注释清晰,可直接运行);
  • 仿真数据:50次实验的原始数据(锚节点密度、通信半径、节点总数对应的误差表);
  • 论文附录:算法公式推导过程、仿真截图、复杂度计算细节;
  • 答辩PPT:含算法原理、实验对比、改进价值,可直接修改使用。