智能优化算法——鲸鱼优化算法(WOA)
Main
%_________________________________________________________________________
% --- 智能优化算法 ---
% 编码格式:UTF-8
%
% 算法名称:
% Whale Optimization Algorithm (鲸鱼优化算法)
%
% 调用函数:
% WOA_fitness.m
%_________________________________________________________________________
%% 清空环境
clc;clear;
close all;
%% 参数设置
SearchAgents = 100; % 代理数
MaxIter = 300; % 最大迭代次数
VarNum = 1; % 变量个数
lb = [0]; % 变量下限
ub = [1]; % 变量上限
LeaderPos = zeros(1,1); % 位置向量初始化
LeaderScore = -inf; % 分数初始化
% 位置初始化
for i = 1:VarNum
ub_i = ub(i);
lb_i = lb(i);
Positions(:,i) = rand(SearchAgents,1).*(ub_i-lb_i)+lb_i;
end
Convergence_curve = zeros(MaxIter,VarNum+1); % 收敛曲线记录
t = 0; % 迭代计数器
%% 循环
while t < MaxIter
for i = 1:size(Positions,1)
% 边界控制
Flagub = Positions(i,:) > ub;
Flaglb = Positions(i,:) < lb;
Positions(i,:) = (Positions(i,:).*(~(Flagub+Flaglb)))+ub.*Flagub+lb.*Flaglb;
% 计算每个搜索代理的目标函数
Fitness = WOA_fitness(Positions(i,1));
VarValue = Positions(i,:);
% 最好搜索代理更新
if Fitness > LeaderScore
LeaderScore = Fitness; % 更新
LeaderVarValue = VarValue;
LeaderPos = Positions(i,:);
end
end
clear i;
a = 2-t*((2)/MaxIter); % 线性减少 (从2到0)
a2 = -1+t*((-1)/MaxIter); % 线性减少 (从-1到-2)
%% 位置更新
for i = 1:size(Positions,1)
r1 = rand(); % 随机数[0,1]
r2 = rand(); % 随机数[0,1]
A = 2*a*r1-a; % 向量系数
C = 2*r2; % 向量系数
b = 1; % 控制螺旋性状参数
l = (a2-1)*rand+1; % 随机数
p = rand(); % 位置更新参数
for j = 1:size(Positions,2)
%% 随机搜寻
if p < 0.5
if abs(A) >= 1
index_rand = floor(SearchAgents*rand()+1); % 选取随机代理
X_rand = Positions(index_rand,:);
D_rand = abs(C*X_rand(j)-Positions(i,j));
Positions(i,j) = X_rand(j) - A*D_rand;
elseif abs(A) < 1
D_leader = abs(C*LeaderPos(j)-Positions(i,j));
Positions(i,j) = LeaderPos(j)-A*D_leader;
end
%% 螺旋位置更新
elseif p >= 0.5
DistanceLeader = abs(LeaderPos(j)-Positions(i,j));
Positions(i,j) = DistanceLeader*exp(b.*1).*cos(1.*2*pi)+LeaderPos(j);
end
end
clear j;
end
clear i;
%% 更新迭代并记录
t = t+1;
for k = 1:VarNum
Convergence_curve(t,k) = LeaderVarValue(k);
end
clear k;
Convergence_curve(t,size(Convergence_curve,2)) = LeaderScore;
end
Function
function fit = WOA_fitness(x)
% 求最大值,若需求最小值可求倒值
% 输入参数
% x:变量
% 输出参数
% fit:适应度
fit = (x + 10*sin(5*x) + 7*cos(4*x));
end
Tips
- 多变量情况下需要更改
VarNum
和变量下限lb
与变量上限ub
,比如两个变量的上下限分别为(1,2) & (3,4)
,那么应该设置为lb = [1,3]; ub = [2,4]
; - 多变量情况下,计算适应度时需要更改为多个输入量;
WOA_fitness()
函数可以自行修改。