目录
0 引言
变色龙算法(Chameleon Swarm Algorithm,CSA)是Malik Shehadeh Braik于2021年基于变色龙的觅食机制而提出的群体智能算法。该算法模拟了变色龙寻找食物的行为步骤,包括它们在树木、沼泽和沙漠动态寻找猎新闻,将眼睛旋转到近360◦的视觉范围来定位猎物,并利用它们粘稠的舌头高速发射来抓住猎物。算法具有寻优能力强等特点。
1 数学模型
CSA算法主要对变色龙搜索猎物、定位猎物及捕食等行为进行数学建模,具体模型如下:
1)初始化种群:CSA是一种基于种群的算法,它采用初始种群来启动优化过程。具体模型如下:
式中uj,lj为问题维度的边界,r为0到1的随机数。
2)寻找猎物:变色龙在沙漠和树木上寻找猎物,因此可以使用位置更新策略进行数学建模:
式中p1,p2为控制探索能力两个参数,G为局部最佳变色龙个体位置,P为全局最佳的变色龙个体位置,r1,r2,r3,ri为0到1的随机数,t和T分别表示当前的迭代次数和最大的迭代次数,γ、α和β是用于控制勘探和开发能力的三个常数值,Pp为变色龙感知猎物的概率。
2)定位猎物位置:变色龙有能力通过眼睛的旋转特征来识别猎物的位置,这使它们能够识别360度以上的猎物。故变色龙会根据定位猎物的位置来更新自身位置。其数学模型如下:
式中表示变色龙在旋转前的各维度的平均位置,yri表示变色龙在搜索空间中的旋转中心坐标,其数学模型如下:
式中yc为个体位置的中心坐标,m为旋转矩阵;R为各轴中旋转矩阵函数见(16)(17),Vz,Vz为坐标的两个向量,θ为变色龙眼睛旋转角。
3)捕食:接近猎物的变色龙被认为是最好的变色龙,故这只变色龙用舌头攻击猎物。用以下方程来模拟:
式中c1,c2控制G,P对弹舌速度影响的因子;p为控制开发的参数;a为弹舌的加速度
2 优化方式
前篇对长短期记忆神经网络(长短期记忆神经网络原理及Matlab代码复现-CSDN博客)原理讲解,从长短期记忆神经网络matlab代码运算过程中,可以看到LSTM受多个超参数影响(隐藏层节点、学习率、分批量、正则化等等)。因此结合上述GSA原理介绍,可以将长短期记忆神经网络的超参数作为变色龙种群位置,每一个种群位置对应长短期记忆神经网络的预测值,将这个预测值作为适应度更新全局和局部最佳位置,模拟变色龙进行随机搜索猎物,识别定位猎物和捕食猎物的行为,更新下一轮全局和局部最佳位置。
3 MATLAB代码
3.1 伪代码
3.2 CSA主函数代码
% 初始化种群
chameleonPositions=initialization(searchAgents,dim,ub,lb);% Generation of initial solutions
% 评估初始种群的适合度
fit=zeros(searchAgents,1);
for i=1:searchAgents
fit(i,1)=SYD(chameleonPositions(i,:),net);
net.trainParam.showWindow = 0;
end
% CSA 参数
fitness=fit; % 随机位置的初始适应度
[fmin0,index]=min(fit);
chameleonBestPosition = chameleonPositions; % 最佳位置初始化
gPosition = chameleonPositions(index,:); % 初始位置
v=0.1*chameleonBestPosition;% 初始速度
v0=0.0*v;
% CSA 的主要参数
rho=1;%管理开发的正数
p1=2;
p2=2;
c1=2;
c2=1.80;
gamma=2; %
alpha = 4;%
beta=3;%控制勘探和开发能力的三个常量值
Pp = 0.1;% 变色龙感知猎物的概率
for t=1:iteMax
a = 2590*(1-exp(-log(t))); %表示变色龙舌头伸出的速度
omega=(1-(t/iteMax))^(rho*sqrt(t/iteMax)) ; %Eq(19)惯性权重
p1 = 2* exp(-2*(t/iteMax)^2); %p1,p2控制探索能力的两个正数
p2 = 2/(1+exp((-t+iteMax/2)/100)) ;
mu= gamma*exp(-(alpha*t/iteMax)^beta) ;%Eq(6)随着迭代次数的增加而减少的参数
ch=ceil(searchAgents*rand(1,searchAgents));
% 觅食过程的运动
for i=1:searchAgents
if rand>=Pp
chameleonPositions(i,:)= chameleonPositions(i,:)+ p1*(chameleonBestPosition(ch(i),:)-chameleonPositions(i,:))*rand()+...
+ p2*(gPosition -chameleonPositions(i,:))*rand();% Eq(3)
else
for j=1:dim
chameleonPositions(i,j)=gPosition(j)+mu*((ub(j)-lb(j))*rand+lb(j))*sign(rand-0.50) ;% Eq(3)
end
end
end
%(开发)
% 双向旋转 180 度或单向旋转180度(rotation函数来源作者,可不考虑此活动加注释)
[chameleonPositions] = rotation(chameleonPositions, searchAgents, dim);
% 变色龙速度更新并寻找食物来源
for i=1:searchAgents
v(i,:)= omega*v(i,:)+ p1*(chameleonBestPosition(i,:)-chameleonPositions(i,:))*rand +....
+ p2*(gPosition-chameleonPositions(i,:))*rand; %Eq (18)
chameleonPositions(i,:)=chameleonPositions(i,:)+(v(i,:).^2 - v0(i,:).^2)/(2*a);%Eq(20)
end
v0=v;
% 边界检查
for i=1:searchAgents
if chameleonPositions(i,:)<lb
chameleonPositions(i,:)=lb;
elseif chameleonPositions(i,:)>ub
chameleonPositions(i,:)=ub;
end
end
% 变色龙位置迁移(随机化)
for i=1:searchAgents
ub_=sign(chameleonPositions(i,:)-ub)>0;
lb_=sign(chameleonPositions(i,:)-lb)<0;
chameleonPositions(i,:)=(chameleonPositions(i,:).*(~xor(lb_,ub_)))+ub.*ub_+lb.*lb_;
fit(i,1)=SYD(chameleonPositions(i,:),net);
net.trainParam.showWindow = 0;
if fit(i)<fitness(i)
chameleonBestPosition(i,:) = chameleonPositions(i,:);
fitness(i)=fit(i);
end
end
[fmin,index]=min(fitness); % 寻找最佳位置
if fmin < fmin0
gPosition = chameleonBestPosition(index,:);
fmin0 = fmin;
end
cg_curve(t)=fmin0;
end
ngPosition=find(fitness== min(fitness));
g_best=chameleonBestPosition(ngPosition(1),:);
fmin0 =SYD(g_best,net);
net.trainParam.showWindow = 0;
3.3 CSA-LSTM
时间序列模型:(变色龙算法优化长短期记忆神经网络-CSDN博客)