📄 test3_5.m
字号:
end
k=0;
for i=1:8
for j=1:8
k=value(i,j)+k;
end
end
r_fit(l)=k;
end
for i=1:60 % 与当前最优粒子比较适应度并调整最优粒子
if r_fit(i)<fitness
fitness=r_fit(i);
r_gbest(1,1:0.2*n)=r(i,1:0.2*n);
end
if r_fit(i)<r_lfit(i)
r_lfit(i)=r_fit(i);
r_best(i,1:0.2*n)=r(i,1:0.2*n);
end
end
w=w-0.00013*f; % modify the parameter of w
if w<0.2 % setting the smallest value of w
w=0.2;
end
fit(f)=fitness;
if mod(f,20)==0 % 调整参数n1,n2
if fit(f-19)==fit(f)
if n2<0.2*60
n2=n2+1;
end
if n1>0.05*60
n1=n1-1;
end
end
if fit(f-19)~=fit(f)
if n1<0.15*60
n1=n1+1;
end
if n2>=1
n2=n2-1;
end
end
end
z=f
end
for i=1:n
x(i)=node1(i).xposition;
y(i)=node1(i).yposition;
end
s=square1(x,y,n,16);
q=s/(16^2*20^2); %计算实际服务质量
h=figure(1);
for i=1:0.1*n
plot(node1(i).xposition,node1(i).yposition,'s');
hold on;
end
for i=1:n
plot(node1(i).xposition,node1(i).yposition,'.');
hold on;
end
grid on;
h=figure(2);
for i=1:0.1*n
node(i).xposition=2*r_gbest(1,2*i-1)-1;
node(i).yposition=2*r_gbest(1,2*i)-1;
end
for i=1:n
x(i)=node(i).xposition;
y(i)=node(i).yposition;
end
s=square1(x,y,n,16);
q2=s/(16^2*20^2);
for i=1:0.1*n
plot(node(i).xposition,node(i).yposition,'s');
hold on;
end
for i=1:n
plot(node(i).xposition,node(i).yposition,'.');
hold on;
end
grid on;
m=0.1*n;
r=1;
for i=1:8 % nsnode 存放在自区域的节点和机器人的ID号
for j=1:8
for k=1:5
nsnode(i,j,k)=0;
end
end
end
for i=1:m % robot 存放机器人所在的子区域
robot(i,1)=0;
robot(i,2)=0;
end
for i=1:8
for j=1:8
ns(i,j)=0;
end
end
for i=1:8 % 统计各子区域的节点ID
for j=1:8
k=0;
for h=1:n
if x(h)<2*i & x(h)>2*(i-1)
if y(h)<2*j & y(h)>2*(j-1)
ns(i,j)=ns(i,j)+1;
k=k+1;
nsnode(i,j,k)=h;
if h<=m
robot(h,1)=i;
robot(h,2)=j;
end
end
end
end
end
end
for i=1:m % 记录活动节点的各子区域内最近邻居节点
for j=1:3
for k=1:3
nnode(m,j,k)=0;
end
end
end
for f=1:600
for i=1:0.1*n
for j=1:3
nrobot(i,j)=0; % 记录与机器人在同一子区域内的固定节点
end
end
for i=1:m % 在邻近区域中找距活动节点距离最近的节点
j=robot(i,1);
k=robot(i,2);
if j==1
h1=0;
h2=1;
if k==1
g1=0;
g2=1;
elseif k>1 & k<8
g1=-1;
g2=1;
else
g1=-1;
g2=0;
end
elseif j>1 & j<8
h1=-1;
h2=1;
if k==1
g1=0;
g2=1;
elseif k>1 & k<8
g1=-1;
g2=1;
else
g1=-1;
g2=0;
end
else
h1=-1;
h2=0;
if k==1
g1=0;
g2=1;
elseif k>1 & k<8
g1=-1;
g2=1;
else
g1=-1;
g2=0;
end
end
for h=h1:h2
for g=g1:g2
id=0;
if h~=0 | g~=0
if ns(j+h,k+g)>0
id=nsnode(j+h,k+g,1);
d=((2*j-1-x(id))^2+(2*k-1-y(id))^2)^0.5;
for t1=1:ns(j+h,k+g)
id1=nsnode(j+h,k+g,t1);
d1=((2*j-1-x(id1))^2+(2*k-1-y(id1))^2)^0.5;
if d1<d
id=id1;
d=d1;
end
end
end
nnode(i,h+2,g+2)=id;
end
if h==0 & g==0
if ns(j+h,k+g)>1
z=0;
for t=1:ns(j+h,k+g)
id=nsnode(j+h,k+g,t);
if id~=i
z=z+1;
nrobot(i,z)=id;
end
end
end
end
end
end
end
for i=1:3
for j=1:3
d2(i,j)=0;
force(i,j)=0;
fx(i,j)=0;
fy(i,j)=0;
end
end
forcex=0;
forcey=0;
for i=1:m
t1=robot(i,1);
t2=robot(i,2);
if t1==1
j1=2;
j2=3;
if t2==1
k1=2;
k2=3;
elseif t2>1 & t2<8
k1=1;
k2=3;
else
k1=1;
k2=2;
end
elseif t1>1 & t1<8
j1=1;
j2=3;
if t2==1
k1=2;
k2=3;
elseif t2>1 & t2<8
k1=1;
k2=3;
else
k1=1;
k2=2;
end
else
j1=1;
j2=2;
if t2==1
k1=2;
k2=3;
elseif t2>1 & t2<8
k1=1;
k2=3;
else
k1=1;
k2=2;
end
end
for j=j1:j2
for k=k1:k2
if abs(j-2)==1 & abs(k-2)==1
w=0.4;
else
w=1;
end
id=nnode(i,j,k);
if id~=0
d2(j,k)=((x(i)-x(id))^2+(y(i)-y(id))^2)^0.5;
if d2(j,k)<1.8*r
m1=ns(t1+j-2,t2+k-2);
if m1<=3
force(j,k)=w*m1^0.5/d2(j,k)^2;
else
force(j,k)=w*3^0.5/d2(j,k)^2;
end
fx(j,k)=force(j,k)*(x(i)-x(id))/d2(j,k);
fy(j,k)=force(j,k)*(y(i)-y(id))/d2(j,k);
end
if d2(j,k)>1.8*r
m1=ns(t1+j-2,t2+k-2);
force(j,k)=w*(d2(j,k)-1.8*r)^2/m1^0.5;
fx(j,k)=-1*force(j,k)*(x(i)-x(id))/d2(j,k);
fy(j,k)=-1*force(j,k)*(y(i)-y(id))/d2(j,k);
end
end
if id==0
if j==2 & k==2
if ns(t1,t2)>1
id=nrobot(i,1);
d2(j,k)=((x(i)-x(id))^2+(y(i)-y(id))^2)^0.5;
force(j,k)=6/d2(j,k)^2;
fx(j,k)=force(j,k)*(x(i)-x(id))/d2(j,k);
fy(j,k)=force(j,k)*(y(i)-y(id))/d2(j,k);
else
fx(j,k)=0;
fy(j,k)=0;
end
else
d2(j,k)=((x(i)-2*(t1+j-2))^2+(y(i)-2*(t2+k-2))^2)^0.5;
force(j,k)=w*(d2(j,k)-1.8*r)^2;
fx(j,k)=-1*force(j,k)*(x(i)-2*(t1+j-2)-1)/d2(j,k);
fy(j,k)=-1*force(j,k)*(y(i)-2*(t2+k-2)-1)/d2(j,k);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -