一、虚拟力覆盖算法简介

虚拟力覆盖算法应用于传感器网络近几年引起了越来越多的人的关注,这首先由Zou等人将虚拟力引入到传感器网络,很明显传感器节点和机器人存在着很多共同之处。所以他们在虚拟力应用于机器人领域的基础上,把传感器也看作是势场中的粒子,由于地球是个巨大的磁场和地球周围存在着电磁场,可以把节点看作是存在势场中的粒子,这样传感器节点之间就存在着相互的联系。

二、部分源代码

clear all
clc
N=40;%传感器节点个数
XMAX=900;%区域总长度
XMIN=100;
YMAX=800;%区域总宽度
YMIN=100;%区域总宽度
x=zeros(N,2);
x(:,1)=(XMAX-XMIN)*rand(N,1)+XMIN;%使节点坐标随机分布
x(:,2)=(YMAX-YMIN)*rand(N,1)+YMIN;
figure,
xm=[XMIN YMIN;XMIN YMAX;XMAX YMAX;XMAX YMIN];%区域的四个顶点
fill(xm(:,1),xm(:,2),[0.8,0.8,0.8]);
hold on
plot(x(:,1),x(:,2),'r.','linewidth',5);
r=90; %传感器节点的感知半径
w=0:pi/50:2*pi;
for i=1:Nx1=x(i,1)+r*cos(w);y1=x(i,2)+r*sin(w);%表示圆每一个角度对应一个点,然后把这些点连接起来构成圆hold onplot(x1,y1,'g');   %画出各个传感器节点的感知范围text(x(i,1)+3,x(i,2),['\fontsize{8}\rm',num2str(i)]);hold onfill(x1,y1,'b')
end
axis([0 1000 0 900]);%设定坐标范围
xlabel('X/m');ylabel('Y/m');
%legend('要监测的区域',['传感器节点(','\fontsize{12}\bf',num2str(N),'\fontsize{10}\rm个)的位置'],' 传感器节点的感知范围');
hold on
plot([XMIN XMAX],[YMIN YMIN],'k','linewidth',1.5);
hold on
plot([XMIN XMIN],[YMIN YMAX],'k','linewidth',1.5);
hold on
plot([XMAX XMAX],[YMIN YMAX],'k','linewidth',1.5);
hold on
plot([XMIN XMAX],[YMAX YMAX],'k','linewidth',1.5);%把四个顶点连接起来组成一个监测区域
%--------------------------------虚拟力算法---------------------------------
%------------先对区域进行离散化---------
deta=2;%网络大小
x1=XMIN:deta:XMAX;
y1=YMIN:deta:YMAX;
[xx,yy]=meshgrid(x1,y1);
[m,n]=size(xx);
K=m*n; %总的网格点数目
xx1=reshape(xx,K,1);%网格点的横坐标
yy1=reshape(yy,K,1);%网格点的纵坐标
%hold on
%plot(xx1,yy1,'g*')
%----------------计算起初的网络覆盖率-----------------------------------------------------
[no_cover,summ,k1]=compute_cover(xx1,yy1,x,r);
%no_cover存储没有被覆盖的格点位置,k1为求被覆盖的格点,summ为被覆盖的格点数;
q(1,1)=summ/K;
%-------------------------------------------------------
figure,
fill(xm(:,1),xm(:,2),[0.8,0.8,0.8]); %填充监测区域
hold on
plot(x(:,1),x(:,2),'ro','markerfacecolor','r','linewidth',3); %传感器节点位置
for i=1:Ntext(x(i,1)+3,x(i,2),['\fontsize{8}\rm',num2str(i)]); %标出传感器节点位置
end
axis([0 1000 0 900]);
xlabel('X/m');ylabel('Y/m');
%----------------------
R=2*r;    %传感器节点的通信半径
maxiter=100; %最大迭代次数
max_step=2.5; %传感器节点移动的最大步长(在格点作用下的最大步长)
max_sensor=3.5; %传感器节点移动的最大步长(在传感器节点作用下的最大步长)
%----------------------
kp=1;
xp{kp,1}=x;
for t=1:maxiter%k3=1;F=0;tx_old=x; %前一次迭代的传感器节点位置for i=1:Nk2=1;flag1=0;for k=1:(k1-1)dik=sqrt((x(i,1)-no_cover(k,1))^2+(x(i,2)-no_cover(k,2))^2); %x为传感器节点的位置,no_cover是未被网络覆盖的网格点的位置if ((dik>r)&(dik<=R))   %R为通信半径,r为感知半径F(k2,1)=no_cover(k,1)-x(i,1);F(k2,2)=no_cover(k,2)-x(i,2);k2=k2+1;%flag1=flag1+1;endendFx=0;Fy=0;for j=1:(k2-1)Fx=Fx+F(j,1); %水平力Fy=Fy+F(j,2); %垂直力endFxy=sqrt(Fx^2+Fy^2);if Fxy==0x(i,1)=x(i,1)+0;x(i,2)=x(i,2)+0;elsex(i,1)=x(i,1)+Fx/Fxy*max_step*exp(-1/Fxy);%节点位置更新x(i,2)=x(i,2)+Fy/Fxy*max_step*exp(-1/Fxy);end%if flag1~=0%   k3=k3+1;%endend%-----------------------传感器之间的斥力-------Fs=0;for i=1:Nks=1;for j=1:Nif i~=jds=sqrt((x(i,1)-x(j,1))^2+(x(i,2)-x(j,2))^2);if ds<(1.4*r)Fs(ks,1)=x(i,1)-x(j,1);Fs(ks,2)=x(i,2)-x(j,2);ks=ks+1;endendendFsx=0;Fsy=0;for j=1:(ks-1)Fsx=Fsx+Fs(j,1); %水平力Fsy=Fsy+Fs(j,2); %垂直力endFsxy=sqrt(Fsx^2+Fsy^2);if Fsxy==0x(i,1)=x(i,1)+0;x(i,2)=x(i,2)+0;elsex(i,1)=x(i,1)+Fsx/Fsxy*max_sensor*exp(-1/Fsxy);x(i,2)=x(i,2)+Fsy/Fsxy*max_sensor*exp(-1/Fsxy);end%-----------------不能出边界------if x(i,1)<XMINx(i,1)=XMIN;endif x(i,1)>XMAXx(i,1)=XMAX;endif x(i,2)<YMINx(i,2)=YMIN;endif x(i,2)>YMAXx(i,2)=YMAX;endend%-----------------------------------------------------------[no_cover,summ,k1]=compute_cover(xx1,yy1,x,r); %计算覆盖覆盖范围%------------------for i=1:Nhold onplot([tx_old(i,1) x(i,1)],[tx_old(i,2) x(i,2)],'-'); %画传感器节点的运动轨迹图end%-------------------if t==(kp*round(maxiter/4)) %为了得到总迭代步长中每四分之一时的情况kp=kp+1;xp{kp,1}=x;endq(t+1,1)=summ/K;if q(t+1,1)>=1break;end
end
function [no_cover,summ,k1]=compute_cover(xx1,yy1,x,r)
%% (xx1,yy1)分别为网格点的横纵坐标;
%% x为传感器节点的坐标, r为传感器节点的感知半径
%% no_cover存储没有被覆盖的格点位置,k1为求被覆盖的格点,summ为被覆盖的格点数;
no_cover=0; %存储没有被覆盖的格点位置
flag=0;
k1=1;
summ=0;
K=length(xx1);
[N,N1]=size(x);
for k=1:K   %K为总的网格点数目flag=0;for j=1:N   %寻找不在覆盖区域内的网格点,条件为:x-r<=xx1<=x+rD=sqrt((xx1(k,1)-x(j,1))^2+(yy1(k,1)-x(j,2))^2); %网格点与传感器节点间的距离if (D<=r)  %在圆盘范围内的网格点作为可覆盖的格点flag=flag+1;endif flag==1summ=summ+flag;break;endendif flag==0no_cover(k1,1)=xx1(k,1); %存储没有被覆盖的格点位置no_cover(k1,2)=yy1(k,1);%text(no_cover(k1,1)+1,no_cover(k1,2),['\fontsize{8}\rm',num2str(k1)]);k1=k1+1;  end
end
k1=k1-1;

