目录
0 引言
共生生物搜索算法(Symbiotic Organisms Search,SOS)是由学者Cheng等人于2013基于生态系统生物之间社会行为提出元启发式智能算法。该算法模拟了生物体在生态系统中互惠共生、共栖共生及寄生的社会行为,以此平衡算法的全局搜索和局部开发性能。
1 数学模型
SOS算法的数学建模对生物体之间的互惠共生、竞争关系及寄生关系进行模型构建,具体数学模型如下:
1)互惠共生:在对算法初始化随机生成种群后,互惠共生的是自然界中一个常见例子,例如是蜜蜂和花之间的关系,二者都能从中获利。在SOS算法中,仍以采用俩个X个体进行模拟该算法,具体模型如下:
式中X(*)为第*个生物个体,BF1和BF2的是趋势因子,即互惠共生趋势于最佳个体和互惠个体的趋势因子。
2)共栖阶段:共栖是模拟生物体物体依附共生关系,例如雷摩鱼依附于鲨鱼,吃剩下的食物,因此得到了好处。鲨鱼不受雷摩鱼活动的影响。在SOS算法中从生态系统中随机选择一个生物体Xj与Xi相互作用,来模拟共栖关系。
3)寄生阶段:生态环境中寄生例子例如疟原虫寄生虫,当寄生虫在人体内繁殖繁殖时,它的人类宿主患有疟疾,并可能因此死亡。在SOS中,生物体Xi通过创造一种名为“寄生虫”,利用随机向量对自身进行复制和修改, 生成变异向量,对比二者之间适应度函数,来模拟寄生虫和寄生个体优劣势情况, 其表达式为:
式中pick为随机选取的寄生向量,lb,ub为问题维度边界。
2 优化方式
前篇对长短期记忆神经网络(长短期记忆神经网络原理及Matlab代码复现-CSDN博客)原理讲解,从长短期记忆神经网络matlab代码运算过程中,可以看到LSTM受多个超参数影响(隐藏层节点、学习率、分批量、正则化等等)。因此结合上述SOS原理介绍,可以将长短期记忆神经网络权值和阈值作为生态物体个体位置,每一个物体位置对应长短期记忆神经网络的预测值,将这个预测值作为适应度来模拟生态系统中互惠阶段、共栖阶段及寄生阶段,进一步更新更优Xbest个体。
3 MATLAB代码
3.1 伪代码
3.2 SOS主函数代码
while FE<maxFE
for i=1:ecosize
% 更新最佳s生物体
[bestFitness,idx]=min(fitness);
bestOrganism=eco(idx,:);
% 互惠阶段
% 随机选择生物i之外的生物j
j=i;
while i==j
seed=randperm(ecosize);
j=seed(1);
end
mutualVector=mean([eco(i,:);eco(j,:)]);%Eq(3)
BF1=round(1+rand); %随机确定为 1 或 2
BF2=round(1+rand); %
% 互惠阶段后位置
ecoNew1=eco(i,:)+rand(1,n).*(bestOrganism-BF1.*mutualVector); %Eq(1)
ecoNew2=eco(j,:)+rand(1,n).*(bestOrganism-BF2.*mutualVector); %Eq(2)
ecoNew1=bound(ecoNew1,ub,lb);
ecoNew2=bound(ecoNew2,ub,lb);
fitnessNew1=SYD(ecoNew1,net);
net.trainParam.showWindow = 0;
fitnessNew2=SYD(ecoNew2,net);
net.trainParam.showWindow = 0;
if fitnessNew1<fitness(i)
fitness(i)=fitnessNew1;
eco(i,:)=ecoNew1;
end
if fitnessNew2<fitness(j)
fitness(j)=fitnessNew2;
eco(j,:)=ecoNew2;
end
% 共生阶段
% 随机选择生物 i 之外的生物j
j=i;
while i==j
seed=randperm(ecosize);
j=seed(1);
end
ecoNew1=eco(i,:)+(rand(1,n)*2-1).*(bestOrganism-eco(j,:));%Eq(4)
ecoNew1=bound(ecoNew1,ub,lb);
fitnessNew1=SYD(ecoNew1,net);
net.trainParam.showWindow = 0;
if fitnessNew1<fitness(i)
fitness(i)=fitnessNew1;
eco(i,:)=ecoNew1;
end
% 寄生阶段
j=i;
while i==j
seed=randperm(ecosize);
j=seed(1);
end
parasiteVector=eco(i,:);
seed=randperm(n);
pick=seed(1:ceil(rand*n));
parasiteVector(:,pick)=rand(1,length(pick)).*(ub(pick)-lb(pick))+lb(pick);
fitnessParasite=SYD(parasiteVector,net);
net.trainParam.showWindow = 0;
if fitnessParasite < fitness(j)
fitness(j)=fitnessParasite;
eco(j,:)=parasiteVector;
end
end
FE=FE+1;
Convergence_curve(FE) = bestFitness;
end
3.3 SOS-LSTM
时间序列模型的代码:(
共生生物搜索算法优化长短期记忆神经网络-CSDN博客)