果蝇优化算法_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

代码如有疑问,请留言指正。

posted @ 2021-06-05 17:06  编码雪人  阅读(1365)  评论(0编辑  收藏  举报