三、运行结果




四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

【优化覆盖】基于matlab虚拟力算法求解无线网络传感覆盖优化问题【含Matlab源码 1187期】相关推荐

  1. 【Matlab优化覆盖】虚拟力算法求解无线网络传感覆盖优化问题【含源码 1187期】

    一.代码运行视频(哔哩哔哩) [Matlab优化覆盖]虚拟力算法求解无线网络传感覆盖优化问题[含源码 1187期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1 ...

  2. 【优化覆盖】基于matlab人工蜂群算法求解无线网络传感覆盖优化问题【含Matlab源码 1097期】

    ⛄一.人工蜂群算法求解无线网络传感覆盖优化问题简介 1 WSN覆盖模型 1.1 问题描述 在WSN中, 要实现较高的无线网络传感器节点覆盖率从而减少监测盲点的出现, 就必须加大无线网络传感器节点的分布 ...

  3. 【优化选址】基于人工蜂群算法求解无线网络传感覆盖优化问题含Matlab源码

    1 简介 近年来,物联网技术,人工智能技术的兴起使传感器网络分布覆盖检测区域的研究以及最大限度地提高传感器网络的覆盖率变得尤为必要.人工蜂群算法在无约束条件的数值优化问题上能取得较好的收敛效果.通过人 ...

  4. 【Matlab指纹识别】指纹识别匹配门禁系统【含GUI源码 587期】

    一.代码运行视频(哔哩哔哩) [Matlab指纹识别]指纹识别匹配门禁系统[含GUI源码 587期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...

  5. 【Matlab图像加密】正交拉丁方置乱算法图像加解密【含GUI源码 182期】

    一.代码运行视频(哔哩哔哩) [Matlab图像加密]正交拉丁方置乱算法图像加解密[含GUI源码 182期] 二.matlab版本及参考文献 一.代码运行视频(哔哩哔哩) [Matlab图像处理]自动 ...

  6. 【Matlab验证码识别】遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别【含GUI源码 1694期】

    一.代码运行视频(哔哩哔哩) [Matlab验证码识别]遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别[含GUI源码 1694期] 二.matlab版本及参考文献 1 matlab ...

  7. 【Matlab电力负荷预测】粒子群优化支持向量机短期电力负荷预测【含GUI源码 751期】

    一.代码运行视频(哔哩哔哩) [Matlab电力负荷预测]粒子群优化支持向量机短期电力负荷预测[含GUI源码 751期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 ...

  8. 【Matlab图像融合】小波变换遥感图像融合【含GUI源码 744期】

    一.代码运行视频(哔哩哔哩) [Matlab图像融合]小波变换遥感图像融合[含GUI源码 744期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...

  9. 【Matlab指纹识别】指纹识别门禁系统【含GUI源码 1692期】

    一.代码运行视频(哔哩哔哩) [Matlab指纹识别]指纹识别门禁系统[含GUI源码 1692期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余继 ...

  10. 【Matlab路径规划】改进的遗传算法机器人避障路径规划【含GUI源码 703期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]改进的遗传算法机器人避障路径规划[含GUI源码 703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

最新文章

  1. dell 服务器硬件信息监控OMSA安装
  2. 在 Linux 上创建一个加密文件保险库
  3. 为什么要用MyBatis-Spring JDBC
  4. [leetcode]145.二叉树的后序遍历
  5. 使用Arquillian测试安全的EJB
  6. 全局变量定义的时候左侧加了static_c语言中static 用法
  7. 【NOIP2017】【Luogu3951】小凯的疑惑
  8. celerra(八)--Celerra Replication(下)
  9. Broadleaf概念
  10. a as as big rat_12句英语绕口令,你能一口气读完几句?
  11. 2022年大厂中秋礼盒大赏,卷的就是创意!
  12. 归纳法、演绎法、数学归纳法之间的关系
  13. 数值计算作业:Guass列选主元消去法解线性方程组
  14. C++ stack的使用及模拟实现
  15. Windows 基本操作命令
  16. 直角坐标系转球坐标系 Equirectangular 理解 代码 Unity
  17. iphone11各机型对比_9款旗舰系统对比 iPhone 11居然不是最好用的
  18. 读《高手》有感(包括问题、质疑、专业名词、哲理句)
  19. 让你快速掌握技巧,新手怎么做自媒体?分享6点干货知识
  20. command命令大全(转自http://blog.dhedu.gov.cn/u/72/archives/2009/14290.html)

热门文章

  1. JavaScript 丨 你不知道的arguments
  2. html5学习笔记(progress)
  3. hdu 1908数据结构水题
  4. 转载一篇理解堆和栈区别的好文章
  5. 后RCNN时代的物体检测及实例分割进展
  6. pytesseract识别数字
  7. AR、VR、MR的那些事儿
  8. Atitit 文件上传功能的实现 图片 视频 目录 1. 上传原理 1 1.1. http post编码 multipart / form-data 1 1.2. 临时文件模式 最简单 2 1.3
  9. Atitit.编译原理与概论
  10. atitit。html css框架Bootstrap  Foundation的比较与不同 attilax大总结