shortest_path(i,j)=shortest_path(i,k)+shortest_path(k,j);
end
end
end
end
iflength(find(shortest_path==inf))~=0
disp('网络不连通...需要划分连通子图...这里没有考虑这种情况');
return;
end
%~~~~~~~~~~~~~~~~~~~~~~~~~求每个信标节点的校正值~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
anchor_to_anchor=shortest_path(1:
all_nodes.anchors_n,1:
all_nodes.anchors_n);
fori=1:
all_nodes.anchors_n
hopsize(i)=sum(sqrt(sum(transpose((repmat(all_nodes.true(i,:
),all_nodes.anchors_n,1)-all_nodes.true(1:
all_nodes.anchors_n,:
)).^2))))/sum(anchor_to_anchor(i,:
));
end
%~~~~~~~~~~~~~~~~~~~~~~~每个未知节点开始计算自己的位置~~~~~~~~~~~~~~~~~~~~
fori=all_nodes.anchors_n+1:
all_nodes.nodes_n
obtained_hopsize=hopsize(find(shortest_path(i,1:
all_nodes.anchors_n)==min(shortest_path(i,1:
all_nodes.anchors_n))));%未知节点从最近的信标获得校正值,可能到几个锚节点的跳数相同的情况
unknown_to_anchors_dist=transpose(obtained_hopsize
(1)*shortest_path(i,1:
all_nodes.anchors_n));%计算到锚节点的距离=跳数*校正值
%~~~~~~~~~~最小二乘法~~~~~~~~~~~~~~~`
A=2*(all_nodes.estimated(1:
all_nodes.anchors_n-1,:
)-repmat(all_nodes.estimated(all_nodes.anchors_n,:
),all_nodes.anchors_n-1,1));
anchors_location_square=transpose(sum(transpose(all_nodes.estimated(1:
all_nodes.anchors_n,:
).^2)));
dist_square=unknown_to_anchors_dist.^2;
b=anchors_location_square(1:
all_nodes.anchors_n-1)-anchors_location_square(all_nodes.anchors_n)-dist_square(1:
all_nodes.anchors_n-1)+dist_square(all_nodes.anchors_n);
all_nodes.estimated(i,:
)=transpose(A\b);
all_nodes.anc_flag(i)=2;
end
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
save'../LocalizationError/result.mat'all_nodescomm_r;
end
通信半径:
200m
锚节点的通信半径:
200m
通信模型:
RegularModel
网络的平均连通度为:
31.3667
网络的邻居锚节点平均数目为:
6.5
一共300个节点:
60个锚节点,240个未知节点,0个不能被定位的未知节点
定位误差为0.30127
这里在计算节点与锚节点距离时使用跳数相乘距离修正值,实现了对基础DV-hop算法的改进,因此增大通信距离是不能增大算法误差的
通信半径:
400m
锚节点的通信半径:
400m
通信模型:
RegularModel
网络的平均连通度为:
100.6533
网络的邻居锚节点平均数目为:
19.39
一共300个节点:
60个锚节点,240个未知节点,0个不能被定位的未知节点
定位误差为0.26588
但是此算法增大锚节点密度对误差减小基本没有意义
通信半径:
200m
锚节点的通信半径:
200m
通信模型:
RegularModel
网络的平均连通度为:
31.9
网络的邻居锚节点平均数目为:
18.7833
一共300个节点:
180个锚节点,120个未知节点,0个不能被定位的未知节点
定位误差为0.31443
增大锚节点通信距离会显著增大误差,这是因为修正值修正到平均距离,但是锚节点通信距离与该值偏离很大
通信半径:
200m
锚节点的通信半径:
400m
通信模型:
RegularModel
未知节点能侦听到的锚节点平均数目为:
20.7417
未知节点通信区域内的未知节点平均数目为:
25.4333
一共300个节点:
60个锚节点,240个未知节点,0个不能被定位的未知节点
定位误差为0.63806
不规则的通信也会严重影响这种基于跳数估计距离的定位算法
通信半径:
200m
锚节点的通信半径:
200m
通信模型:
DOIModel
DOI=0.015
网络的平均连通度为:
41.33
网络的邻居锚节点平均数目为:
7.98
一共300个节点:
60个锚节点,240个未知节点,0个不能被定位的未知节点
定位误差为1.0595
算法改进:
要设计更加合理的估计跳数距离的方法,克服通信模型不规则和通信距离带来的影响。
四、实验总结
虽然DV-Hop算法相对基于测距的定位技术精度较低,但不需要节点具备测距能力,无需额外硬件、能耗较低、受环境影响较小,算法简单,易于实现,对于各向同性的密集网络,可以得到合理的平均每跳距离,定位精度等方面能满足大多数应用的要求,在硬件尺寸和功耗上更适合大规模低能耗的WSN,是目前备受关注的定位机制,许多定位系统都采用了该算法来实现。
由于节点是随机部署的,未知节点与信标节点之间的跳段距离通常不是二者之间的直线距离。
在各向同性的密集网络中,校正值才能合理地估算平均每跳距离,这是基于多跳的定位算法普遍存在的问题,采用DV-Hop算法过大估计了跳段的距离;未知节点计算与信标节点之间的跳数,结果都是整数,这大约增加了0.5个平均跳数的误差。
通过DV-Hop算法中节点间距离度量的分析,可以发现利用这些距离没有反映出信标节点对节点位置的影响力的大小,影响了定位精度。