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
代碼如有疑問,請留言指正。