优化算法飞蛾优化算法 (MFO)含Matlab源码 1081期
Posted 紫极神光(Q1564658423)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优化算法飞蛾优化算法 (MFO)含Matlab源码 1081期相关的知识,希望对你有一定的参考价值。
一、简介
飞饿扑火优 化 算 法 ( Moth-flame optimization algorithm,MFO) 是Seyedali Mirjalili等于2015年提出的一种新型智能优化算法。该算法具有并行优化能力强,全局性优且不易落入局部极值的性能特征,逐渐引起了学术界和工程界的关注。
1 算法原理
飞蛾在夜间飞行时采用横向定位的特殊导航机制。在这种机制中,飞蛾通过维持自身相对月亮的角度固定进行飞行,由于月亮距离飞蛾非常遥远,飞蛾利用这种近似的平行光可以保持直线飞行。虽然这种导航机制对飞蛾非常有效,但实际中存在许多人工或自然点光源,这种光源与月亮相比距离飞蛾非常近,当飞蛾依然与光源保持固定的角度飞行时,就会导致导航失效并且产生致命的螺旋式飞行路径。
在 MFO 算法中,假设飞蛾是求解问题的候选解,待求变量是飞蛾在空间的位置。因此,通过改变其自身的位置向量,飞蛾可以飞行在一维、二维、三维、甚至更高维度的空间。由于 MFO 算法本质上是一种群体智能优化算法,所以飞蛾种群在矩阵中可以表示如下:
图1.对数螺旋以及火焰周围的空间
式(6)模拟了飞蛾螺旋飞行的路径,可以看出,飞蛾更新的下一个位置由其围绕的火焰确定。如 图 1 所示,螺旋函数中系数 t tt 表示飞蛾下一个位置与火焰接近的距离(t = − 1 t=-1t=−1 表示与火焰最近的位置,而 t = 1 t=1t=1 表示最远的位置)。螺旋方程表明飞蛾可以环绕在火焰的周围而不仅仅是在它们之间的空间飞行,从而保障了算法的全局搜索能力与局部开发能力。图2 为飞蛾围绕一个火焰时位置更新模型。当一只飞蛾(蓝色水平线)围绕一个火焰(绿色水平线)飞行时,若更新后飞蛾位置(黑色水平线)的适应度值优于当代所对应的火焰,则其更新后的位置将被选择为下一代火焰的位置(例如标号 2 所示),因此该飞蛾具有局部开发能力。采用该模型时具有以下特征:
1)通过修改参数 t tt,一只飞蛾可以收敛到火焰的任意的邻域范围内。
2)t tt 越小,飞蛾距离火焰越近。
3)随着飞蛾越来越接近火焰,其在火焰周围更新的频率越来越快。
图2.一只飞蛾根据对应的火焰利用对数螺线可以达到的可能位置
上述的火焰位置更新机制能够保证飞蛾在火焰周围的局部开发能力。为了提高找到更优解的概率,将当前找到的最优解作为下一代火焰的位置。因此,火焰位置矩阵 F FF 通常包含了当前找到的最优解。在优化的过程中,每一只飞蛾根据矩阵 F FF 更新自身的位置。MFO 算法中存在的路径系数 t tt 为[ r , 1 ] [r,1][r,1]内的随机数,变量 r 在优化迭代过程中在[-1, -2]按迭代次数线性减少。通过这种处理,随着迭代过程的进行,飞蛾将更加精确地趋近于其对应序列中的火焰。每次迭代后,根据适应度值将火焰位置进行重新排序得到更新后的火焰序列如图 3 所示。在下一代中,飞蛾根据与他们所对应序列中的火焰更新自身的位置。
2 算法流程
1)MFO 算法初始化,设置输入最优潮流控制变量维度 d,飞蛾种群搜索规模 n,最大迭代次数 T以及对数螺旋形状常数 b 等参数。
2)待求变量初始化,在搜索空间中随机生成飞蛾位置,并评估每只飞蛾对应的适应度值。
3)将飞蛾空间位置以适应度值递增的顺序排序后赋值给火焰,作为第一代中火焰的空间位置。
4)采用式(5)更新当前代飞蛾的位置。
5)将更新后的飞蛾位置与火焰位置的适应度值重新排序,选取适应度值更优的空间位置更新为下一代火焰的位置。
6)以式(8)自适应机制减少火焰的数量。
7)返回步骤 6)进入下一代,直至迭代次数满足算法要求。
10)输出并显示优化结果,程序结束。
二、源代码
clear all
clc
SearchAgents_no=30;
Function_name='F1';
Max_iteration=1000;
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
[Best_score,Best_pos,cg_curve]=MFO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
figure('Position',[284 214 660 290])
subplot(1,2,1);
func_plot(Function_name);
title('Test function')
xlabel('x_1');
ylabel('x_2');
zlabel([Function_name,'(x_1,x_2)'])
function [lb,ub,dim,fobj] = Get_Functions_details(F)
switch F
case 'F1'
fobj=@F1;
lb=-100;
ub=100;
dim=30;
case 'F2'
fobj=@F2;
lb=-100;
ub=100;
dim=30;
case 'F3'
fobj=@F3;
lb=-100;
ub=100;
dim=30;
case 'F4'
fobj=@F4;
lb=-100;
ub=100;
dim=30;
case 'F5'
fobj=@F5;
lb=-30;
ub=30;
dim=30;
case 'F6'
fobj=@F6;
lb=-100;
ub=100;
dim=30;
case 'F7'
fobj=@F7;
lb=-1.28;
ub=1.28;
dim=30;
case 'F8'
fobj=@F8;
lb=-500;
ub=500;
dim=30;
case 'F9'
fobj=@F9;
lb=-5.12;
ub=5.12;
dim=30;
case 'F10'
fobj=@F10;
lb=-32;
ub=32;
dim=30;
case 'F11'
fobj=@F11;
lb=-600;
ub=600;
dim=30;
case 'F12'
fobj=@F12;
lb=-50;
ub=50;
dim=30;
case 'F13'
fobj=@F13;
lb=-50;
ub=50;
dim=30;
case 'F14'
fobj=@F14;
lb=-65.536;
ub=65.536;
dim=2;
case 'F15'
fobj=@F15;
lb=-5;
ub=5;
dim=4;
case 'F16'
fobj=@F16;
lb=-5;
ub=5;
dim=2;
case 'F17'
fobj=@F17;
lb=[-5,0];
ub=[10,15];
dim=2;
case 'F18'
fobj=@F18;
lb=-2;
ub=2;
dim=2;
case 'F19'
fobj=@F19;
lb=0;
ub=1;
dim=3;
case 'F20'
fobj=@F20;
lb=0;
ub=1;
dim=6;
case 'F21'
fobj=@F21;
lb=0;
ub=10;
dim=4;
case 'F22'
fobj=@F22;
lb=0;
ub=10;
dim=4;
case 'F23'
fobj=@F23;
lb=0;
ub=10;
dim=4;
end
end
function o = F1(x)
o = sum(x.^2);
end
function o = F2(x)
o=sum(abs(x))+prod(abs(x));
end
三、运行结果
四、备注
版本:2014a
以上是关于优化算法飞蛾优化算法 (MFO)含Matlab源码 1081期的主要内容,如果未能解决你的问题,请参考以下文章
多目标优化求解基于matlab飞蛾扑火算法 (NSMFO)求解多目标优化问题 含Matlab源码 2312期