首页 > 编程语言 >智能优化算法——鲸鱼优化算法(WOA) MATLAB算法实现

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

时间:2022-09-25 20:55:05浏览次数:53  
标签:rand end Positions 算法 MATLAB lb 优化 ub

智能优化算法——鲸鱼优化算法(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()函数可以自行修改。

标签:rand,end,Positions,算法,MATLAB,lb,优化,ub
From: https://www.cnblogs.com/Mr-wuuu/p/16728861.html

相关文章

  • 埃拉托斯特尼筛法——求1-n内质数个数的最快算法
    埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数......
  • 算法与数据结构--有效数独
    classSolution{public:boolisValidSudoku(vector<vector<char>>&board){introws[9][9];//建造一个二维数组,记录行intcolumns[9][9];//建......
  • 推荐系统:技术、评估及高效算法 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1MpDkvw16U1E5O6OuVBY3Ow点击这里获取提取码 ......
  • React 函数式组件怎样进行优化
    前言目的本文只介绍函数式组件特有的性能优化方式,类组件和函数式组件都有的不介绍,比如key的使用。另外本文不详细的介绍API的使用,后面也许会写,其实想用好hooks还是......
  • 聊聊接口性能优化的 11 个小技巧
    前言接口性能优化对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题。该问题说简单也简单,说复杂也复杂。有时候,只需加个索引就能解......
  • KMP算法,BF算法
    串、BF算法、KMP算法概述需要掌握:1、串的相关概念,串与线性表之间的异同2、顺序串,和链串中串的基本的基本运算算法设计3、模式匹配算法BF、和KMP算法串......
  • 排序算法
    内部排序这里先介绍一个概念,算法稳定性算法稳定性--假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!......
  • ft的matlab初体验
    ft的傅里叶变换初体验本学期的课程需要用到大量繁琐的傅里叶变换,在除了手动计算式的练习之外,能够通过matlab进行辅助分析也许能对变换过程能有更直观的了解。特此记下这篇......
  • 算法练习-第四天【链表】
    链表24.两两交换链表中的节点参考:代码随想录24.两两交换链表中的节点看完题目的第一想法两两交换链表中的节点其实就是改变链表节点之间的指针将第二个节点的Next......
  • UKF和EKF算法在非线性系统中的应用比较
    参考内容:书籍《卡尔曼滤波原理及应用------matlab仿真》这本书对kalman算法的解析很清晰,MATLAB程序很全,适合初学者(如有侵权,请联系删除(qq:1491967912))之前学习了EKF算法和......