1 简介
猫群算法(CSO)是 2006 年由台湾学者 Chu 等人通过观察猫群在日常生活中的行为提出来的一种新型群体智能算法。猫群算法与遗传算法类似,是基于迭代的优化方法,但是没有遗传算法的交叉算子,易实现,且拥有全局搜索、较快收敛速度等优点。
猫群算法是研究人员通过观察自然界猫群的生活习性提出来的一种智能算法。该算法把猫群分成跟踪和搜寻两种模式。每只猫即对应问题的一个解。每只猫的属性由猫的速度、猫的适应值、猫处于跟踪或搜寻模式的标志值(通常为 0 或 1)组成。每只猫处于初始位置,然后通过每只猫的标志值判断猫处于搜寻还是跟踪模式。若猫处于跟踪模式,则执行跟踪算子;若猫处于搜寻模式,则执行搜寻算子。最后使得猫处于一个新的位置,并保留最优猫直至算法满足结束条件。猫群算法的基本流程分为以下五步:
a)初始化猫群。
b)根据分组率将猫群随机划分为跟踪和搜寻两种模式。
c)根据猫的标志值对猫执行相应的算子进行位置更新。
d)计算每只猫的适应度,记录并保留适应度最优的猫。
e)若满足结束条件则终止算法,否则再返回步骤 b)。猫群算法的基本流程如图 1 所示。
主要参数介绍如下:
a)猫群规模 N,即猫的初始数量,由具体问题来确定。较大的猫群可以扩大搜索空间,但也增加了算法的复杂度,较小的猫群能较快收敛,但也容易陷入局部最优。 b)分组率 mr。将猫群随机分成两组,模拟现实生活中大部分猫处在搜寻状态,少量的猫处于跟踪模式,通常该参数取一个较小的值。
c)个体猫上每个基因的改变范围 srd。类似于遗传算法的变异概率,进行基因改变是为了增加解的多样性防止算法陷入局部最优。改变范围太小则不容易产生新解,范围太大则容易使算法变成随机搜索。
d)最大迭代次数 maxiter。由实验的具体问题而定,若迭代次数过大,可能算法已经收敛,会增加不必要的运算时间,若迭代次数过小,则容易出现早熟现象。
2 部分代码
clc;
close all;
num=2;
MaxIt=200; % Maximum Number of Iterations
nPop=50;
%% Algorithm Parameters BINARY CAT 2013
tb=10;
bitt=20;
nVar=bitt*tb;
BestCost1_cat=zeros(num,MaxIt);
CostFunction=@(x,tb,bitt) cost_function(x,tb,bitt); % Cost Function
c2_cat=1;
for ittt=1:num
for ta=1:1
% Number of Decision Variables
alpha=0.3;
VarSize=[1 nVar]; % Decision Variables Matrix Size
%% PSO Parameters
SMP=3;%0.25*nPop;
SRD=0.2;
CDC=0.2;
nb=round(nVar*CDC);
MR=0.3;
num_seek=round(MR*nPop);
num_track=nPop-num_seek;
cat=randperm(nPop);
w_cat=0.5;
vmax_cat=4;
%********************************
%% Initialization
% Define Empty Structure to Hold Particle Data
empty_cat.Position=[];
empty_cat.flag=[];
empty_cat.Velocity=[];
empty_cat.Cost=[];
pop=repmat(empty_cat,nPop,1);
vel_cat=rand(nPop,nVar)-0.5;
one_vel_cat=rand(nPop,nVar)-0.5;
zero_vel_cat=rand(nPop,nVar)-0.5;
% Initialize Global Best
GlobalBest.Cost=inf;
for i=1:nPop
% Initialize Velocity
pop(i).Position = round(rand(1,nVar));
pop(i).Velocity = rand(1,nVar);
% Evaluate Solution
pop(i).Cost=CostFunction(pop(i).Position,tb,bitt);
y=find(cat==i);
if(y<=num_seek)
pop(i).flag=1;
else
pop(i).flag=0;
end
% Update Global Best
if pop(i).Cost<=GlobalBest.Cost
GlobalBest=pop(i);
end
if(y<=num_seek)
pop(ii).flag=1;
else
pop(ii).flag=0;
end
end
end
end % BINARY CAT 2013
BestCost1_cat(ittt,:)=BestCost';
end
BestCost_all_cat1=mean(BestCost1_cat);
BestCost1_cat=BestCost1_cat;
%******************************************
std1_cat1=std(BestCost1_cat);
std_cat1=std1_cat1(MaxIt);
%******************************************
mean1_cat1=mean(BestCost1_cat);
mean_cat1=mean1_cat1(MaxIt);
%******************************************
best1_cat1=max(BestCost1_cat);
best_cat1=best1_cat1(MaxIt);
%******************************************
bad1_cat1=min(BestCost1_cat);
bad_cat1=bad1_cat1(MaxIt);
daa=[mean_cat1;std_cat1;bad_cat1;best_cat1]
figure;
semilogy(BestCost_all_cat1,'r','LineWidth',2);
xlabel('Iteration');
ylabel('Cost');
legend('binary cat','Location','NW');
img =gcf; %获取当前画图的句柄
print(img, '-dpng', '-r600', './运行结果.png') %即可得到对应格式和期望dpi的图像
3 仿真结果
4 参考文献
[1]范正伟, 刘琼, & 李新鹏. (2013). 多目标猫群算法求解切削参数优化问题. 软件导刊, 12(003), 116-118.
部分理论引用网络文献,若有侵权联系博主删除。
5 MATLAB代码与数据下载地址
见博客主页