本节主要介绍如何利用蜉蝣优化算法对函数进行寻优,主要包括寻优函数问题描述、适应度函数设计、主函数设计几个部分。
求解一组 x 1 , x 2 ,使得下面函数的值最小,即求解函数的极小值。
式中, x 1 与 x 2 的取值范围分别为[−10,10],[−10,10]。
待求解函数的搜索空间是怎样的呢?为了直观、形象、生动地展现待求解函数的搜索空间,可以使用MATLAB绘图的方式进行查看,以 x 1 为 X 轴, x 2 为 Y 轴, f ( x 1 , x 2 )为 Z 轴,绘制该待求解函数的搜索空间,代码如下,效果如图1.4所示。
图1.4 程序运行结果
在该问题中,变量范围的约束条件如下:
-10≤ x 1 ≤10
-10≤ x 2 ≤10
可以通过设置蜉蝣个体的维度和边界条件进行设置,即设置蜉蝣个体的维度 dim 为2,蜉蝣个体上边界 ub =[10,10],蜉蝣个体下边界 lb =[-10,-10]。
根据问题设定适应度函数fun.m如下:
%% 适应度函数 function fitness = fun(x) %x为输入一个个体,维度为[1,dim] %fitness为输出的适应度值 fitness = x(1)^2 + x(2)^2; end
设置蜉蝣优化算法的参数如下。
蜉蝣雌性雄性种群数量 pop 为50,最大迭代次数 maxIter 为100,蜉蝣个体的维度 dim 为2,蜉蝣个体上边界 ub =[10,10],蜉蝣个体下边界 lb =[-10,-10]。使用蜉蝣优化算法求解待求解函数极值问题的主函数main.m如下:
%% 蜉蝣优化算法求解x1^2 + x2^2的最小值 clc;clear all;close all; %参数设定 pop = 50;%种群数量 dim = 2;%变量维度 ub = [10,10];%个体上边界信息 lb = [-10,-10];%个体下边界信息 maxIter = 100;%最大迭代次数 fobj = @(x) fun(x);%设置适应度函数为fun(x) %蜉蝣优化算法求解问题 [Best_Pos,Best_fitness,IterCurve] = MOA(pop,dim,ub,lb,fobj,maxIter); %绘制迭代曲线 figure plot(IterCurve,'r-','linewidth',1.5); grid on;%网格开 title('蜉蝣优化算法迭代曲线') xlabel('迭代次数') ylabel('适应度') disp(['求解得到的x1,x2为',num2str(Best_Pos(1)),' ',num2str(Best_Pos(2))]); disp(['最优解对应的函数值为:',num2str(Best_fitness)]);
程序运行得到的蜉蝣优化算法迭代曲线如图1.5所示。
运行结果如下:
求解得到的x1,x2为-3.2187e-05 -0.00030331 最优解对应的函数值为:9.3033e-08
图1.5 程序运行结果
从蜉蝣优化算法寻优的结果来看,最终的求解值为(-3.2187e-05, -0.00030331),十分接近理论最优值(0,0),表明蜉蝣优化算法具有较好的寻优能力。