智能优化算法——鲸鱼优化算法(WOA) MATLAB算法实现

智能优化算法——鲸鱼优化算法(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()函数可以自行修改。
posted @ 2022-09-25 20:48  Mr_Wuuu5  阅读(1501)  评论(0)    收藏  举报