資源簡介
用matlab仿針的無限傳感器定位算法中的dv-hop

代碼片段和文件信息
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~??DV-Hop算法??~~~~~~~~~~~~~~~~~~~~~~~~
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%?BorderLength-----正方形區域的邊長,單位:m
%?NodeAmount-------網絡節點的個數
%?BeaconAmount---信標節點數
%?Sxy--------------用于存儲節點的序號,橫坐標,縱坐標的矩陣
%Beacon----------信標節點坐標矩陣;BeaconAmount*BeaconAmount
%UN-------------未知節點坐標矩陣;2*UNAmount
%?Distance------未知節點到信標節點距離矩陣;2*BeaconAmount
%h---------------節點間初始跳數矩陣
%X---------------節點估計坐標初始矩陣X=[xy]‘
%?R------------------節點的通信距離,一般為10-100m
clearclose?all;
BorderLength=100;
NodeAmount=250;
BeaconAmount=25;
UNAmount=NodeAmount-BeaconAmount;
R=60;
Dall=zeros(NodeAmountNodeAmount);%未知節電到信標節點距離初始矩陣;BeaconAmount行NodeAmount列
h=zeros(NodeAmountNodeAmount);%初始跳數為0;BeaconAmount行NodeAmount列
X=zeros(2UNAmount);%節點估計坐標初始矩陣
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~在正方形區域內產生均勻分布的隨機拓撲~~~~~~~~~~~~~~~~~~~~
C=BorderLength.*rand(2NodeAmount);
%帶邏輯號的節點坐標
Sxy=[[1:NodeAmount];C];
Beacon=[Sxy(21:BeaconAmount);Sxy(31:BeaconAmount)];%信標節點坐標
UN=[Sxy(2(BeaconAmount+1):NodeAmount);Sxy(3(BeaconAmount+1):NodeAmount)];%未知節點坐標
%畫出節點分布圖
plot(Sxy(21:BeaconAmount)Sxy(31:BeaconAmount)‘r*‘Sxy(2(BeaconAmount+1):NodeAmount)Sxy(3(BeaconAmount+1):NodeAmount)‘k.‘)
xlim([0BorderLength]);
ylim([0BorderLength]);
title(‘*?紅色信標節點?.?黑色未知節點‘)
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~初始化節點間距離、跳數矩陣~~~~~~~~~~~~~~~~~~~~~~
for?i=1:NodeAmount
????for?j=1:NodeAmount
????????Dall(ij)=((Sxy(2i)-Sxy(2j))^2+(Sxy(3i)-Sxy(3j))^2)^0.5;%所有節點間相互距離
????????if?(Dall(ij)<=R)&(Dall(ij)>0)
????????????h(ij)=1;%初始跳數矩陣
????????elseif?i==j
????????????h(ij)=0;
????????else?h(ij)=inf;
????????end
????end
end
%~~~~~~~~~~~~~~~~~~~~~~~~~最短路經算法計算節點間跳數~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for?k=1:NodeAmount
????for?i=1:NodeAmount
????????for?j=1:NodeAmount
????????????if?h(ik)+h(kj) ????????????????h(ij)=h(ik)+h(kj);
????????????end
????????end
????end
end
h
%~~~~~~~~~~~~~~~~~~~~~~~~~求每個信標節點的校正值~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
h1=h(1:BeaconAmount1:BeaconAmount);?
D1=Dall(1:BeaconAmount1:BeaconAmount);
for?i=1:BeaconAmount
????dhop(i1)=sum(D1(i:))/sum(h1(i:));%每個信標節點的平均每跳距離
end
D2=Dall(1:BeaconAmount(BeaconAmount+1):NodeAmount);%BeaconAmount行UNAmount列
for?i=1:BeaconAmount
????for?j=1:UNAmount
????????if?min(D2(:j))==D2(ij)
????????????Dhop(1j)=D2(ij);%未知節點從最近的信標獲得校正值
????????end
????end
end
Dhop
%~~~~~~~~~~~~~~~~~~~~~~~~~~~用跳數估計距離~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hop1=h(1:BeaconAmount(BeaconAmount+1):NodeAmount)%未知節點到信標跳數,BeaconAmount行UNAmount列
for?i=1:UNAmount
????hop=Dhop(1i);%hop為從最近信標獲得的校正值
????Distance(:i)=hop*hop1(:i);%%Beacon行UN列;
end
%?%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~最小二乘法求未知點坐標~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
d=Distance;
for?i=1:2
????for?j=1:(BeaconAmount-1)
??????a(ij)=Beacon(ij)-Beacon(iBeaconAmount);
????end
end
A=-2*(a‘);
%?d=d1‘;
?for?m=1:UNAmount?
?????for?i=1:(BeaconAmount-1)
?????????B(
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????3742??2009-05-07?20:53??Unti
-----------?---------??----------?-----??----
?????????????????3742????????????????????1
評論
共有 條評論