一、果蝇优化算法
1、算法介绍
请参考这里。
2、基于果蝇算法的WSN节点部署
果蝇算法具体实现无线传感器网络的节点部署的步骤如下所示:
Step 1. 初始化果蝇算法的参数,初始化 WSN 的相关参数;
Step 2. 赋予每个果蝇个体利用嗅觉搜寻食物的随机方向和距离:
X
(
i
,
:
)
=
X
_
a
x
i
s
+
2
∗
s
∗
r
a
n
d
(
1
,
d
)
−
s
(1)
X(i,:)=X\_axis+2*s*rand(1,d)-s\tag{1}
X(i,:)=X_axis+2∗s∗rand(1,d)−s(1)
Y
(
i
,
:
)
=
Y
_
a
x
i
s
+
2
∗
s
∗
r
a
n
d
(
1
,
d
)
−
s
(2)
Y(i,:)=Y\_axis+2*s*rand(1,d)-s\tag{2}
Y(i,:)=Y_axis+2∗s∗rand(1,d)−s(2)其中,
i
i
i代表第
i
i
i个果蝇个体,
d
d
d代表传感器节点的数目,
s
s
s代表搜索步长;
Step 3. 计算每个果蝇个体的味道浓度判定值,即其覆盖率:
S
m
e
l
l
(
i
)
=
c
o
m
p
u
t
e
c
o
v
e
r
(
X
(
i
,
:
)
,
Y
(
i
,
:
)
,
⋯
)
(3)
Smell(i) =computecover(X(i,:),Y(i,:),\cdots)\tag{3}
Smell(i)=computecover(X(i,:),Y(i,:),⋯)(3)Step 4. 找出此果蝇群体中味道浓度最高的果蝇个体,保留其最佳的味道浓度值和对应的
X
_
a
x
i
s
,
Y
_
a
x
i
s
X\_axis,Y\_axis
X_axis,Y_axis坐标:
[
b
e
s
t
S
m
e
l
l
,
b
e
s
t
I
n
d
e
x
]
=
m
a
x
(
S
m
e
l
l
)
(4)
[bestSmell,bestIndex]=max(Smell)\tag{4}
[bestSmell,bestIndex]=max(Smell)(4)Step 5. 判断是否这次迭代的最好味道浓度值大于上次,如果是,那么果蝇群体利用视觉朝该位置飞去:
X
_
a
x
i
s
=
X
(
b
e
s
t
I
n
d
e
x
,
:
)
(5)
X\_axis=X(bestIndex,:)\tag{5}
X_axis=X(bestIndex,:)(5)
Y
_
a
x
i
s
=
Y
(
b
e
s
t
I
n
d
e
x
,
:
)
(6)
Y\_axis=Y(bestIndex,:)\tag{6}
Y_axis=Y(bestIndex,:)(6)否则执行步骤6.
Step 6. 进入迭代寻优,直到满足终止条件。
二、仿真分析
1、参数设置
FOA 实验部分参数设置如下:部署区域为 50 × 50 50×50 50×50,网格点设置为 0.4 × 0.4 0.4×0.4 0.4×0.4,搜索步长0.3,种群规模20,迭代次数为500,传感器感知半径 r s = 5 rs=5 rs=5,PSO和GSO的实验参数设置同文献[3]和文献[4]一样。
2、MATLAB程序实现
- 计算WSN覆盖率函数
function z = computeCover(x, y, L, R, data)
%% 适应度函数:WSN的覆盖率
% input:
% x 圆心横坐标
% y 圆心纵坐标
% L 区域边长
% R 通信半径
% data 离散粒度
% output:
% z 覆盖率
N = length(x); % 节点总个数
[m, n] = meshgrid(0:data:L); % 离散化区域内的点
[row, col] = size(m);
for i = 1:N
D = sqrt((m-x(i)).^2+(n-y(i)).^2); % 计算坐标点到圆心的距离
[m0, n0] = find(D <= R); % 检测出圆覆盖点的坐标
Ind = (m0-1).*col+n0; % 坐标与索引转化
M(Ind) = 1; % 改变覆盖状态
end
scale = sum(M(1:end))/(row*col); % 计算覆盖比例
z = scale;
- FOA主函数
%% 清空环境变量
clc;
clear;
%% 网络参数
L = 50; % 区域边长
n = 35; % 节点个数
rs = 5; % 感知半径
data = 0.4; % 离散粒度
%% FOA参数
maxgen = 500; % 迭代次数
sizepop = 20; % 种群规模
s = 0.3; % 步长
%% 随机初始化果蝇群体位置
X_axis = L*rand(1, n);
Y_axis = L*rand(1, n);
%% 个体和速度最大和最小值
for i = 1:sizepop
% 随机位置
X(i, :) = X_axis + 2*s*rand(1, n)-s;
Y(i, :) = Y_axis + 2*s*rand(1, n)-s;
% 味道浓度函数(覆盖率)
Smell(i) = computeCover(X(i, :), Y(i, :), L, rs, data);
end
% 找出此果蝇群体中味道浓度最高的果蝇(求极大值)
[bestSmell, bestindex]=max(Smell);
% 最佳气味浓度、果蝇位置、适应度最优位置
X_axis = X(bestindex, :);
Y_axis = Y(bestindex, :);
Smellbest = bestSmell;
%% 初始结果显示
gbest = [X_axis; Y_axis]';
disp('初始位置:' );
disp([num2str(gbest)]);
disp(['初始覆盖率:', num2str(Smellbest)]);
% 初始覆盖图
figure;
for i = 1:n
axis([0 L 0 L]); % 限制坐标范围
x = gbest(:, 1);
y = gbest(:, 2);
sita = 0:pi/100:2*pi; % 角度[0, 2*pi]
hold on;
p2 = fill(x(i)+rs*cos(sita), y(i)+rs*sin(sita), 'y');
end
p1 = plot(gbest(:, 1), gbest(:, 2), 'r*');
legend([p1, p2], {'WSN节点', '覆盖区域'});
title 'FOA-WSN初始结果';
%% 果蝇迭代寻优
for gen = 1:maxgen
% 粒子位置和速度更新
for i = 1:sizepop
X(i, :) = X_axis + 2*s*rand(1, n)-s;
Y(i, :) = Y_axis + 2*s*rand(1, n)-s;
% 边界处理
X(i, :) = max(X(i, :), 0);
X(i, :) = min(X(i, :), L);
Y(i, :) = max(Y(i, :), 0);
Y(i, :) = min(Y(i, :), L);
% 计算覆盖率
Smell(i) = computeCover(X(i, :), Y(i, :), L, rs, data);
end
% 根据气味浓度值寻找极值
[bestSmell, bestindex]=max(Smell);
% 保留最佳值位置
if bestSmell > Smellbest
X_axis = X(bestindex, :);
Y_axis = Y(bestindex, :);
Smellbest = bestSmell;
end
% 每代最优Smell值记录到yy数组中,并记录最优迭代坐标
yy(gen) = Smellbest;
Xbest(gen, :) = X_axis;
Ybest(gen, :) = Y_axis;
% 显示迭代信息
display(['FOA: At iteration ', num2str(gen), ' the best fitness is ', num2str(yy(gen))]);
end
%% 结果显示
gbest = [ Xbest(end, :); Ybest(end, :)]';
disp('最优位置:');
disp([num2str(gbest)]);
disp(['最优覆盖率:', num2str(yy(end))]);
%% 绘图
figure;
plot(yy, 'r', 'lineWidth', 2); % 画出迭代图
title('算法训练过程', 'fontsize', 12);
xlabel('迭代次数', 'fontsize', 12);
ylabel('覆盖率', 'fontsize', 12);
figure;
for i = 1:n
axis([0 L 0 L]); % 限制坐标范围
x = gbest(:, 1);
y = gbest(:, 2);
sita = 0:pi/100:2*pi; % 角度[0, 2*pi]
hold on;
p2 = fill(x(i)+rs*cos(sita), y(i)+rs*sin(sita), 'g');
end
p1 = plot(gbest(:, 1), gbest(:, 2), 'r*');
legend([p1, p2], {'WSN节点', '覆盖区域'});
title 'FOA-WSN最终结果';
- 结果分析
初始随机值和最终的最优解如下:
初始位置:
11.3992 42.9134
46.4846 21.4115
18.9674 21.3475
19.7325 5.92607
24.5759 8.33414
30.3007 39.8163
24.4309 19.7192
38.955 31.9414
5.89293 13.0946
4.86598 45.6089
17.8458 38.9107
45.8842 42.2636
29.6156 13.7195
39.3956 12.6461
21.9514 2.57533
11.4672 47.473
0.942948 19.4017
16.3267 25.3175
31.3105 49.1938
31.4587 42.2226
43.0972 40.9238
12.8064 11.2997
7.38445 10.7124
23.5245 0.0660435
6.54869 37.3028
25.832 41.3215
8.14725 46.5262
23.546 33.2224
45.1849 10.2908
11.5111 28.2609
31.5034 45.0351
33.488 15.9543
41.0271 48.5808
17.6613 7.93437
29.9125 11.2115
初始覆盖率:0.6746
最优位置:
10.5194 38.122
46.2522 20.5155
18.2447 20.096
15.3878 5.68425
22.7347 12.5966
33.9807 28.9422
27.7835 21.1212
44.3602 28.7919
4.249 14.1221
1.71559 42.2764
17.4226 35.3523
46.8187 36.6482
31.9846 13.1763
41.6468 13.1489
27.8534 5.41028
16.2994 45.4212
4.43401 23.3939
22.0547 27.7662
26.8426 47.8792
31.616 39.2224
39.3754 36.8049
11.9248 20.0657
5.62702 5.1783
21.7934 2.8847
4.32715 33.0404
23.3466 41.2151
8.12649 46.8282
27.4225 32.935
45.9546 5.64526
12.562 28.711
36.8622 46.476
37.1369 21.0672
45.5211 45.3852
12.7297 11.6139
36.6151 5.33876
最优覆盖率:0.94778
对应的覆盖图如图1、图2所示。
覆盖率变化如图3所示。
三、算法对比
将传感器节点数目设置为35,为克服实验的随机现象,更好的观察算法的性能,三种算法(FOA、PSO、改进GSO)都分别独立做了15次实验,它们的平均覆盖率、标准差以及最好、最差的覆盖率如表1所示。
然后,为了进一步更加形象化观察算法的改进性能,随机选取一组初始部署节点的数据利用三种算法对节点进行优化,图4是覆盖率进化曲线对比图。
由表1可知,本文提出的算法(FOA)的平均覆盖率、最好和最差覆盖率均高于PSO和改进GSO相对应的结果,且标准差较PSO和改进GSO小,说明结果更稳定;由图4可知,本文提出的算法在50次迭代的时候覆盖率就超过其他算法,然后在160次迭代的时候逐渐收敛。
因此,可以得出结论:本文提出的FOA算法相比较PSO、改进GSO而言收敛速度更快,有更高更稳定的覆盖率。
具体代码可访问:
链接:https://pan.baidu.com/s/1LkVPq2UNZMA_T_v4Nlsl5w
提取码:k4ta
四、参考文献
[1] 心升明月. 基于果蝇优化算法的函数寻优算法. CSDN博客.
[2] 张谦. 基于群智能算法的无线传感器网络覆盖优化研究[D]. 长沙: 湖南大学, 2015.
[3] Wen-Hwa Liao, Yucheng Kao, Ying-Shan Li. A sensor deployment approach using glowworm swarm optimization algorithm in wireless sensor networks[J]. Expert Systems with Applications, 2011, 38(10): 12180-12188.
[4] N. A. B. A. Aziz, A. W. Mohemmed, M. Y. Alias. A wireless sensor network coverage optimization algorithm based on particle swarm optimization and Voronoi diagram[C]. 2009 International Conference on Networking, Sensing and Control, 2009, 602-607.
[5] Wen-Tsao Pan. A new Fruit Fly Optimization Algorithm: Taking the financial distress model as an example[J]. Knowledge-Based Systems, 2012, 26: 69-74.