最近忙着毕设,看到了一些有关无线传感器的定位算法,就先学了经典的DV-Hop算法,

传统的DV-Hop算法主要包括以下三个步骤:

1.确定最小跳数值

        开始组网过程中,信标节点给通信半径R内的所有邻居节点发送数据包,内容包括跳数值、自身ID、所处GPS定位信息等,邻居节点每转发一次数据包,节点跳数就增加1.节点接收到数据包后,比较已存储的数据包的跳数值,并存储跳数值最小的数据包。

2.计算信标节点间的平均跳距和未知节点与各个信标节点的距离

        经过第一步后,各节点得到到达相应节点的最小跳数值,在传统算法中,平均跳距值的计算公式为:

(懒得用Latex打公式了,公式为截图,源自 DV-Hop 定位算法_奔流聚海-CSDN博客_dvhop算法)

然后根据公式:

得到未知节点与各个信标节点的估计距离.

3.对未知节点进行坐标估计

        设估计点的坐标为(x,y,z),信标节点的坐标为(xi,yi,zi)(i=1,2,3```m),m为信标节点个数,根据Step2计算得到的估计距离,用极大似然估计法求解得到估计坐标,公式如下图:

即可求得所估计的节点坐标,实际代码如下:

2维平面的DV-Hop定位:

clc;close all;
BorderLength=100;%二维空间长度
NetworkNode=100;%网络中的所有节点数量
BeaconNode=5;%信标节点数量
UNode=NetworkNode-BeaconNode;%未知/盲节点数量(用于定位)
R=40;%节点间通信半径,用于确认跳数 10~100 for ZigBee 设置过小容易出现孤立节点(组)
RC=BorderLength.*rand(2,NetworkNode);%真实坐标矩阵Real Coordinate
BC=[RC(1,1:BeaconNode);RC(2,1:BeaconNode)];%信标节点坐标矩阵 Beacon Coordinate
UNC=[RC(1,BeaconNode+1:NetworkNode);RC(2,BeaconNode+1:NetworkNode)];%盲节点坐标矩阵 Unknown Coordinate
EUNC=zeros(2,UNode);%盲节点估计坐标矩阵
Hops=zeros(NetworkNode,NetworkNode);%初始化跳数矩阵
plot(RC(1,1:BeaconNode),RC(2,1:BeaconNode),'r*',RC(1,(BeaconNode+1):NetworkNode),RC(2,(BeaconNode+1):NetworkNode),'k.')
title('随机生成节点坐标图');%计算节点跳数,初始化跳数矩阵
Dis=zeros(NetworkNode,NetworkNode);%节点间距矩阵
for i=1:NetworkNodefor j=1:NetworkNodeif i==jHops(i,j)=0;elseDis(i,j)=((RC(1,i)-RC(1,j))^2+(RC(2,i)-RC(2,j))^2)^0.5;if(Dis(i,j)<=R)&&(Dis(i,j)>0)Hops(i,j)=1;elseHops(i,j)=inf;endendend
end
%最短路径搜索 在三个点中取最短路径 计算跳段
for i=1:NetworkNodefor j=1:NetworkNodefor k=1:NetworkNodeif Hops(i,k)+Hops(k,j)<Hops(i,j)Hops(i,j)=Hops(i,k)+Hops(k,j);endendend
end
%计算信标节点的跳段距离
DisB=zeros(BeaconNode,BeaconNode);%信标节点实际间距
%Hopsize=zeros(BeaconNode,BeaconNode);%信标节点每跳平均距离
for i=1:BeaconNodefor j=1:BeaconNodeDisB(i,j)=((BC(1,i)-BC(1,j))^2+(BC(2,i)-BC(2,j))^2)^0.5;end
end
%节点平均每跳距离
BBHops=Hops(1:BeaconNode,1:BeaconNode);%Beacon Beacon Hops
BBHopsize=zeros(BeaconNode,1);%Beacon Beacon Hopsize
for i=1:BeaconNodeBBHopsize(i,1)=sum(DisB(i,:))/sum(BBHops(i,:));
end
%DisB
%BBHops
%BBHopsize
%盲节点获得校正值,模拟实际物理过程,不包含在源码中
BUD=Dis(1:BeaconNode,(BeaconNode+1):NetworkNode);%Beacon to Unknown Distance
CD=zeros(1,UNode);%Correct Distance
for i=1:UNodefor j=1:BeaconNodeif BUD(j,i)==min (BUD(:,i))CD(1,i)=BBHopsize(j,1);end end
end
%BUD
%CD
%以跳段距离取代实际距离
%Hops
BUHops=Hops(1:BeaconNode,BeaconNode+1:NetworkNode);%Beacon to Unknown Hops 盲节点与信标节点跳数
IDis=zeros(BeaconNode,UNode);%Imaginary Distance 盲节点到信标节点估计距离
for i=1:UNodeIDis(:,i)=BUHops(:,i)*CD(1,i);
end
%CD
%IDis
%BUHops
%用最小二乘法求盲节点估计坐标
%p=ones(BeaconNode,BeaconNode);
A=zeros(BeaconNode-1,2);
%BCfor i=1:BeaconNode-1for j=1:2A(i,j)=2*(BC(j,i)-BC(j,BeaconNode));endend%A%BCB=zeros(BeaconNode-1,1);for i=1:BeaconNode-1for j=1:UNodeB(i,j)=BC(1,i)^2-BC(1,BeaconNode)^2+BC(2,i)^2-BC(2,BeaconNode)^2+IDis(BeaconNode,j)^2-IDis(i,j)^2;endend
EUNC=(A'*A)^(-1)*A'*B;
Error=zeros(UNode,1);
for i=1:UNodeError(i,1)=((EUNC(1,i)-UNC(1,i))^2+(EUNC(2,i)-UNC(2,i))^2)^0.5;
end
%估计坐标与实际坐标方差图
figure(2)
plot(Error(1:UNode),'bo')
title('实际坐标与估计坐标的方差');
%实际坐标图与估计坐标对比图
figure(3)
plot(RC(1,1:BeaconNode),RC(2,1:BeaconNode),'r*',RC(1,(BeaconNode+1):NetworkNode),RC(2,(BeaconNode+1):NetworkNode),'k.',EUNC(1,1:UNode),EUNC(2,1:UNode),'r.')
xlim([0,BorderLength]);
ylim([0,BorderLength]);title('实际坐标与估计坐标图');

3维平面的DV-Hop定位:

clc;close all;
BorderLength=100;%二维空间长度
NetworkNode=100;%网络中的所有节点数量
BeaconNode=5;%信标节点数量
UNode=NetworkNode-BeaconNode;%未知/盲节点数量(用于定位)
R=50;%节点间通信半径,用于确认跳数 10~100 for ZigBee 设置过小容易出现孤立节点(组)
RC=BorderLength.*rand(3,NetworkNode);%真实坐标矩阵Real Coordinate
BC=[RC(1,1:BeaconNode);RC(2,1:BeaconNode);RC(3,1:BeaconNode)];%信标节点坐标矩阵 Beacon Coordinate
UNC=[RC(1,BeaconNode+1:NetworkNode);RC(2,BeaconNode+1:NetworkNode);RC(3,BeaconNode+1:NetworkNode)];%盲节点坐标矩阵 Unknown Coordinate
EUNC=zeros(3,UNode);%盲节点估计坐标矩阵
Hops=zeros(NetworkNode,NetworkNode);%初始化跳数矩阵
%3维空间随机生成节点图
figure(1);
plot3(BC(1,1:BeaconNode),BC(2,1:BeaconNode),BC(3,1:BeaconNode),'r*',UNC(1,1:UNode),UNC(2,1:UNode),UNC(3,1:UNode),'k.');
title('随机生成节点坐标图');
xlim([0,BorderLength]);
ylim([0,BorderLength]);
zlim([0,BorderLength]);%计算节点跳数,初始化跳数矩阵
Dis=zeros(NetworkNode,NetworkNode);%节点间距矩阵
for i=1:NetworkNodefor j=1:NetworkNodeif i==jHops(i,j)=0;elseDis(i,j)=((RC(1,i)-RC(1,j))^2+(RC(2,i)-RC(2,j))^2+(RC(3,i)-RC(3,j))^2)^0.5;if(Dis(i,j)<=R)&&(Dis(i,j)>0)Hops(i,j)=1;elseHops(i,j)=inf;endendend
end
%最短路径搜索 在三个点中取最短路径 计算跳段
for i=1:NetworkNodefor j=1:NetworkNodefor k=1:NetworkNodeif Hops(i,k)+Hops(k,j)<Hops(i,j)Hops(i,j)=Hops(i,k)+Hops(k,j);endendend
end
%Hops
%计算信标节点的跳段距离
DisB=zeros(BeaconNode,BeaconNode);%信标节点实际间距
%Hopsize=zeros(BeaconNode,BeaconNode);%信标节点每跳平均距离
for i=1:BeaconNodefor j=1:BeaconNodeDisB(i,j)=((BC(1,i)-BC(1,j))^2+(BC(2,i)-BC(2,j))^2+(BC(3,i)-BC(3,j))^2)^0.5;end
end
%DisB
%节点平均每跳距离
BBHops=Hops(1:BeaconNode,1:BeaconNode);%Beacon Beacon Hops
BBHopsize=zeros(BeaconNode,1);%Beacon Beacon Hopsize
for i=1:BeaconNodeBBHopsize(i,1)=sum(DisB(i,:))/sum(BBHops(i,:));
end
%BBHopsize
%盲节点获得校正值,模拟实际物理过程,不包含在源码中
BUD=Dis(1:BeaconNode,(BeaconNode+1):NetworkNode);%Beacon to Unknown Distance
CD=zeros(1,UNode);%Correct Distance 校正距离,根据DV-Hop算法,接收到的第一个为校正值,理想化为距离最近的一个信标节点
for i=1:UNodefor j=1:BeaconNodeif BUD(j,i)==min (BUD(:,i))CD(1,i)=BBHopsize(j,1);end end
end
%BBHopsize
%BUD
%CD
%以跳段距离取代实际距离
%Hops
BUHops=Hops(1:BeaconNode,BeaconNode+1:NetworkNode);%Beacon to Unknown Hops 盲节点与信标节点跳数
IDis=zeros(BeaconNode,UNode);%Imaginary Distance 盲节点到信标节点估计距离
for i=1:UNodeIDis(:,i)=BUHops(:,i)*CD(1,i);
end
% CD
% IDis
% BUHops
%用最小二乘法求盲节点估计坐标
%p=ones(BeaconNode,BeaconNode);
A=zeros(BeaconNode-1,3);
%BCfor i=1:BeaconNode-1for j=1:3A(i,j)=2*(BC(j,i)-BC(j,BeaconNode));endend%A%BCB=zeros(BeaconNode-1,1);for i=1:BeaconNode-1for j=1:UNodeB(i,j)=BC(1,i)^2-BC(1,BeaconNode)^2+BC(2,i)^2-BC(2,BeaconNode)^2+BC(3,i)^2-BC(3,BeaconNode)^2+IDis(BeaconNode,j)^2-IDis(i,j)^2;endend
EUNC=(A'*A)^(-1)*A'*B;
Error=zeros(UNode,1);
for i=1:UNodeError(i,1)=((EUNC(1,i)-UNC(1,i))^2+(EUNC(2,i)-UNC(2,i))^2+(EUNC(3,i)-UNC(3,i))^2)^0.5;
end
%估计坐标与实际坐标方差图
figure(2)
plot(Error(1:UNode),'bo')
title('实际坐标与估计坐标的方差');
%实际坐标图与估计坐标对比图
figure(3)
plot3(RC(1,1:BeaconNode),RC(2,1:BeaconNode),RC(3,1:BeaconNode),'r*',RC(1,(BeaconNode+1):NetworkNode),RC(2,(BeaconNode+1):NetworkNode),RC(3,(BeaconNode+1):NetworkNode),'k.',EUNC(1,1:UNode),EUNC(2,1:UNode),EUNC(3,1:UNode),'r.')
xlim([0,BorderLength]);
ylim([0,BorderLength]);
zlim([0,BorderLength]);
title('实际坐标与估计坐标图');

参考链接&文献:

DV-Hop 定位算法_奔流聚海-CSDN博客_dvhop算法

Matlab之定位技术DV-HOP的实现_I AM BACK-CSDN博客_dv-hop matlab

DataType: 1
Title-题名: 改进的无约束优化3D-DV-Hop定位算法
Author-作者: 张晶;李煜;
Source-刊名: 计算机工程与科学
Year-年: 2022
PubTime-出版时间: 2022-01-14
Keyword-关键词: 跳数优化;跳距加权;无约束优化;拉格朗日乘子法
Summary-摘要: 针对传统DV-Hop三维定位算法定位误差较大,且机器学习及仿生算法计算任务繁重的缺点,提出一种改进的无约束优化3D-DV-Hop定位算法,采用二通信半径策略计算最小跳数值,提出平方代价函数对锚节点跳距值进行优化处理,并将其加权跳距值作为未知节点跳距值,最后根据约束问题的无约束求解思想,将加权误差最小化进而求解。通过与传统算法和各类改进算法在3种条件下进行仿真对比,验证了该优化算法在较低计算量的情况下定位误差显著降低。
Period-期: 01
Roll-卷: 44
PageCount-页数: 9
Page-页码: 75-83
SrcDatabase-来源库: 期刊
Organ-机构: 昆明理工大学信息工程与自动化学院;云南枭润科技服务有限公司;昆明理工大学云南省人工智能重点实验室;昆明理工大学云南省计算机技术应用重点实验室;
Link-链接: https://kns.cnki.net/kcms/detail/detail.aspx?FileName=JSJK202201009&amp;DbName=CJFQ2022

个人水平有限,欢迎各位大佬指正

毕设学习笔记(1):经典DV-Hop算法(MATLAB)相关推荐

  1. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记...

    机器学习实战(Machine Learning in Action)学习笔记----06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习 作者:米仓山下 时 ...

  2. 深度学习笔记(10) 优化算法(二)

    深度学习笔记(10) 优化算法(二) 1. Adam 优化算法 2. 学习率衰减 3. 局部最优的问题 1. Adam 优化算法 Adam代表的是 Adaptive Moment Estimation ...

  3. 深度学习笔记(9) 优化算法(一)

    深度学习笔记(9) 优化算法(一) 1. Mini-batch 梯度下降 2. 指数加权平均数 3. 动量梯度下降法 4. 均方根反向传播 1. Mini-batch 梯度下降 把训练样本放大巨大的矩 ...

  4. 【C++ Primer 学习笔记】: 容器和算法之【泛型算法】

    本系列博客主要是在学习 C++ Primer 时的一些总结和笔记. [C++ Primer 学习笔记]: 容器和算法之[泛型算法] 本文地址:http://blog.csdn.net/shanglia ...

  5. 小猫爪:i.MX RT1050学习笔记15-FlexSPI-FLASH使用3-KEIL FLASH算法中的使用

    小猫爪:i.MX RT1050学习笔记15-FlexSPI-FLASH使用3-KEIL FLASH算法中的使用 1 前言 2 FLASH算法解析 2.1 初始化Init 2.2 写操作 END 1 前 ...

  6. Spring源码学习笔记:经典设计模式之装饰者模式

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 0.装饰者模式(Decorator Pattern) 指在不改变原有对象的基础之上,将功能附加到对象上,提供了 ...

  7. Spring源码学习笔记:经典设计模式之策略模式

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 0.策略模式(Strategy pattern) 指定义了算法家族,分别封装起来,让它们之间可以互相替换,此模 ...

  8. 学习笔记——Kaggle_Digit Recognizer (Random Forest算法 Python实现)

    本文是个人学习笔记,该篇主要学习随机森林算法概念,并应用sklearn.ensemble.RandomForestClassifier算法包解决Kaggle入门级Digit Recognizer. 随 ...

  9. 【web搜索】学习笔记-层次汇合聚类HAC算法

    层次汇合聚类(Hierarchical Agglomerative Clustering,HAC) 算法如下: 相关链接: 层次聚类算法原理及实现 学习笔记: 先附上上一段链接中的代码: // HAC ...

最新文章

  1. nginx+tomcat+memcache实现负载均衡、session共享
  2. eclipse中多个工程编译到同一个目录下
  3. python爬虫xpath提取数据_python爬虫三大解析库之XPath解析库通俗易懂详讲
  4. CF590E-Birthday【AC自动机,最大独立集】
  5. 中科大 计算机网络7 分组延迟 分组丢失 吞吐量
  6. 算法学习之路|最小生成树——prime算法
  7. Duilib初级控件扩展一例: 具有鼠标滚动消息的OptionUI
  8. 确认过眼神是先用上5G的人!中国联通将在7个城市开通5G试验网
  9. 二叉链表和职工管理系统结合_职工信息管理系统单链表实现C语言源程序
  10. 推荐算法和机器学习入门
  11. 【工具】adb下载安装及基本操作
  12. matlab调和均值滤波_求matlab均值滤波、中值滤波和领域平均滤波算法
  13. 2010南非世界杯32强手绘海报
  14. Mysql DOS界面进入
  15. 用git下载github项目失败werning : Clone succeeded, but checkout failed.
  16. Android 前置摄像头预览与编码
  17. Excel.Application使用手册(API)
  18. linux系统读取plc状态,Linux系统下上位机通讯协议及PLC冗余系统组态-工业支持中心-西门子中国...
  19. 华南理工提出多模态ReID新数据集,语义自对齐网络SSAN达到SOTA性能!代码数据集均已开源!...
  20. 张士峰:经验分享之我的科研历程

热门文章

  1. 搭建Bitbucket项目管理工具详细教程
  2. python信息处理 WXQ 153
  3. Improvement of AUTO sampling statistics gathering feature in Oracle 11g
  4. VBS操作文件:File对象和Files集合
  5. 中山大学数据科学与计算机学院复试分数线,2019中山大学数据科学与计算机学院考研复试分数线...
  6. C#入门教程(一)visual studio与winform
  7. 标致雪铁龙诊断软件diagbox 安装说明视频下载链接
  8. Tableau 2022.3的Table Extension到底怎么用?
  9. Nginx服务器部署
  10. 比前途,还是嵌入式开发比软件开发更胜一筹