APIT定位算法的核心内容分两部分:
APIT测试(使用面积法判断三角形内点):
设待定位节点为M,要对3个参考节点A,B,C组成的三角形区域△ABC进行APIT测试.对
于节点M,假设在广播消息阶段,获得了KAnchor个参考节点的ID号、坐标以及接收信号强度,KNeighbor个邻居待定位节点的ID以及接收信号强度.则在APIT测试阶段,节点M要对C3KAnchor个锚节点组成的三角形区域进行测试.假设,经过APIT测试后,节点M判定在C3KNeighbor个锚节点组成的三角形区域中,自己位于其中N个三角形区域当中.在这N个三角形区域中,有L个三角形区域确实包括节点M,则将这L个三角形区域定义为合法三角形区域;对其他N-L个三角形区域,则定义为非法三角形区域.节点M所获得的N个三角形区域集,定义为扫描算法的支持数据集.
三角形重心扫描算法,其具体步骤如下:
步骤1.假设节点M从对C3N个三角形区域中得到了K个有效的三角形区域.则依次求出这K个三角形区域的重心坐标(x1,y1),(x2,y2),…,(xk,yk).
步骤2.把这K个重心坐标3个点一组组成新的一个三角形区域集合,如果K不能整除3,则
剩下的1个或2个重心坐标直接保留,进入下一轮循环.这时,集合中三角形的个数为
K%3(%表整除).
步骤3.再次对得到的K%3个三角形区域重复以上操作,最后得到1个或者2个坐标值.
步骤4.如果是1个坐标值,则直接将该坐标值作为估计坐标;如果是2个坐标值,将这两个坐标值的平均值作为估计坐标.
clear;%清除内存变量
l=200;
w=200;%区域边长200m
R=30; %通信半径
node_num=200;%采集节点数目
anchor_num=100;%设置瞄点数目
Eo=5; %初始能量
err_rss=0.01;%位置误差
figure(1);
%随机设置节点
for i=1:node_num
Node{i}.x=l*rand(1,1);
Node{i}.y=w*rand(1,1);
plot(Node{i}.x,Node{i}.y,'ob')
%用蓝o表示
hold on
N_E(i)=Eo;%设置初始能量为E0
Node{i}.predict = 0; %能估测为1,不能为0
end
%随机设置喵节点
for i=1:anchor_num
anchor{i}.x=l*rand(1,1);
anchor{i}.y=w*rand(1,1);
plot(anchor{i}.x,anchor{i}.y,'r*');
%用蓝o表示
hold on
anchor_E(i)=Eo;%设置初始能量为E0
end
%信标节点广播自身位置和信号强度信息,广播范围为半径R
for i=1:node_num
k=0;
for j=1:anchor_num
dis(i,j)=sqrt((Node{i}.x-anchor{j}.x)^2+(Node{i}.y-anchor{j}.y)^2)*(1+err_rss*(2*rand(1,1)-1));
if dis(i,j)<=R
k=k+1;
neb_anchor_x(i,k) = anchor{j}.x;
neb_anchor_y(i,k) = anchor{j}.y;
end
end
neb_anchor_num(i)=k;
end
%记录每个节点的邻居未知节点信息
for i=1:node_num
k=0;
for j=1:node_num