%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ APIT演算法 ~~~~~~~~~~~~~~~~~~~~~~~~
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tic
clear all,close all;
for o=1:1
BorderLength=100;
row_n=10;
col_n=10;
NodeAmount=100;
anchors_node=30;
unknown_node=NodeAmount-anchors_node;
comm_r=20;
grid_length=1;
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
%RSSI=((Sxy(2,i)-Sxy(2,j))^2+(Sxy(3,i)-Sxy(3,j))^2)^0.5;%節點間RSSI=節點之間距離公式
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
% D=zeros(NodeAmount,NodeAmount);%未知節點到信標節點距離初始矩陣;anchors_node行NodeAmount列
h=zeros(NodeAmount,NodeAmount);%初始跳數為0;anchors_node行NodeAmount列
X=zeros(2,unknown_node);%節點估計座標初始矩陣
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~在正方形區域內產生均勻分佈的隨機拓撲~~~~~~~~~~~~~~~~~~~~
rand('seed',8)
C=BorderLength.*rand(2,NodeAmount);
%帶邏輯號的節點座標,給1到NodeAmount=100個編號
Sxy=[[1:NodeAmount];C];
anchors_node_N=[Sxy(2,1:anchors_node);Sxy(3,1:anchors_node)];%信標節點座標
unknown_node_N=[Sxy(2,(anchors_node+1):NodeAmount);Sxy(3,(anchors_node+1):NodeAmount)];%未知節點座標
%畫出節點分佈圖
plot(Sxy(2,1:anchors_node),Sxy(3,1:anchors_node),'r*',Sxy(2,(anchors_node+1):NodeAmount),Sxy(3,(anchors_node+1):NodeAmount),'o');
xlim([0,BorderLength]);
ylim([0,BorderLength]);
title('* 紅色信標節點 . 黑色未知節點')
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
% In APIT, the sensor nodes are not homogeneous
% the communication range of anchors is larger than that of unknown nodes
% comm_r: the communication range of the unknown node. it's saved in neighbor.mat
% the communication range of the anchor node is : times * comm_r, saved in neighbor.mat
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
%CN=0;
AN=0; %統計錨節點周圍的錨節點數量
for i=1:anchors_node
% CN=CN+1;
for j=1:anchors_node
neighbor(i,j)=((Sxy(2,i)-Sxy(2,j))^2+(Sxy(3,i)-Sxy(3,j))^2)^0.5;%所有節點間相互距離
if (neighbor(i,j)<=comm_r) && (neighbor(i,j)>0)
% neighbor_anchors_node=[Sxy(2,j);Sxy(3,j)];
AN=AN+1;
neighbor_anchors(:,AN)=[Sxy(1,i);Sxy(2,j);Sxy(3,j)];