www.gusucode.com > 无线传感器网络定位算法 matlab源代码 包含七个算法matlab源码程序 > Localization/Amorphous/Amorphous.m
function Amorphous() load '../Deploy Nodes/coordinates.mat'; load '../Topology Of WSN/neighbor.mat'; if all_nodes.anchors_n<3 disp('锚节点少于3个,DV-hop算法无法执行'); return; end %~~~~~~~~~~~~~~~~~~~~~~~~~最短路经算法计算节点间跳数~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ shortest_path=neighbor_matrix; shortest_path=shortest_path+eye(all_nodes.nodes_n)*2; shortest_path(shortest_path==0)=inf; shortest_path(shortest_path==2)=0; for k=1:all_nodes.nodes_n for i=1:all_nodes.nodes_n for j=1:all_nodes.nodes_n if shortest_path(i,k)+shortest_path(k,j)<shortest_path(i,j)%min(h(i,j),h(i,k)+h(k,j)) shortest_path(i,j)=shortest_path(i,k)+shortest_path(k,j); end end end end if length(find(shortest_path==inf))~=0 disp('网络不连通...需要划分连通子图...这里没有考虑这种情况'); return; end %~~~~~~~~~~~~~~~~~~~~~~~~~每跳距离~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ % Amorphous是离线计算网络每跳距离的,它需要在网络部署之前就知道网络的平均连通度 % 离线计算网络平均连通度:connectivity=(节点数/监测区域面积)*pi*R^2 % 真实的网络平均连通度:(在网络部署完毕后通过节点通信收集整个网络的信息) % connectivity=sum(sum(neighobr_matrix))/all_nodes.nodes_n; try%C型网络 area=all_nodes.area(1)^2-(all_nodes.area(4)-all_nodes.area(3))*(all_nodes.area(1)-all_nodes.area(2)); catch area=all_nodes.square_L^2; end connectivity=all_nodes.nodes_n/area*pi*comm_r^2; syms t; temp=@(t)(exp(-connectivity/pi*(acos(t)-t.*sqrt(1-t.^2)))); hopsize=comm_r*(1+exp(-connectivity)-sum(temp(-1:0.001:1)*0.001));%求校正值的积分matlab求不出来,只好求和逼近了 %~~~~~~~~~~~~~~~~~~~~~~~每个未知节点开始计算自己的位置~~~~~~~~~~~~~~~~~~~~ for i=all_nodes.anchors_n+1:all_nodes.nodes_n neighboring_node_index=find(neighbor_matrix(i,:)==1); hop=mean(shortest_path([neighboring_node_index,i],1:all_nodes.anchors_n))-0.5; unknown_to_anchors_dist=hopsize*hop';%计算到锚节点的距离=跳数*校正值 %~~~~~~~~~~最小二乘法~~~~~~~~~~~~~~~` A=2*(all_nodes.estimated(1:all_nodes.anchors_n-1,:)-repmat(all_nodes.estimated(all_nodes.anchors_n,:),all_nodes.anchors_n-1,1)); anchors_location_square=transpose(sum(transpose(all_nodes.estimated(1:all_nodes.anchors_n,:).^2))); dist_square=unknown_to_anchors_dist.^2; b=anchors_location_square(1:all_nodes.anchors_n-1)-anchors_location_square(all_nodes.anchors_n)-dist_square(1:all_nodes.anchors_n-1)+dist_square(all_nodes.anchors_n); all_nodes.estimated(i,:)=transpose(A\b); all_nodes.anc_flag(i)=2; end %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ save '../Localization Error/result.mat' all_nodes comm_r; end