【WSN定位】基于多通信半径和跳距加权优化的Dvhop定位算法【Matlab代码#15】
文章目录
-
- 1. 原始Dvhop定位算法
- 2. 多通信半径
- 3. 加权跳距
- 4. 部分代码展示
- 5. 仿真结果展示
- 6. 资源获取
1. 原始Dvhop定位算法
可参考Dvhop定位算法
2. 多通信半径
设网络通信半径为 R R R,将锚节点与邻居节点间分为 m m m级,网络中各信标节点与其邻居节点的实际距离为 d d d,跳数记为 H H H。
H = { 1 m , 0 < d ≤ R m i m , ( i − 1 ) R m < d ≤ i R m 1 , ( m − 1 ) R m < d ≤ R (1) H=\\begin{cases} & \\frac{1}{m} , 0<d\\le \\frac{R}{m} \\\\ & \\frac{i}{m} , \\frac{(i-1)R}{m} <d\\le \\frac{iR}{m} \\\\ & 1 , \\frac{(m-1)R}{m}<d\\le R \\end{cases}\\tag{1} H=⎩ ⎨ ⎧m1,0<d≤mRmi,m(i−1)R<d≤miR1,m(m−1)R<d≤R(1)
经过改进后,锚节点与邻居节点的跳数值不再是整数,是更加精确的小数,与距离更接近正比关系,有效地提高了数据的精确性,减小定位误差。
3. 加权跳距
在原始Dvhop定位算法中,设未知节点坐标为 D ( x , y ) D(x,y) D(x,y),能与该未知节点通信的锚节点为 A 1 ( x 1 , y 1 ) , A 2 ( x 2 , y 2 ) , . . . , A n ( x n , y n ) A_{1}(x_{1},y_{1}),A_{2}(x_{2},y_{2}),...,A_{n}(x_{n},y_{n}) A1(x1,y1),A2(x2,y2),...,An(xn,yn),这些锚节点的平均每跳距离为 h o p s i z e 1 , h o p s i z e 2 , . . . , h o p s i z e n hopsize_{1},hopsize_{2},...,hopsize_{n} hopsize1,hopsize2,...,hopsizen,到 D ( x , y ) D(x,y) D(x,y)的跳数为 h o p 1 , h o p 2 , . . . , h o p n hop_{1},hop_{2},...,hop_{n} hop1,hop2,...,hopn,那么 D ( x , y ) D(x,y) D(x,y)到 A 1 ( x 1 , y 1 ) A_{1}(x_{1},y_{1}) A1(x1,y1)的距离 r i r_{i} ri为:
r i = h o p i ∗ h o p s i z e (2) r_{i}=hop_{i}*hopsize\\tag{2} ri=hopi∗hopsize(2)
由于 h o p s i z e hopsize hopsize是取离未知节点最近的锚节点的平均跳距作为未知节点到所有锚节点的平均跳距,但是实际网络中节点在不同区域的分布状况是不同的,平均每跳距离也是不同的,原始Dvhop算法用单一的平均跳距不能正确反应网络状况,误差较大。
本文用下面式子来修正未知节点平均跳距:
w i = 1 h o p i ∑ j = 1 n 1 h o p j (3) w_{i}=\\frac{\\frac{1}{hop_{i}} }{\\sum_{j=1}^{n}\\frac{1}{hop_{j}} }\\tag{3} wi=∑j=1nhopj1hopi1(3)
h o p s i z e i = w i ∗ h o p s i z e i (4) hopsize_{i}= w_{i}*hopsize_{i}\\tag{4} hopsizei=wi∗hopsizei(4)
通过上面两个式子的处理,每个能与未知节点通信的信标节点的平均跳距都参与计算未知节点平均跳距,每个信标节点平均跳距都根据与未知节点的距离远近进行了加权处理,使得每个未知节点根据平均跳距计算自身坐标时更接近网络的真实情况。
4. 部分代码展示
%~~~~~~~~~~~~~~~~~~~~~~~~~求每个信标节点的平均每跳距离~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~h1=h(1:BeaconAmount,1:BeaconAmount); D1=Dall(1:BeaconAmount,1:BeaconAmount);for i=1:BeaconAmountdhop(i,1)=sum(D1(i,:))/sum(h1(i,:));%每个信标节点的平均每跳距离end
%~~~~~~~~~~~~~~~~~~~~~~~~~~~用跳数估计距离~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~hop1=h(1:BeaconAmount,(BeaconAmount+1):NodeAmount);%未知节点到信标跳数,BeaconAmount行UNAmount列%计算权值矩阵for i=1:UNAmountw(:,i)=1./hop1(:,i)/sum(1./hop1(:,i)); %权值矩阵 end
%根据权值计算未知节点的平均每跳距离for i=1:UNAmounthopsize(1,i)=sum(w(:,i).*dhop(:,1));end
%估计距离for i=1:UNAmounthop=hopsize(1,i);%hop为从最近信标获得的校正值Distance(:,i)=hop*hop1(:,i);%%Beacon行UN列;endd=Distance;
5. 仿真结果展示
6. 资源获取
A资源获取说明