计算机技术和无线通信技术的不断发展和深化,促进了无线传感器网络技术的快速发展[1]。传感器网络由协作传感器节点组成,可以感知环境,监测物理现象和人的感知兴趣事件。无线传感器网络作为覆盖监控领域的现代技术,通常从几个到几千个体积小、成本低的设备组成,常用来采集、处理和传输数据[2]。无线传感器网络影响人们的生活的方方面面[3-4],广泛应用于工农数据采集、环境监测、危险区域远程控制和国家安全目前已被研究应用于智能家居、智能城市等人工智能领域。这些领域对整个社会都是巨大的潜在效益大。在无线传感器网络的许多应用中,节点收集的数据在使用价值之前必须有位置信息[5]。例如,在森林火灾救援中,必须通过传感器检测火灾的具体位置;在军事反恐中,使用传感器网络测量枪声和爆破声信号,准确定位射击者的位置;工农数据采集收集时,必须知道收集到的工农传感数据的具体位置;检查天然气管道泄漏时,必须知道天然气管道泄漏的确切位置。因此,无线传感器网络的应用离不开节点的确切位置节点定位技术的研究重点是高未知节点的定位精度。因此,无线传感器网络的应用离不开节点的确切位置节点定位技术的研究重点是高未知节点的定位精度。传感器节点的定位通常是手动配置的GPS接收器[6]实现其他方式。手动配置主要是手动的节点坐标输入到网络中,耗时,可行性不高。GPS接收器主要用于使用在节点上安装GPS尽管通过卫星,接收器接收多颗卫星的信号来确定节点的位置由于定位实时性好,精度高,GPS成本过高,体积过大,导致可行性低。许多学者研究出一种利用已知节点来估算未知节点坐标的定位技术,将一部分节点通过之前介绍的GPS接收器方法确定自己的位置,并将其放入网络中,称为锚节点或信标节点,然后利用锚节点与未知节点的连接来估计未知节点的坐标。因此,如何通过效率未知节点的坐标已成为当今研究的热点,也是节点定位技术提出了新的研究挑战。根据节点之间的物理距离是否需要先测量来划分定位中最常见的分类方法。基于测距(Range-based)的定位算法,简而言之就是需要先测出物理距离或者角度信息,然后通过一计算节点坐标的定位算法。通常,基于测距的定位算法可以获得物理距离,因此它比基于非测距的定位算法更精确,但需要额外的硬件支持来测量距离,从而部署成本也高于基于非测距的定位算法。由于基于非测距的定位算法没有准确的测量节点坐标,节点坐标是通过估计获得的。因此,该方法定位误差较高,但非测距算法比测距算法更经济节能。在对定位精度要求不高的应用中,往往是基于非测距定位算法更受欢迎,随着定位算法的不断深入研究、优化和改进,定位精度将日益提高益提高。
<span style="color:#333333"><span style="background-color:rgba(0, 0, 0, 0.03)"><code>function <span style="color:#dd1144">[Alpha_pos,Alpha_score,Convergence_curve]=GWO(SearchAgents_no,Max_iter,lb,ub,dim,fobj)</span></code><code></code><code><span style="color:#afafaf">%</span> <span style="color:#dd1144">initialize alpha, beta, and delta_pos</span></code><code>Alpha_pos=<span style="color:#dd1144">zeros(1,dim);</span></code><code>Alpha_score=<span style="color:#dd1144">inf; %change this to -inf for maximization problems</span></code><code></code><code>Beta_pos=<span style="color:#dd1144">zeros(1,dim);</span></code><code>Beta_score=<span style="color:#dd1144">inf; %change this to -inf for maximization problems</span></code><code></code><code>Delta_pos=<span style="color:#dd1144">zeros(1,dim);</span></code><code>Delta_score=<span style="color:#dd1144">inf; %change this to -inf for maximization problems</span></code><code></code><code><span style="color:#afafaf">%Initialize</span> <span style="color:#dd1144">the positions of search agents</span></code><code>Positions=<span style="color:#dd1144">initialization(SearchAgents_no,dim,ub,lb);</span></code><code></code><code>Convergence_curve=<span style="color:#dd1144">zeros(1,Max_iter);</span></code><code></code><code>l=<span style="color:#dd1144">0;% Loop counter</span></code><code></code><code><span style="color:#afafaf">%</span> <span style="color:#dd1144">Main loop</span></code><code>while <span style="color:#dd1144">l<Max_iter</span></code><code> for <span style="color:#dd1144">i=1:size(Positions,1) </span></code><code> </code><code> <span style="color:#afafaf">%</span> <span style="color:#dd144">Return back the search agents that go beyond the boundaries of the search space</span></code><code> Flag4ub=<span style="color:#dd1144">Positions(i,:)>ub;</span></code><code> Flag4lb=<span style="color:#dd1144">Positions(i,:)<lb;</span></code><code> <span style="color:#afafaf">Positions(i,</span>:<span style="color:#dd1144">)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb; </span></code><code> </code><code> <span style="color:#afafaf">%</span> <span style="color:#dd1144">Calculate objective function for each search agent</span></code><code> fitness=<span style="color:#dd1144">fobj(Positions(i,:));</span></code><code> </code><code> <span style="color:#afafaf">%</span> <span style="color:#dd1144">Update Alpha, Beta, and Delta</span></code><code> if <span style="color:#dd1144">fitness<Alpha_score </span></code><code> Alpha_score=<span style="color:#dd1144">fitness; % Update alpha</span></code><code> Alpha_pos=<span style="color:#dd1144">Positions(i,:);</span></code><code> end</code><code> </code><code> if <span style="color:#dd1144">fitness>Alpha_score && fitness<Beta_score </span></code><code> Beta_score=<span style="color:#dd1144">fitness; % Update beta</span></code><code> Beta_pos=<span style="color:#dd1144">Positions(i,:);</span></code><code> end</code><code> </code><code> if <span style="color:#dd1144">fitness>Alpha_score && fitness>Beta_score && fitness<Delta_score </span></code><code> Delta_score=<span style="color:#dd1144">fitness; % Update delta</span></code><code> Delta_pos=<span style="color:#dd1144">Positions(i,:);</span></code><code> end</code><code> end</code><code> </code><code> </code><code> a=<span style="color:#dd1144">2-l*((2)/Max_iter); % a decreases linearly fron 2 to 0</span></code><code> </code><code> <span style="color:#afafaf">%</span> <span style="color:#dd1144">Update the Position of search agents including omegas</span></code><code> for <span style="color:#dd1144">i=1:size(Positions,1)</span></code><code> for <span style="color:#dd1144">j=1:size(Positions,2) </span></code><code> </code><code> r1=<span style="color:#dd1144">rand(); % r1 is a random number in [0,1]</span></code><code> r2=<span style="color:#dd1144">rand(); % r2 is a random number in [0,1]</span></code><code> </code><code> A1=<span style="color:#dd1144">2*a*r1-a; % Equation (3.3)</span></code><code> C1=<span style="color:#dd1144">2*r2; % Equation (3.4)</span></code><code> </code><code> D_alpha=<span style="color:#dd1144">abs(C1*Alpha_pos(j)-Positions(i,j)); % Equation (3.5)-part 1</span></code><code> X1=<span style="color:#dd1144">Alpha_pos(j)-A1*D_alpha; % Equation (3.6)-part 1</span></code><code> </code><code> r1=<span style="color:#dd1144">rand();</span></code><code> r2=<span style="color:#dd1144">rand();</span></code><code> </code><code> A2=<span style="color:#dd1144">2*a*r1-a; % Equation (3.3)</span></code><code> C2=<span style="color:#dd1144">2*r2; % Equation (3.4)</span></code><code> </code><code> D_beta=<span style="color:#dd1144">abs(C2*Beta_pos(j)-Positions(i,j)); % Equation (3.5)-part 2</span></code><code> X2=<span style="color:#dd1144">Beta_pos(j)-A2*D_beta; % Equation (3.6)-part 2 </span></code><code> </code><code> r1=<span style="color:#dd1144">rand();</span></code><code> r2=<span style="color:#dd1144">rand(); </span></code><code> </code><code> A3=<span style="color:#dd1144">2*a*r1-a; % Equation (3.3)</span></code><code> C3=<span style="color:#dd1144">2*r2; % Equation (3.4)</span></code><code> </code><code> D_delta=<span style="color:#dd1144">abs(C3*Delta_pos(j)-Positions(i,j)); % Equation (3.5)-part 3</span></code><code> X3=<span style="color:#dd1144">Delta_pos(j)-A3*D_delta; % Equation (3.5)-part 3 </span></code><code> </code><code> <span style="color:#afafaf">Positions(i,j)</span>=<span style="color:#dd1144">(X1+X2+X3)/3;% Equation (3.7)</span></code><code> </code><code> end</code><code> end</code><code> l=<span style="color:#dd1144">l+1; </span></code><code> <span style="color:#afafaf">Convergence_curve(l)</span>=<span style="color:#dd1144">Alpha_score;</span></code><code>end</code><code></code><code></code><code></code><code></code></span></span>
[1]吴珍珍. 基于DV-HOP的无线传感器网络非测距定位算法的研究. Diss. 江西理工大学.
[2]李胜萍. 无线传感器网络非测距定位算法研究. Diss. 西南交通大学.