果蝇优化算法_Fruit Fly Optimization
1. 果蝇优化算法背景
在夏天,果蝇是一种随处可见的昆虫。果蝇在嗅觉和视觉特别突出。腐烂的食物发出一种刺鼻的味道,温度越高这种气味的扩散速度较快,果蝇对这种味道非常敏感。腐烂的味道和食物的位置有关。一般而言,食物越近,味道越浓;反之,味道越淡。而果蝇一般都是从味道淡的地方,飞往味道浓的地方,即食物所在的方向。当它们在食物附近的时候,可以利用视觉寻找食物。基于果蝇寻找食物的行为,2011年Wen-Tsao Pan提出了果蝇优化算法(Fruit Fly Optimization)。
2. 果蝇优化算法的数学模型
2.1 果蝇优化算法的数学模型假设
果蝇搜索食物分为两个阶段:
(1) 嗅觉阶段
这一阶段,果蝇利用嗅觉感知空气所含的味道,判断出食物的味道,并根据食物的味道浓度接近食物,这属于全局勘探过程。
(2) 视觉阶段
在果蝇到达食物位置附近时,果蝇开始利用视觉准确找到食物的位置,这个过程属于局部开发过程。
2.2 果蝇优化算法
a. 多维果蝇优化算法
\[y = x_1^2+x_2^2+x_3^3+x_4^2+x_5^2
\]
首先,初始化5群果蝇群体,分派给这5个变量,每个群体中有10只果蝇,随机初始化果蝇的群体位置区间为\([-100,100]\),果蝇搜寻食物的随机飞行方向与距离区间为\([-1,1]\).
2.3 Matlab代码
% -------------------------------------------------------------------------
% 名 称: 果蝇优化算法
% 作 者: 潘文超
% 代 码: 编码雪人
% 时 间: 2021-06-05
% 备 注: 首先, 每个变量视为一个种群, 种群规模自己设定.
% -------------------------------------------------------------------------
%% 清空运行环境
clc
clear
%% 定义目标函数
fobj = @ Sphere;
%% 参数定义
Max_iter = 1000; % 最大迭代次数
sizePop = 10; % 种群规模
dim = 5; % 维数
ub = 100; % 变量的上界
lb = -100; % 变量的下界
costScore = zeros(Max_iter, 1);
%% 初始化种群
X = zeros(sizePop, dim);
Y = zeros(sizePop, dim);
dist = zeros(sizePop, dim);
S = zeros(sizePop, dim);
Fitness = zeros(sizePop, 1);
for p=1:sizePop
% 初始化每个果蝇群体中个体的位置
X(p, :) = lb + (ub - lb).*rand(1, dim);
Y(p, :) = lb + (ub - lb).*rand(1, dim);
% 计算每个果蝇群体中个体的距离
dist(p, :) = sqrt(X(p, :).^2 + Y(p, :).^2);
% 果蝇个体中的味道浓度
S(p, :) = 1./dist(p, :);
% 计算适应度值
Fitness(p, :) = fobj(S(p, :));
end
%% 找出果蝇群体中的味道浓度最高的果蝇
[bestSmell,loc] = min(Fitness);
new_X = X(loc, :); % The X axis of min fitness
new_Y = Y(loc, :); % The Y axis of min fitness
bestScore = bestSmell;
bestSlove = S(loc, :);
%% 主函数
for it=1:Max_iter
for p=1:sizePop
% 嗅觉搜索
X(p, :) = new_X + 2.*rand(1, dim) -1;
Y(p, :) = new_Y + 2.*rand(1, dim) -1;
dist(p, :) = sqrt(X(p, :).^2 + Y(p, :).^2);
S(p, :) = 1./dist(p, :);
Fitness(p, :) = fobj(S(p, :));
end
[bestSmell, loc] = min(Fitness);
% 视觉搜索
if bestSmell < bestScore
new_X = X(loc, :);
new_Y = Y(loc, :);
bestScore = bestSmell;
end
costScore(it) = bestScore;
% 输出
disp(['----------', num2str(it), '------------']);
disp(bestSmell);
end
%% 可视化
figure
axis tight
semilogy(costScore, 'r-')
目标函数
function y = Sphere(x)
y = sum(x.^2);
end
代码如有疑问,请留言指正。