一、算法流程
旗鱼优化算法的原理
SFO 算法是近年来被提出一种群智能优化算法,它分为旗鱼和沙丁鱼两个种群,其中,旗鱼被认为是候选解,问题的变量是旗鱼在搜索空间中的位置,沙丁鱼作为食物用来增加算法的随机性,旗鱼可以代替取代那些位置更好的沙丁鱼。可以将 SFO 算法分为以下五个步骤:
(1)初始化种群。在可行域内随机生成旗鱼种群Xsf 和沙丁鱼种群Xs,每个种群的位置定义为D 维,当前迭代次数为t,最大迭代次数为MaxIt。
(2)旗鱼群位置更新。旗鱼群在搜索空间内不断更新自己的位置,其位置更新公式如式所示:
new_sF = XlitesF一入* (rand(0.1) * (tes+inured$)一xoia sF)
式中:xetitesF是每次一迭代中精英旗鱼的位置,xinjureds是每次迭代中受伤的沙丁鱼的最佳位置,rand用啦产生0到1之间的随机数,xoid se是旗鱼当前位置,a;是一个系数,通过公式计算:
= 2* rand(0.1) +PD -PD
式中:PD是猎物密度,显示了每次迭代时的猎物数量。由于旗鱼群捕猎时猎物数量会减少,PD参数是更新旗鱼群位置的重要参数,通过公式(2-3)计算:
PD=1一(Nsp+Ns'
式中:Nss和Ns分别为算法每个周期中的旗鱼数量和沙丁鱼数量。
(3)沙丁鱼群位置更新。沙丁鱼群在搜索空间内对于旗鱼的攻击拥有逃逸的行为能力,其位置更新公式如公式
new s =r + (etitesF 一xolas + AP)
式中:xilitess是每次一迭代中精英旗鱼的位置,xoas是当前沙丁鱼的位置,r是0到1之间的随机数,AP表示旗鱼在每次迭代中的攻击能力,通过公式计算:
AP =A*(1-(2* t* E))
式中:t是当前迭代次数,8是一个系数。如果旗鱼的攻击力低于0.5,将对沙丁鱼进行部分更新
(4)组合种群。在狩猎的最后阶段,受伤的沙丁鱼将被旗鱼捕获。在该算法中,假设当沙丁鱼比相应的旗鱼位置更好时,旗鱼将会取代其位置,
x=xiff(S)<f(SF;)
式中:x表示当前迭代沙丁鱼的位置,x表示当前迭代旗鱼的位置。其中位置被旗鱼群替代的沙丁鱼群将被移除沙丁鱼种群。
在每次迭代的最后,重新计算旗鱼和沙丁鱼种群的局部最优解,并对所有个体的代价函数值从小到大进行排序,选出全局最优解。若此时满足终止条件,则输出最佳位置及其对应的最优值,否则继续进行迭代。
二、代码与仿真
function coeff = myLagrangeInterp(x,y)
% lagrange 插值法
% 返回格式:coeff 为 (1,n+1) 大小的向量,分别表示从常数项到最高次项的系数
[~,n] = size(x);
n = n-1;
coeff = zeros(1,n+1);
l = zeros(n+1,n+1); % 基函数
for i = 1:n+1
l(i,1) = 1; prod = 1;
for j = 1:n+1
if (i==j)
continue
end
l(i,:) = [0, l(i, 1:end-1)] - x(j)*l(i,:);
prod = prod*(x(i)-x(j));
end
coeff = coeff + y(i)*l(i,:)/prod;
end
end
11 changes: 11 additions & 0 deletions11
practice-app/src/approx/myLagrangeUniformApprox.m
@@ -0,0 +1,11 @@
function coeff = myLagrangeUniformApprox(f)
n = 4;
% Tchebychev 多项式零点
x = cos((2*(1:n)-1)/2/n*pi);
coeff = myLagrangeInterp(x, f(x));
end
下面是算法的一般流程:
流程图
仿真结果
仿真结果
算法结果