果蠅優化算法_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

代碼如有疑問,請留言指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM