经典DV-Hop算法(MATLAB)


        最近忙着毕设,看到了一些有关无线传感器的定位算法,就先学了经典的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&amp;DbName=CJFQ2022

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

  • 8
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Terefaleger

未成年人不许打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值