完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1果蝇优化算法原理介绍
果蝇是一种广泛存在于温带和热带地区的昆虫,具有优于其他物种的嗅觉和视觉能力。 在寻找食物时,果蝇个体先利用自身嗅觉器官嗅到食物的气味,并向周围的果蝇发送气味信息,或者从周围的果蝇接收气味信息;之后果蝇利用其视觉器官,通过比较得出当前群体中收集到最好气味信息的果蝇位置,群体中的其他果蝇均飞向该位置,并继续展开搜索。 图 1展示了果蝇群体搜索食物的简要过程。 1.1步骤分析 根据果蝇群体觅食的行为特点,标准 FOA寻优 大致分为以下几个步骤。 Step 1:初始化。 设置种群规模(popsize),最大迭代次数(maxgen),果蝇群体位置范围(LR)和果蝇的单次飞行范围(FR)等相关参数值。 果蝇群体中每个个体的位置信息由其对应的(X; Y )二维坐标给出,其初始位置由下面的公式定义: Step 2:嗅觉搜索过程。 Step 2.1:当群体中的每一只果蝇利用其嗅觉搜索时,赋予它一个随机的飞行方向和距离。 果蝇个体 i 新的位置由下式给出: Step 2.2:因为食物味道的来源位置是未知的,因此先利用下式计算果蝇个体距离原点的距离DISTi: 然后通过下式计算其味道浓度判定值Si: Step 2.3:通过下式计算当前群体中每个果蝇个体的味道浓度值Smelli: fitness表示味道浓度判断函数,在利用FOA进行优化问题求解时,它是目标函数或适应度函数。 Step 2.4:选择当前群体中具有最佳味道浓度值的果蝇,记录其味道浓度值和相应位置 Step 3:视觉搜索过程。 保持最佳味道浓度值和对应果蝇位置信息,群体中的其他果蝇均利用视觉飞向此位置,即 Step 4:重复Step 2和Step 3,直到算法迭代次数达到maxgen. 由 FOA的计算步骤可知,标准 FOA采用基于种群的全局随机搜索策略,通过跟踪当前最优解的信息来指导种群的下一步搜索,使得种群能够以当前最优解为中心开展局部随机搜索,并朝着更优的方向搜索前进。 2果蝇优化算法程序设计 根据果蝇算法步骤,设计MATlab程序如下 %% FOA封装程序 clc; clear; for gen=1:30 %% 初始化参数 maxgen=100; %最大迭代次数 sizepop=50; dim=30; L=1; %% 初始化矩阵 X_best=zeros(maxgen,dim); Y_best=zeros(maxgen,dim); Smell_best=zeros(1,maxgen); %% 初始化果蝇坐标; X_axis=10*rand(1,dim); Y_axis=10*rand(1,dim); %% 生成果蝇群 [Si,X,Y]=gengrate_foa(X_axis,Y_axis,sizepop,dim,L); %% 寻找最优个体 [BestSmell,Index]=find_Sum_Square(Si); SmellBest=BestSmell; %SmellBest为全局最优 %% 取出最优个体的两个维度的X,Y坐标 X_axis=X(Index,:); Y_axis=Y(Index,:); for g=1:maxgen %% 生成果蝇群 [Si,X,Y]=gengrate_foa(X_axis,Y_axis,sizepop,dim,L); %% 寻找最优个体 [BestSmell,Index]=find_Sum_Square(Si); if BestSmell X_axis=X(Index,:); Y_axis=Y(Index,:); %更新极值 SmellBest=BestSmell; end Smell_best(g)=SmellBest; X_best(g,:)=X_axis; Y_best(g,:)=Y_axis; end S(gen)=SmellBest; end %% 输出最终值 SmellBest %% 绘制图像 figure(1) plot(Smell_best,‘b’); %绘制每一代最优浓度值 figure(2) hold on plot(X_best(:,1),Y_best(:,1),‘r.’);%绘制果蝇群X_axis,Y_axis的变化 plot(X_best(:,2),Y_best(:,2),‘b.’); plot(X_best(:,3),Y_best(:,3),‘k.’); figure(3) plot(X(:,1),Y(:,1),‘b.’);%绘制最后一代的果蝇群; mean(S) min(S) std(S) 将FOA果蝇群生成,和计算果蝇味道浓度值封装成函数,输入的是种群坐标,种群个数,维度和步长值,输出的是每个果蝇的坐标和果蝇的味道浓度判定值。 function [Si,X,Y]=gengrate_foa(X_axis,Y_axis,sizepop,dim,L) Di=zeros(sizepop,dim); Si=zeros(sizepop,dim); X_axis=repmat(X_axis,sizepop,1); %将种群坐标扩充; Y_axis=repmat(Y_axis,sizepop,1); X=X_axis+2*L*rand(sizepop,dim)-L;%求出每个果蝇的坐标矩阵; Y=Y_axis+2*L*rand(sizepop,dim)-L; Di1=X.^2; %求出X^2和Y^2; Di2=Y.^2; Di=Di1+Di2; %X^2+Y^2; Di=Di.^0.5; %开根号; Si=1./Di; %Si=1/Di; end 求果蝇味道浓度值,对每个测试函数都不同,此处用了SumSquare函数,这个函数的表达式是 其三维函数图像如下图 其函数编写如下,函数输入只需要果蝇个体的味道判定值,带入函数中解出最优的味道浓度值和其索引,就能对应着找到最优的果蝇个体了。 %% 果蝇浓度判定函数; %Function:Sum Square %表达式:f(x)=Sum(i*(Xi)^2); function [BestSmell,Index]=find_Sum_Square(Si) [si_m,si_n]=size(Si); sum_2=zeros(1,si_n); for d=1:si_n sum_2(d)=d; end Si_2=Si.^2; %所有元素平方; Smell=Si_2.*sum_2; Smell=sum(Smell,2); [BestSmell,Index]=min(Smell); end 对函数进行测试 试验设置独立运行30次,并记录每次的寻优结果,最后求一下30次寻优结果的均值,最小值和均方差。 对测试结果绘制图片,figure(1)绘制的是每次迭代的种群最优值,可以看到最优值一直在降低,最终趋向于收敛于0(函数最优值),这就说明果蝇群每一次迭代都在向最优值前进,一点点寻优。 figure(2)绘制的是果蝇群坐标随着迭代次数增长的变化,一点点在向外面扩散,这里设置的函数为30维,画图的话只画了其中3维,分别用红色,蓝色和黑色表示,每一维扩散的方向都不同。 figure(3)绘制的是最后一代果蝇群的坐标分布,这里只画了一维的坐标分布,可以看出是围绕着中心点向四周随机飞行的,因为这里设置步长为1,所以上下幅度为最大为2。 要是想测试其他寻优函数,可以根据我的测试函数模板进行编写,将Si作为变量X带入,求出最小的Y值就是最优果蝇了,下面在放上两个我已经编好的寻优函数,Ackley和Rastrigin。 %% 果蝇浓度判定函数; %Function:Rastrigin %表达式:f(x)=Sum[(Xi)^2-10cos(2pi*xi)+10]; function [BestSmell,Index]=find_Rastrigin(Si) [si_m,si_n]=size(Si); sum_2=zeros(si_m,1); %第一部分:平方和 Si_2=Si.^2; %所有元素平方; sum_1=sum(Si_2,2); %求各维度平方和; %第二部分:cos(2pi*Xi) for p=1:si_m for d=1:si_n sum_2(p)=sum_2(p)+10*cos(2*pi*Si(p,d)); end end Smell=sum_1-sum_2+10*si_n; [BestSmell,Index]=min(Smell); end %Function:Ackley %表达式: function [BestSmell,Index]=find_Ackley(Si) [si_m,si_n]=size(Si); sum_2=zeros(si_m,1); %第一部分:平方和 Si_2=Si.^2; %所有元素平方; sum_1=sum(Si_2,2); %求各维度平方和; sum_1=-0.2.*((sum_1/30).^0.5); sum_1=-20.*(exp(sum_1)); %第二部分:cos(2pi*Xi) for p=1:si_m %cos(Xi)/sqrt(i)部分 for d=1:si_n sum_2(p)=sum_2(p)+cos(2*pi*Si(p,d)); end sum_2(p)=sum_2(p)/30; sum_2(p)=-1*exp(sum_2(p)); end Smell=sum_1+sum_2+20+exp(1); [BestSmell,Index]=min(Smell); end 代码已经经过测试了,可以直接拷贝到m文件中,保存在相同路径运行,注意函数的名称要和文件名称相同。主函数里面的参数sizepop,dim以及L,maxgen都是可以随意设置的,可以设置观测不同结果。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1874 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1658 浏览 1 评论
1143 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
759 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1720 浏览 2 评论
1963浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
788浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
610浏览 3评论
628浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
590浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-11 07:32 , Processed in 1.020506 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号