一、虛拟力覆寫算法簡介
虛拟力覆寫算法應用于傳感器網絡近幾年引起了越來越多的人的關注,這首先由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:N
x1=x(i,1)+r*cos(w);
y1=x(i,2)+r*sin(w);%表示圓每一個角度對應一個點,然後把這些點連接配接起來構成圓
hold on
plot(x1,y1,'g'); %畫出各個傳感器節點的感覺範圍
text(x(i,1)+3,x(i,2),['\fontsize{8}\rm',num2str(i)]);
hold on
fill(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:N
text(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:N
k2=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;
end
end
Fx=0;
Fy=0;
for j=1:(k2-1)
Fx=Fx+F(j,1); %水準力
Fy=Fy+F(j,2); %垂直力
end
Fxy=sqrt(Fx^2+Fy^2);
if Fxy==0
x(i,1)=x(i,1)+0;
x(i,2)=x(i,2)+0;
else
x(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;
%end
end
%-----------------------傳感器之間的斥力-------
Fs=0;
for i=1:N
ks=1;
for j=1:N
if i~=j
ds=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;
end
end
end
Fsx=0;
Fsy=0;
for j=1:(ks-1)
Fsx=Fsx+Fs(j,1); %水準力
Fsy=Fsy+Fs(j,2); %垂直力
end
Fsxy=sqrt(Fsx^2+Fsy^2);
if Fsxy==0
x(i,1)=x(i,1)+0;
x(i,2)=x(i,2)+0;
else
x(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)<XMIN
x(i,1)=XMIN;
end
if x(i,1)>XMAX
x(i,1)=XMAX;
end
if x(i,2)<YMIN
x(i,2)=YMIN;
end
if x(i,2)>YMAX
x(i,2)=YMAX;
end
end
%-----------------------------------------------------------
[no_cover,summ,k1]=compute_cover(xx1,yy1,x,r); %計算覆寫覆寫範圍
%------------------
for i=1:N
hold on
plot([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;
end
q(t+1,1)=summ/K;
if q(t+1,1)>=1
break;
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+r
D=sqrt((xx1(k,1)-x(j,1))^2+(yy1(k,1)-x(j,2))^2); %網格點與傳感器節點間的距離
if (D<=r) %在圓盤範圍内的網格點作為可覆寫的格點
flag=flag+1;
end
if flag==1
summ=summ+flag;
break;
end
end
if flag==0
no_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.