目录
猫群优化算法(Cat Swarm Optimization, CSO)是一种模仿猫科动物(特别是家猫)的行为习性而发展起来的进化优化算法,由Yongchuang Liu和Qingfu Zhang在2007年首次提出。在猫群算法中,猫即待求优化问题的可行解。猫群算法将猫的行为分为两种模式,一种就是猫在懒散、环顾四周状态时的模式称之为搜寻模式;另一种是在跟踪动态目标时的状态称之为跟踪模式。猫群算法中,一部分猫执行搜寻模式,剩下的则执行跟踪模式,两种模式通过结合率 MR(Mixture Ratio)进行交互,MR 表示执行跟踪模式下的猫的数量在整个猫群中所占的比例,在程序中 MR应为一个较小的值。利用猫群算法解决优化问题,首先需要确定参与优化计算的个体数,即猫的数量。每只猫的属性(包括由M维组成的自身位置)、每一维的速度、对基准函数的适应值及表示猫是处于搜寻模式或者跟踪模式的标识值。当猫进行完搜寻模式和跟踪模式后,根据适应度函数计算它们的适应度并保留当前群体中最好的解。之后再根据结合率随机地将猫群分为搜寻部分和跟踪部分的猫,以此方法进行迭代计算直到达到预设的迭代次数。
1.猫群优化算法基本原理
追踪猎物行为(Prey Hunting Behavior, PHB) 猫群中的每只猫(个体)都有自己的位置矢量Xi(t),在搜索空间中表示为Xi(t)∈Rn,其中t 代表当前迭代次数,n 是问题的维度。在每一轮迭代中,猫i 会追踪一个虚拟猎物Vi(t),其位置更新如下:
其中Pbesti 是猫 i 至今找到的个人最优解,α 和β 分别是加速因子和扰乱因子,rand(0,1) 是在区间[0,1] 内的随机数。
集群活动行为(Clustering Cat Behavior, CCB) 同时,猫也会响应周围的猫群成员,形成聚集效应。假设有N 只猫,猫i 的新位置会受到群体中最优猫(全局最优解,记作Gbest)的影响:
其中,γ 是反映群体互动强度的因子。
2.算法流程概述
- 初始化:设定猫群规模N,并在搜索空间内随机初始化所有猫的位置。
- 迭代开始:对于每一代(迭代轮数 t),执行以下步骤:
- PHB:根据公式计算每只猫的虚拟猎物位置Vi(t)。
- CCB:结合虚拟猎物位置Vi(t) 和Gbest 更新猫的位置Xi(t+1)。
- 评估适应度值:计算所有猫的新位置的适应度函数值,更新Pbesti 和Gbest。
- 判断终止条件:检查是否达到预设的最大迭代次数或满足其他的终止条件,如收敛精度。
- 迭代结束:输出最优解Gbest 作为问题的解决方案。
需要注意的是,实际应用中可能还会加入其他策略改进算法性能,如动态调整控制参数、局部搜索等。此外,猫群优化算法因其简单易理解、参数少且易于实现的优点,在许多工程优化问题中得到了广泛的应用。
3.matlab程序
..................................................................................
% 对每个粒子进行初始化
for i=1:nPop
% 初始化位置
Pops1(i).Position(1:nVar(1))=unifrnd(Vmin(1),Vmax(1),VarSize(1,:)); % 第一部分变量在指定范围内均匀分布
Pops1(i).Position(nVar(1)+1:nVar(2)+1)=unifrnd(Vmin(2),Vmax(2),VarSize(2,:)); % 第二部分变量在指定范围内均匀分布
% 初始化速度
Pops1(i).Velocity(1:nVar(1))=zeros(VarSize(1,:)); % 第一部分变量速度初始化为零向量
Pops1(i).Velocity(nVar(1)+1:nVar(2)+1)=zeros(VarSize(2,:)); % 第二部分变量速度初始化为零向量
% 评估当前粒子
Pops1(i).Cost=fitness(Pops1(i).Position); % 计算粒子当前位置的成本(目标函数值)
% 更新个人最优
Pops1(i).Best.Position=Pops1(i).Position; % 将当前位置设置为个人最优位置
Pops1(i).Best.Cost=Pops1(i).Cost; % 将当前成本设置为个人最优成本
% 更新全局最优
if Pops1(i).Best.Cost<ybest.Cost % 如果个人最优成本小于全局最优成本
ybest=Pops1(i).Best; % 更新全局最优为当前个人最优
end
end
% 初始化最佳成本数组
xbest=zeros(Miter,1); % 创建长度为最大迭代次数的全零向量,用于存储每次迭代的最佳成本
%% CSO运动过程
% 进行迭代
for it=1:Miter
it
% 随机选择MR比例的猫进入寻求模式
indices = randperm(nPop , floor(nPop*MR));
% 对每个粒子进行运动更新
for i=1:nPop
% 查找当前粒子是否处于寻求模式
ind = find(indices == i);
% 如果粒子处于寻求模式
if(~isempty(ind))
%% 寻求模式
[Pops1(i), ybest] = func_Seek( Pops1(i) , ybest , Vmax2 , Vmin2 , Vmax , Vmin , VarSize , nVar);
else
%% 跟踪模式
[ Pops1(i) , ybest ] = func_Tracing( Pops1(i) , ybest , Vmax2 , Vmin2 , Vmax , Vmin , VarSize , nVar , w , c1);
end
% 更新全局最优
if(Pops1(i).Cost < ybest.Cost)
ybest = Pops1(i);
end
end
% 记录本次迭代的最佳成本
xbest(it)=ybest.Cost;
% 更新惯性权重
w=w*wdamp;
end
%% 结果展示
% 绘制最佳成本随迭代次数的变化曲线
figure;
semilogy(xbest,'LineWidth',1); % 以半对数尺度绘制最佳成本曲线
xlabel('迭代次数'); % 设置x轴标签为"迭代次数"
ylabel('最佳成本'); % 设置y轴标签为"最佳成本"
up4068