【WSN定位】基于灰狼算法优化无线传感器非测距定位算法DVHop附matlab代码

1 内容介绍

计算机技术与无线通信技术的不断发展与深化,推动了无线传感器网络技术的迅速发展 [1]。传感器网络由协作的传感器节点组成,这些节点可以感知环境,监测物理现象和人们感 兴趣的事件。作为一种覆盖监测领域的现代技术,无线传感器网络通常由几个到几千个体积 小、成本低的设备组成,常用来采集、处理和传输数据[2]。无线传感器网络影响着人们生活 的方方面面[3-4],它被广泛应用于工农业数据采集、环境监测、危险区域远程控制和国家安防 中,现在被研究应用于智能家居和智慧城市等人工智能领域,这些领域对整个社会都有着巨 大的潜在效益。 在无线传感器网络的诸多应用中,节点采集到的数据必须有位置信息才有利用价值[5]。 例如:在森林火灾救援时就必须通过传感器探知火灾发生的具体位置;在军事反恐时,利用 传感器网络来测量枪声和爆破的声波信号,可以精确的定位射击者的位置;在工农业数据采 集时,必须知道采集到的工农业传感数据的具体位置;在排查天然气管道泄漏时,必须知道 天然气管道泄漏的确切位置。因此,无线传感器网络的应用离不开节点的确切位置,如何提 高未知节点的定位精度更是节点定位技术中的研究重点。 传感器节点定位通常由人工配置和 GPS 接收器[6]等途径来实现。人工配置主要是手动将 节点坐标输入到网络中,该方法由于比较耗时因此可行性不高。使用 GPS 接收器主要是利用 安装在节点上的 GPS 接收器来接收来自多个卫星的信号从而确定节点的位置,尽管通过卫星 定位实时性好且精度较高,但是由于 GPS 成本过高,体积过大,导致可行性也不高。因此, 许多学者研究出一种利用已知节点来估算未知节点坐标的定位技术,将一部分节点通过之前 介绍的 GPS 接收器方法来确定自身位置,并将其投放于网络中,这部分节点称为锚节点或者 信标节点,然后利用锚节点与未知节点的联系来估算出未知节点的坐标。因此,如何通过效 率高且成本低的定位算法估算出未知节点的坐标成为了当今研究的热点,也为节点定位技术 提出了新的研究挑战。定位中最常见的分类方法是根据节点间的物理距离是否需要先测量来划分。基于测距 (Range-based)的定位算法,简而言之就是需要先测出物理距离或者角度信息,然后通过一 些定位算法来计算节点坐标。通常情况下,基于测距的定位算法由于能得到物理距离,因此 其比基于非测距的定位算法精度高,但是需要额外的硬件支撑才能测出距离,从而部署成本 也高于基于非测距的定位算法。由于基于非测距的定位算法并没有精确的测量节点坐标,而 是通过估算的方式求出节点坐标,因此,该方法存在相对较高的定位误差,但是非测距算法 相对于测距算法更加经济与节能。在对定位精度要求不是很高的应用中,往往基于非测距的 定位算法更加受欢迎,而且,随着对定位算法的不断深入研究与优化改进,定位精度也会日 益提高。

2 仿真代码

<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:#dd1144">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>

3 运行结果

4 参考文献

[1]吴珍珍. 基于DV-HOP的无线传感器网络非测距定位算法的研究. Diss. 江西理工大学.

[2]李胜萍. 无线传感器网络非测距定位算法研究. Diss. 西南交通大学.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值