基于果蝇优化算法的函数寻优算法

一、理论基础

果蝇优化算法(Fruit Fly Optimization Algorithm, FOA)是基于果蝇觅食行为的仿生学原理而提出的一种新兴群体智能优化算法,最早由台湾华夏科技大学的潘文超教授于2011年提出来的。
果蝇优化算法(FOA)通过模拟果蝇利用敏锐的嗅觉视觉进行捕食的过程,FOA实现对解空间的群体迭代搜索。FOA原理易懂、操作简单、易于实现,具有较强的局部搜索能力。

二、算法步骤

1、启发

果蝇本身在感觉和感知方面优于其他物种,尤其是在嗅觉和视觉方面,如图1所示。
在这里插入图片描述

图1 果蝇的身体外观和群体迭代觅食

果蝇的嗅觉器官能发现空气中漂浮的各种气味;它甚至能闻到40公里外的食物。然后,当它接近食物位置,也可以用它灵敏的视觉找到食物和同伴聚集的位置,并朝那个方向飞行。

2、方向和距离

随机初始果蝇群体位置 I n i t X a x i s InitX_{axis} InitXaxis I n i t Y a x i s Init Y_{axis} InitYaxis以果蝇为研究对象,给出果蝇利用大气圈进行食物搜索的随机方向和距离 X i = X a x i s + R a n d o m V a l u e X_i=X_{axis}+RandomValue Xi=Xaxis+RandomValue Y i = Y a x i s + R a n d o m V a l u e Y_i=Y_{axis}+RandomValue Yi=Yaxis+RandomValue

3、气味浓度判断值

由于无法知道食物的位置,因此首先估计到源头的距离(dist),然后计算气味浓度判断值(s),该值是距离的倒数。 D i s t i = x 2 + y 2 Dist_i=\sqrt{x^2+y^2} Disti=x2+y2 S i = 1 / D i s t i S_i=1/Dist_i Si=1/Disti

4、适应度评估

气味浓度判断值代入气味浓度判断函数(或称为适应度函数),找出果蝇个体位置的气味浓度。 S m e l l i = F u n c t i o n ( S i ) Smell_i=Function(S_i) Smelli=Function(Si)

5、寻找最优个体

找出果蝇群中气味浓度最大的果蝇(寻找最优个体)。 [ 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 ) [bestSmell \quad bestIndex]=max(Smell) [bestSmellbestIndex]=max(Smell)

6、飞行

保持最佳的气味浓度值和 x , y x,y x,y坐标,此时果蝇群将利用视觉飞向该位置。 S m e l l b e s t = b e s t S m e l l Smellbest=bestSmell Smellbest=bestSmell X a x i s = X ( b e s t I n d e x ) X_{axis}=X(bestIndex) Xaxis=X(bestIndex) Y a x i s = Y ( b e s t I n d e x ) Y_{axis}=Y(bestIndex) Yaxis=Y(bestIndex)

7、迭代优化

进入迭代优化,重复执行步骤2~5然后判断气味浓度是否优于之前的迭代气味浓度,如果是,则执行步骤6。

三、案例背景

问题描述

