目录
0 引言
共生生物搜索算法(Symbiotic Organisms Search,SOS)是Min-Yuan Cheng于2014年基于生物直接共生现象的提出启发式搜索算法,该算法控制参数少,容易实现且稳定性好。
1 数学模型
SOS算法数学模型构建主要包括三种共生现象,分别为互利阶段,共栖阶段和寄生阶段。
1)互利阶段:对生物群进行简单随机初始化后,生物之间开始以下三个共生现象,首先是互利阶段,该阶段模拟生物群中参与者双方都能互利生活现象,例如蜜蜂和花之间的关系,其数学模型见下:
式中Xi为与生态系统先匹配的种群i的位置,Xj为与Xi相匹配的随机种群j的位置,Xbest为最佳的种群位置。BF1和BF2为受益因素。
2)共栖阶段:在自然生物中,共栖生物也存在较多,例如红斑鱼和鲨鱼之间的关系。红斑鱼依附于鲨鱼,吃剩下的食物,因此得到了好处。鲨鱼不受红斑鱼活动的影响,从这种关系中获得的好处很小,其数学模型见下式:
式中Xi和Xj为共栖阶段俩个生物位置,Xi为依附者,当其自身适应度高于Xj时,俩者关系互换。
3)寄生阶段:寄生的一个例子是疟原虫寄生虫,它在人类宿主之间传播。当寄生虫在人体内繁殖时,它的人类宿主患有疟疾,并可能因此死亡。在其他生物中也存在寄生关系,其数学模型见下式:
式中pick为变异体,ub,lb为问题维度边界
2 优化方式
前篇对支持向量机(支持向量机原理及matlab代码讲解(分类SVM和回归SVR)-CSDN博客)原理讲解,从支持向量机模型运算过程中,可以了解到模型高维映射核函数参数g和处罚因子c对模型预测结果影响最为重要。因此结合上述SOS原理介绍,可以将支持向量机参数c和g作为生物种群位置,每一个种群位置对应支持向量机的预测值,将这个预测值作为适应度进行上述生物种群之间共生现象,从而更新更优的个体位置。
3 Maltab代码
3.1 伪代码
3.2 SOS主函数代码
%%参数
%maxFE 最大迭代次数
%ecosize 种群大小
%fitness 适应度
%eco 种群位置
%bound 边界函数
%SYD 适应度函数
%
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-SVM
1)回归模型:私信
2)分类模型:分类模型:共生生物搜索算法优化支持向量机模型(SOS-SVM)
4 视频讲解
B站搜索:‘ 不想学习的陈成 ’