鲸鱼算法(WOA)的原理介绍,通过网上查询,可以直接获取相关文献,这里将不在对其原理进行讲解,直接进入正题,鲸鱼算法可以进行复杂问题的优化设计以及路径规划等等。本篇文章主要是通过MATLAB编写程序实现对复杂函数的寻优过程,函数如下:
本次寻优目的是找出上述方程在[-50,50]的最小值,这个方程通过我们已学的知识就可以判断出最小值是0,但是一共有30个自变量,对于计算机而言,它并不是直接知道结果,只能一步一步去计算,如果一个一个量去计算,那么30个自变量的计算量还是很大的,因此通过使用鲸鱼算法( WOA)求解可以节省计算时间,也可以得到一个比较满意的结果。
接下来就是利用MATLAB实现鲸鱼优化算法的过程:
step1:建立两个自定义函数,适应度函数和边界条件函数
适应度函数为我们所求的函数值大小
%% 适应度函数
function y=fitt(x)
y=sum(x.^2);
end
边界条件函数是防止在迭代更新过程中,自变量超出了我们所设定的范围。本次代码设置如果自变量超过边界值时,则将边界值赋予自变量,如自变量如果大于50或者小于-50,则将50或者-50赋给自变量,在这个函数中使用到一个length()函数,这是得到变量长度的意思。
%% 边界处理
function X=bound(X,ub,lb)
for i=1:length(X(:,1))
for j=1:length(X(1,:))
if X(i,j)>ub
X(i,j)=ub;
end
if X(i,j)<lb
X(i,j)=lb;
end
end
end
end
step2:种群初始化,设置算法基本参数,种群数量,总迭代次数 ,上下限等,这部分代码中出现的inf是无穷大的意思,rand()函数取一个0到1的随机数,
%鲸鱼优化算法
%%这里通过对y=x1^2+x2^2+...+x30^2在[-50,50]的最小值,
%一共30个变量,很明显这个函数的最小值是0,接下来通过鲸鱼算法寻优情况
clear
clc
close all
%% 基本参数设置
pop = 50; %种群数量
T = 200; %总迭代次数
dim = 30; %自变量维度
ub = 50; %上限
lb =-50; %下限
t=1; %迭代次数
fitmin=inf; %函数最小值
%种群初始化
adfsaf=rand(pop,dim);
X=lb+adfsaf.*(ub-lb);%自变量初始值
step3:接下来就是迭代寻优过程了,其中包括包围法、泡泡网法以及随机搜索。
%%
while t<T
%计算适应度
for i=1:pop
fitness(i)=fitt(X(i,:));
end
%找到最佳适应度以及最优头鲸
[sortwith,gave]=sort(fitness);
coad=sortwith(1);
gpsoe=X(gave(1),:);
if coad<fitmin
fitmin=coad;
X_best=gpsoe;
end
r=rand();
a=2*(1-t/T);
A=(2*r-1)*a;
C=2*r;
%如果p<0.5,采用包围法更新位置,否则采用泡泡网法
if rand<0.5
% 种群更新-包围法
for i=1:pop-1
D1=abs(C*X_best-X(gave(i+1),:));
X(gave(i+1),:)=X_best-A*D1;
end
else
%种群更新-泡泡网法
b=4;
l=rand;
for i=1:pop-1
D2=abs(X_best-X(gave(i+1),:));
X(gave(i+1),:)=D2*exp(b*l)*cos(2*pi*l)+X_best;
end
end
%随机搜索
if abs(A)>1
train=randi([1 ,pop],10,1);%选取鲸鱼中随机鲸鱼进行位置更新
for i=1:length(train)
X(train(i))=X(randi([1,pop]))-A*abs(C*X(randi([1,pop]))-X(train(i)));
end
end
%边界处理
X=bound(X,ub,lb);
%保存本次迭代最佳适应度以及最佳鲸鱼位置
cound(t)=fitmin;
t=t+1;
end
step4:等到全部迭代完了之后,就可以进行结果可视化了。通过计算可以得到一个结果最小值为3.1213e-8,已经非常逼近理想值0了。
%% 绘图
plot(1:length(cound),cound)
xlabel('迭代次数')
ylabel('适应度值')
title('鲸鱼算法寻找最小值过程',['最小值',num2str(cound(end))])
legend('WOA寻优')