本案例的寻优函数为 S c h a f f e r \boldsymbol {Schaffer} Schaffer函数,函数解析式如下: f ( x , y ) = 0.5 + c o s ( s i n ( ∣ x 2 − y 2 ∣ ) 2 − 0.5 1 + 0.001 ( x 2 + y 2 ) ) 2 f(x,y)=0.5+\frac{cos(sin(|x^2-y^2|)^2-0.5}{1+0.001(x^2+y^2))^2} f(x,y)=0.5+1+0.001(x2+y2))2cos(sin(x2y2)20.5函数图形如图2所示。
在这里插入图片描述

图2 Schaffer函数图形

四、MATLAB程序实现

1、清空环境变量

程序运行之前,清除工作空间Workspace中的变量及Command Window中的命令。具体程序如下:

%% 清空环境变量
clc;
clear;

2、初始化参数

在计算之前,需要对参数进行初始化。同时,为了加快程序的执行速度,对于程序中涉及的一些过程变量,需要预分配其存储容量。具体程序如下:

%% 随机初始化果蝇群体位置
X_axis = 10*rand(1, 2);
Y_axis = 10*rand(1, 2);
%% 设置参数
maxgen = 200;           % 迭代次数
sizepop = 20;           % 种群规模

3、寻找初始最优

%% 个体和速度最大和最小值
for i = 1:sizepop
    % 随机方向与距离
    X(i, :) = X_axis + 2*rand(1, 2)-1;
    Y(i, :) = Y_axis + 2*rand(1, 2)-1;
    % 距离和气味浓度
    D(i, :) = sqrt(X(i, :).^2+Y(i, :).^2);
    S(i, :) = 1./D(i, :);
    % 适应度函数Schaffer
    Smell(i) = 0.5+(cos(sin(abs(S(i, 1)^2-S(i, 2)^2))^2-0.5)/(1+0.001*(S(i, 1)^2+S(i, 2)^2))^2);
end
% 找出此果蝇群体中味道浓度最低的果蝇(求极小值)
[bestSmell bestindex]=min(Smell);
% 最佳气味浓度、果蝇位置、适应度最优位置
X_axis = X(bestindex, :);
Y_axis = Y(bestindex, :);
Smellbest = bestSmell;
FXbest = S(bestindex, 1);
FYbest = S(bestindex, 2);

4、迭代寻优

迭代寻优为整个算法的核心。代码如下:

%% 果蝇迭代寻优
for gen = 1:maxgen
    % 粒子位置和速度更新
    for i = 1:sizepop
        X(i, :) = X_axis + 2*rand(1, 2)-1;
        Y(i, :) = Y_axis + 2*rand(1, 2)-1;
        D(i, :) = sqrt(X(i, :).^2+Y(i, :).^2);
        S(i, :) = 1./D(i, :);
        % 适应度函数Schaffer
        Smell(i) = 0.5+(cos(sin(abs(S(i, 1)^2-S(i, 2)^2))^2-0.5)/(1+0.001*(S(i, 1)^2+S(i, 2)^2))^2);
    end
    % 根据气味浓度值寻找极值
    [bestSmell bestindex]=min(Smell);
    % 保留最佳值位置
    if bestSmell < Smellbest
        X_axis = X(bestindex, :);
        Y_axis = Y(bestindex, :);
        Smellbest = bestSmell;
        FXbest = S(bestindex, 1);
        FYbest = S(bestindex, 2);
    end
    % 每代最优Smell值记录到yy数组中,并记录最优迭代坐标
    yy(gen) = Smellbest;
    Xbest(gen, :) = X_axis;
    Ybest(gen, :) = Y_axis;
end

5、结果显示

为了更为直观地对结果进行观察和分析,将寻找到的最优自变量及其最优函数值显示在Command Window中。具体程序如下:

%% 结果显示
disp(['适应度函数最优位置:', num2str(FXbest), ',', num2str(FYbest)]);
disp(['适应度函数最优解:', num2str(yy(end))]);

由于各个果蝇的初始位置是随机生成的,因此每次运行的结果都会有所不同。某次运行的结果如下:

适应度函数最优位置:0.50068,42.8868
适应度函数最优解:0.61574

6、绘图

为了更为直观地对结果进行观察和分析,以图形的形式将结果显示出来,具体程序如下:

%% 绘制迭代味道浓度与果蝇飞行路径趋势图
figure(1);
plot(yy, 'r', 'linewidth', 2);
title('优化过程', 'fontsize', 12)
xlabel('迭代次数', 'fontsize', 12); ylabel('气味浓度(适应度值)', 'fontsize', 12);
figure(2);
gen = 1:maxgen;
plot(Xbest(:, 1), Ybest(:, 1), 'r.');             % 绘制果蝇群X_axis,Y_axis的变化
hold on;
plot(Xbest(:, 2), Ybest(:, 2), 'b.');
title('果蝇优化算法寻优路线', 'fontsize',14)
xlabel('X-axis', 'fontsize', 12); ylabel('Y-axis', 'fontsize', 12);

果蝇优化算法优化过程如图3所示。
在这里插入图片描述

图3 果蝇优化算法优化过程

果蝇优化算法寻优路线如图4所示。
在这里插入图片描述

图4 果蝇优化算法寻优路线

五、参考文献

[1] Wen-Tsao Pan. A new Fruit Fly Optimization Algorithm: Taking the financial distress model as an example[J]. Knowledge-Based Systems, 2012, 26(2): 69-74.

  • 10
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心️升明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值