一、虚拟力覆盖算法简介

虚拟力覆盖算法应用于传感器网络近几年引起了越来越多的人的关注,这首先由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. Linux内核功能及架构
  2. .net Repeater知识知多少
  3. C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现
  4. slack 团队协作平台
  5. SQL查询分析器SQL语句导入TXT文件
  6. MATLAB读取nc文件
  7. NAT(地址转换技术)详解
  8. Tue Feb 23 2021 00:00:00 GMT+0800 (中国标准时间)时间格式转换
  9. 谨以此写下本人安装riscv的全过程 简单易懂!!(本人环境是在ubuntu18.04中)
  10. 冯成毅:各类交易者的深度心理剖析
  11. 嵌入式课后总结(3)
  12. torch.cumsum(),torch.sum()
  13. 1427.分解质因数
  14. CPU, GPU, FPGA计算能力
  15. 被微软收购两年后,GitHub 怎么样了?
  16. stm32下的HX711称重模块的程序
  17. 苹果safari浏览器 button点击不会触发focus事件 如何解决?
  18. 毕业论文 入侵防御系统在企业网络中的应用
  19. 小符MYSQL的笔记
  20. 怎样精确计算股市主力的持仓量

热门文章

  1. 网络编程遇到的一个错误?
  2. java日期处理SimpleDateFormat等
  3. Matlab绘制图像后在指定点绘制坐标线以及标注变量
  4. Flash 显示全景图
  5. (转)PMP的项目管理5大组
  6. 20191231每日一句
  7. Python TCP 学习笔记
  8. 20190901每日一句 那就从现在开始吧,让生命变得更有价值
  9. C和C++的关系, namespace, struct , class
  10. Atitit 全文检索 pgsql 艾提拉总结 分词 全文索引的实现要靠 PgSQL 的 gin 索引。分词功能 PgSQL 内置了英文、西班牙文等,但中文分词需要借助开源插件 zhparser;