📄 误差.txt
字号:
%% 按照场地均匀安排锚节点
%考虑测距误差为正负10%
%clear
%初始化节点及存放定位信息矩阵
a7=5;
for a8=1:a7
node_num=220+50*(a8-1);%一般节点数量
%锚节点数量大约为一般节点数量的10%,依场地情况而定
length=100;%场地长度
width=100;%场地宽度
rangemax=15;%节点间最大通信距离
[node_x,node_y]=creatnode(node_num,length,width);%返回节点的横纵坐标
%开始生成锚节点位置,25个锚节点均匀分布
%anchor_length=sqrt(length*width*10/100);
%anchor_no=1;
%for temp_width=1:(1+width/(anchor_length-7))
% for temp_length=1:(1+length/(anchor_length-7))
% anchor_x(anchor_no)=(anchor_length-7)*(temp_length-1);
% anchor_y(anchor_no)=(anchor_length-7)*(temp_width-1);
% anchor_no=anchor_no+1;
% end
%end
%anchor_num=anchor_no-1;%最后得到的锚节点数量
%开始生成锚节点位置,20个锚节点均匀分布
anchor_length=sqrt(length*width*10/100);
anchor_no=1;
for temp_width=1:(1+width/(anchor_length-7))
for temp_length=1:(1+length/anchor_length)
anchor_x(anchor_no)=anchor_length*(temp_length-1);
anchor_y(anchor_no)=(anchor_length-7)*(temp_width-1);
anchor_no=anchor_no+1;
end
end
%anchor_num=40;
%[anchor_x,anchor_y]=creatnode(anchor_num,length,width);
anchor_num=anchor_no-1;%最后得到的锚节点数量
% 生成存放定位信息的矩阵
%纵坐标为到第一个锚节点的跳数,到第一个锚节点的距离和,到第二个锚节点的跳数……
%横坐标为所需定位节点的序号,这个序号与最初生成的node序号是一致的
locateinf=ones(2*anchor_num,node_num)*inf;
ok='程序初始化'
%% 察看初始节点状况
%plot(anchor_x,anchor_y,'*',node_x,node_y,'o');
%% 程序开始
%对图进行广度先遍历
abcanchor=0;
abcnode=0;
for anchor_no=1:anchor_num
%初始化队列
abcanchor=abcanchor+1
queue=zeros(1,node_num);
front=1;
rear=1;
%
for node_no=1:node_num
%abcnode=abcnode+1
distance=dist(anchor_x(anchor_no),anchor_y(anchor_no),node_x(node_no),node_y(node_no));
if distance<=rangemax%用此语句判断是否在通信可达到距离范围内
locateinf(2*(anchor_no-1)+1,node_no)=1;
%跳数 里面的两个元素是矩阵的位置坐标
locateinf(2*anchor_no,node_no)=distance; %距离和
%将该点加入队列
queue(1,rear)=node_no;%存放
rear=rear+1;
%上面的这一块描述的是现实状态下,第一跳节点的录入情况,dist的过程是flooding,后又聚集到锚 节点信息的过程
end
while(front<rear)
%从队列中取出元素,该点为known 应该理解为,所有锚节点中每一个周围相对的第一跳节点 哈哈
known=queue(1,front);
front=front+1;
%
for node_no=1:node_num
distance=dist(node_x(known),node_y(known),node_x(node_no),node_y(node_no));
%试图进行第二跳范围内的搜捕
if distance<=rangemax
if locateinf(2*(anchor_no-1)+1,node_no)>(locateinf(2*(anchor_no-1)+1,known)+1)
%跳数比较 奇数行比较 与路由表的概念一致 最终达到所有的点都找到离锚节点最近的跳数
locateinf(2*(anchor_no-1)+1,node_no)=(locateinf(2*(anchor_no-1)+1,known)+1);
%选跳数少的录入
% if locateinf(2*anchor_no,node_no)>locateinf(2*anchor_no,known)+distance;%增加采用距离和较短的算法
locateinf(2*anchor_no,node_no)=locateinf(2*anchor_no,known)+distance;
%将该点加入队列
queue(1,rear)=node_no;
rear=rear+1;
%
% end
end
end
end
end
end
end
ok='完成图的广度先遍历'
% 生成锚节点优先选取矩阵anchorchosen,将距离远的锚节点序号放在后面,即从好到坏排列
for node_no=1:node_num
node_no
for anchor_no=1:anchor_num
%构造temp矩阵
temp(anchor_no,1)=anchor_no;
temp(anchor_no,2)=locateinf((2*anchor_no),node_no);
%(注意讨论的是距离,所以用2*anchor_no)以上,对于每个node,将temp矩阵初始化(注意,node的循环还没有结束)
end
%对temp矩阵进行排序处理
for ti=1:anchor_num-1
min=ti;
for tj=ti+1:anchor_num%(ti+1):anchor_num
if temp(tj,2)<temp(min,2)
min=tj;
end
end
if ti~=min%同在第二列,ti行与min行互换
tempintemp1=temp(ti,1);
tempintemp2=temp(ti,2);
temp(ti,1)=temp(min,1);
temp(ti,2)=temp(min,2);
temp(min,1)=tempintemp1;
temp(min,2)=tempintemp2;
end
end
for anchor_no=1:anchor_num
anchorchosen(anchor_no,node_no)=temp(anchor_no,1);%排好的temp(anchor_no,1)
end
end
ok='生成锚节点优先选取矩阵'
%% 改进算法,选取跳数少的锚节点进行定位,节点坐标存为(locate_near_x,locate_near_y)
locate_near_x=zeros(1,node_num);
locate_near_y=zeros(1,node_num);
for node_no=1:node_num
tempflag=0;
node_no
for chosen1=1:(anchor_num-2)
for chosen2=(chosen1+1):(anchor_num-1)
for chosen3=(chosen2+1):anchor_num
%[x,y]=barycenter(anchor_x(anchorchosen(chosen1,node_no)),anchor_y(anchorchosen(chosen1,node_no)),locateinf(2*anchorchosen(chosen1,node_no),node_no),anchor_x(anchorchosen(chosen2,node_no)),anchor_y(anchorchosen(chosen2,node_no)),locateinf(2*anchorchosen(chosen2,node_no),node_no),anchor_x(anchorchosen(chosen3,node_no)),anchor_y(anchorchosen(chosen3,node_no)),locateinf(2*anchorchosen(chosen3,node_no),node_no));
[x,y]=barycenter(anchor_x(anchorchosen(chosen1,node_no)),anchor_y(anchorchosen(chosen1,node_no)),locateinf(2*anchorchosen(chosen1,node_no),node_no),anchor_x(anchorchosen(chosen2,node_no)),anchor_y(anchorchosen(chosen2,node_no)),locateinf(2*anchorchosen(chosen2,node_no),node_no),anchor_x(anchorchosen(chosen3,node_no)),anchor_y(anchorchosen(chosen3,node_no)),locateinf(2*anchorchosen(chosen3,node_no),node_no));
%求三个圆所相交部分的三个交点坐标所成三角形的重心坐标(barycenter_x,barycenter_y)
if((isreal(x)==1)&&(isreal(y)==1))
locate_near_x(node_no)=x;
locate_near_y(node_no)=y;
tempflag=1;
end
if(tempflag==1) break; end
end
if(tempflag==1) break; end
end
if(tempflag==1) break; end
end
end
ok='定位完成'
%% 计算误差
% 距离差
difference_x=abs(locate_near_x-node_x);
difference_y=abs(locate_near_y-node_y);
%% 显示距离差
%plot(difference_x,difference_y,'+');
% 得出距离差,放在矩阵difference中
for node_no=1:node_num
difference(node_no)=sqrt((difference_x(node_no))^2+(difference_y(node_no))^2);
end
%% 得到距离差大于值gatevalue的点,将节点序号存于badpoint中,badpoint_no为badpoint的数量
gatevalue=rangemax;
badpoint_no=1;
for node_no=1:node_num
if difference(node_no)>gatevalue
badpoint(badpoint_no)=node_no;
badpoint_no=badpoint_no+1;
end
end
badpoint_no=badpoint_no-1;
% 绘制node节点位置和计算出的位置,并用线段连接
figure(1)
%plot(anchor_x,anchor_y,'*',node_x,node_y,'o',locate_near_x,locate_near_y,'+');
hold on;
for node_no=1:node_num
line([node_x(node_no),locate_near_x(node_no)],[node_y(node_no),locate_near_y(node_no)]);
end
hold off;
%plot(anchor_x,anchor_y,'*',node_x,node_y,'*')
%hold on;
%plot(locate_near_x,locate_near_y,'.','MarkerSize',15,'Color','r');
%for node_no=1:node_num
% line([node_x(node_no),locate_near_x(node_no)],[node_y(node_no),locate_near_y(node_no)]);
%end
%hold off;
%门限值为最大通信距离,显示距离差大于门限值的节点个数
badpoint_no
%计算连通度,并显示结果
count=0;
for node_no=1:node_num
if(isnan(difference(node_no))~=1)
count=count+1;
end
end
connectivity=count/node_num;
connectivity
range_error=mean(difference)/rangemax
ok='全部完成'
if(a8==1)
a5=range_error*100;
end
if(a8==2)
a4=range_error*100;
end
if(a8==3)
a3=range_error*100;
end
if(a8==4)
a2=range_error*100;
end
if(a8==5)
a1=range_error*100;
end
end
plot(200,a5,'*',250,a4,'*',300,a3,'*',350,a2,'*',400,a1,'*');
line([200,250,300,350,400],[a5,a4,a3,a2,a1]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -