概述
最近忙着毕设,看到了一些有关无线传感器的定位算法,就先学了经典的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:NetworkNode
for j=1:NetworkNode
if i==j
Hops(i,j)=0;
else
Dis(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;
else
Hops(i,j)=inf;
end
end
end
end
%最短路径搜索 在三个点中取最短路径 计算跳段
for i=1:NetworkNode
for j=1:NetworkNode
for k=1:NetworkNode
if Hops(i,k)+Hops(k,j)<Hops(i,j)
Hops(i,j)=Hops(i,k)+Hops(k,j);
end
end
end
end
%计算信标节点的跳段距离
DisB=zeros(BeaconNode,BeaconNode);%信标节点实际间距
%Hopsize=zeros(BeaconNode,BeaconNode);%信标节点每跳平均距离
for i=1:BeaconNode
for j=1:BeaconNode
DisB(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:BeaconNode
BBHopsize(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:UNode
for j=1:BeaconNode
if 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:UNode
IDis(:,i)=BUHops(:,i)*CD(1,i);
end
%CD
%IDis
%BUHops
%用最小二乘法求盲节点估计坐标
%p=ones(BeaconNode,BeaconNode);
A=zeros(BeaconNode-1,2);
%BC
for i=1:BeaconNode-1
for j=1:2
A(i,j)=2*(BC(j,i)-BC(j,BeaconNode));
end
end
%A
%BC
B=zeros(BeaconNode-1,1);
for i=1:BeaconNode-1
for j=1:UNode
B(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;
end
end
EUNC=(A'*A)^(-1)*A'*B;
Error=zeros(UNode,1);
for i=1:UNode
Error(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:NetworkNode
for j=1:NetworkNode
if i==j
Hops(i,j)=0;
else
Dis(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;
else
Hops(i,j)=inf;
end
end
end
end
%最短路径搜索 在三个点中取最短路径 计算跳段
for i=1:NetworkNode
for j=1:NetworkNode
for k=1:NetworkNode
if Hops(i,k)+Hops(k,j)<Hops(i,j)
Hops(i,j)=Hops(i,k)+Hops(k,j);
end
end
end
end
%Hops
%计算信标节点的跳段距离
DisB=zeros(BeaconNode,BeaconNode);%信标节点实际间距
%Hopsize=zeros(BeaconNode,BeaconNode);%信标节点每跳平均距离
for i=1:BeaconNode
for j=1:BeaconNode
DisB(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:BeaconNode
BBHopsize(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:UNode
for j=1:BeaconNode
if 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:UNode
IDis(:,i)=BUHops(:,i)*CD(1,i);
end
% CD
% IDis
% BUHops
%用最小二乘法求盲节点估计坐标
%p=ones(BeaconNode,BeaconNode);
A=zeros(BeaconNode-1,3);
%BC
for i=1:BeaconNode-1
for j=1:3
A(i,j)=2*(BC(j,i)-BC(j,BeaconNode));
end
end
%A
%BC
B=zeros(BeaconNode-1,1);
for i=1:BeaconNode-1
for j=1:UNode
B(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;
end
end
EUNC=(A'*A)^(-1)*A'*B;
Error=zeros(UNode,1);
for i=1:UNode
Error(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&DbName=CJFQ2022
个人水平有限,欢迎各位大佬指正
最后
以上就是霸气荷花为你收集整理的毕设学习笔记(1):经典DV-Hop算法(MATLAB)的全部内容,希望文章能够帮你解决毕设学习笔记(1):经典DV-Hop算法(MATLAB)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复