1 简介
由于影响岩爆因素的复杂性,以及岩爆的极强灾害性.本文通过选择影响岩爆程度的四项物理力学指标,最后运算组合以后变成三项输入因子.应用BP神经网络对16组国内外岩爆实际工程案例进行训练,得到最优隐含层数.然后利用猫群群算法(CSO)优化网络的初始权值和闻值,避免了单独使用BP网络时说存茌的不足.利用Matlab及其神经网络工具箱来实现网络的运算和预测.将训练好的网路应用到三组实际的案例中,最终结果表明利用CSO-BP神经网络算法所预测出来的结果和实际岩爆烈度一致,且结果明显优于单因素判据和BP网络预测的结果.
猫群算法(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
end
% Define Array to Hold Best Cost Values
BestCost=zeros(MaxIt,1);
c1=1;
%% PSO Main Loop
for it=1:MaxIt
oneadd_cat=zeros(nPop,nVar);
zeroadd_cat=zeros(nPop,nVar);
dd3_cat=c2_cat*rand;
%******************************************************
for t_i=1:nPop
for g_i=1:nVar
if(GlobalBest.Position(g_i)==0)
oneadd_cat(t_i,g_i)=oneadd_cat(t_i,g_i)-dd3_cat;
zeroadd_cat(t_i,g_i)=zeroadd_cat(t_i,g_i)+dd3_cat;
else
oneadd_cat(t_i,g_i)=oneadd_cat(t_i,g_i)+dd3_cat;
zeroadd_cat(t_i,g_i)=zeroadd_cat(t_i,g_i)-dd3_cat;
end
end
end
one_vel_cat=w_cat*one_vel_cat+oneadd_cat;
zero_vel_cat=w_cat*zero_vel_cat+zeroadd_cat;
for t_i=1:nPop
for g_i=1:nVar
if(abs(vel_cat(t_i,g_i))>vmax_cat)
one_vel_cat(t_i,g_i)=vmax_cat*sign(one_vel_cat(t_i,g_i));
zero_vel_cat(t_i,g_i)=vmax_cat*sign(zero_vel_cat(t_i,g_i));
end
end
end
for t_i=1:nPop
for g_i=1:nVar
if(pop(t_i).Position(g_i)==1)
vel_cat(t_i,g_i)=zero_vel_cat(t_i,g_i);
else
vel_cat(t_i,g_i)=one_vel_cat(t_i,g_i);
end
end
end
veln_cat=logsig(vel_cat);
%******************************************************
for i=1:nPop
if(pop(i).flag==0)
for r2=1:nVar
if(rand<veln_cat(i,r2))
pop(i).Position(r2)=GlobalBest.Position(r2);
else
pop(i).Position(r2)=pop(i).Position(r2);
end
end
pop(i).Cost = CostFunction(pop(i).Position,tb,bitt);
else
copy_cat=repmat(pop(i).Position,SMP,1);
pop(i).Position=mutate(copy_cat,nVar,nb,SRD,tb,bitt);
end
try
pop(i).Cost = CostFunction(pop(i).Position,tb,bitt);
catch tt
disp('ll');
end
% Update Global Best
if pop(i).Cost<=GlobalBest.Cost
GlobalBest=pop(i);
end
end
% Store Best Cost Ever Found
BestCost(it)=GlobalBest.Cost;
% Show Iteration Information
disp(['Iteration ' num2str(it) ': Best Cost cat= ' num2str(BestCost(it))]);
num_seek=round(MR*nPop);
num_track=nPop-num_seek;
cat=randperm(nPop);
for ii=1:nPop
y=find(cat==ii);
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]王政宇, 王胜辉, 李潇潇, 赵音, & 田巍. (2022). 基于人工鱼群优化bp神经网络的光伏功率预测算法. 沈阳工程学院学报:自然科学版, 18(1), 6.