海鸥优化算法及其matlab代码实现

1 算法概述

        Seagull Optimization Algorithm (SOA)算法主要由两个步骤组成,它们的灵感分别源于海鸥群体的迁移和攻击行为。在迁移的过程中,海鸥个体的位置各不相同,以避免发生碰撞。在攻击过程中,每只海鸥呈现螺旋状攻击猎物。

2 算法步骤

2.1 迁移行为

        海鸥的迁移行为包含避免碰撞、朝着种群中最佳海鸥位置所在的方向移动以及靠近最佳海鸥位置。其中,最佳海鸥位置指当前种群中适应度值最好的海鸥个体所在的位置。模拟海鸥迁移行为的算法分为三步。首先,通过引入一个控制因子A对海鸥的位置进行调节,从而避免海鸥之间发生碰撞。

其中,C_{s}P_{s}分别表示海鸥群体新的位置和当前位置,t表示迭代次数。

其中,公式(2)可以避免海鸥个体发生碰撞,f_{c}=2是控制参数,Maxiter为最大的迭代次数。A的值随着迭代次数的增加由2线性递减到0。其次,海鸥会朝着当前种群最佳海鸥位置所在的方向移动,即朝着适应度值最好的海鸥个体所在的方向移动,公式为:

其中,M_{s}是新的海鸥位置,gbest是当前种群中最佳海鸥位置。B的计算公式为:

其中,B负责平衡局部搜索和全局搜索,rd是一个0-1之间的随机值。

        最后,海鸥群体会靠近最佳海鸥位置,从而达到新位置D_{s}

2.2 攻击行为

        当海鸥发现猎物后,它们在空中呈现出螺旋状态不断改变飞行角度和速度,同时借鉴迁移行为的历史和经验去攻击猎物。该行为在x,y,z平面上的描述如下:

其中,r表示每只海鸥的半径,\alpha是之间的随机数,e是自然对数的基底。uv是常量。海鸥的最终位置被描述为:

2.3 算法伪代码

3 标准测试函数的matlab代码

3.1 种群初始化(init.m)

function Pos=init(SearchAgents,dimension,upperbound,lowerbound)

Boundary= size(upperbound,2); 
if Boundary==1
    Pos=rand(SearchAgents,dimension).*(upperbound-lowerbound)+lowerbound;
end

if Boundary>1
    for i=1:dimension
        ub_i=upperbound(i);
        lb_i=lowerbound(i);
        Pos(:,i)=rand(SearchAgents,1).*(ub_i-lb_i)+lb_i;
    end
end

3.2  目标函数(fun_info.m)

function [lowerbound,upperbound,dimension,fitness] = fun_info(F)


switch F
    case 'F1'
        fitness = @F1;
        lowerbound=-100;
        upperbound=100;
        dimension=30;

    end

end

% F1

function R = F1(x)
    R=sum(x.^2);
end

3.3 SOA核心代码(soa.m)


%%% Designed and Developed by Dr. Gaurav Dhiman (http://dhimangaurav.com/) %%%


function[Score,Position,Convergence]=soa(Search_Agents,Max_iterations,Lower_bound,Upper_bound,dimension,objective)

Position=zeros(1,dimension);
Score=inf; 

Positions=init(Search_Agents,dimension,Upper_bound,Lower_bound);

Convergence=zeros(1,Max_iterations);

l=0;

while l<Max_iterations
    for i=1:size(Positions,1)  
        
        Flag4Upper_bound=Positions(i,:)>Upper_bound;
        Flag4Lower_bound=Positions(i,:)<Lower_bound;
        Positions(i,:)=(Positions(i,:).*(~(Flag4Upper_bound+Flag4Lower_bound)))+Upper_bound.*Flag4Upper_bound+Lower_bound.*Flag4Lower_bound;               
        
        fitness=objective(Positions(i,:));
        
        if fitness<Score 
            Score=fitness; 
            Position=Positions(i,:);
        end
        

    end
    
    
    Fc=2-l*((2)/Max_iterations); 
    
    for i=1:size(Positions,1)
        for j=1:size(Positions,2)     
                       
            r1=rand(); 
            r2=rand(); 
            
            A1=2*Fc*r1-Fc; 
            C1=2*r2; 
            b=1;             
            ll=(Fc-1)*rand()+1;  
       
            D_alphs=Fc*Positions(i,j)+A1*((Position(j)-Positions(i,j)));                   
            X1=D_alphs*exp(b.*ll).*cos(ll.*2*pi)+Position(j);
            Positions(i,j)=X1;
            
        end
    end
    l=l+1;    
    Convergence(l)=Score;
end



3.4 使用SOA测试标准函数F1的结果

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的海鸥算法的 MATLAB 代码示例: ```matlab % 海鸥算法 % 适用于连续优化问题 % 作者:www.matlab-online.com % 参考文献:https://www.sciencedirect.com/science/article/pii/S2405452617301227 % 初始化参数 N = 50; % 种群大小 D = 10; % 变量个数 T = 100; % 迭代次数 lb = -100; % 取值下界 ub = 100; % 取值上界 c1 = 1.5; % 个体学习因子 c2 = 1.5; % 全局学习因子 w = 0.7; % 惯性权重 f = 0.9; % 缩放因子 Q = 0.1; % 随机扰动因子 % 初始化种群 x = lb + (ub-lb)*rand(N,D); % 初始化速度 v = zeros(N,D); % 计算适应度 fit = zeros(N,1); for i = 1:N fit(i) = sum(x(i,:).^2); end % 记录历史最优解 best_fit = fit; best_x = x; % 迭代优化 for t = 1:T % 更新速度和位置 for i = 1:N r1 = rand(1,D); r2 = rand(1,D); v(i,:) = w*v(i,:) + c1*r1.*(best_x(i,:)-x(i,:)) + c2*r2.*(best_x(randi(N),:)-x(i,:)); x(i,:) = x(i,:) + v(i,:); % 边界处理 x(i,:) = max(x(i,:),lb); x(i,:) = min(x(i,:),ub); % 随机扰动 x(i,:) = x(i,:) + Q*(ub-lb)*rand(1,D); % 缩放 fit_i = sum(x(i,:).^2); if fit_i < best_fit(i) best_fit(i) = fit_i; best_x(i,:) = x(i,:); end x(i,:) = best_x(i,:) + f*(rand(1,D)-0.5)*best_fit(i); % 边界处理 x(i,:) = max(x(i,:),lb); x(i,:) = min(x(i,:),ub); end % 计算适应度 for i = 1:N fit(i) = sum(x(i,:).^2); end % 更新历史最优解 for i = 1:N if fit(i) < best_fit(i) best_fit(i) = fit(i); best_x(i,:) = x(i,:); end end % 显示当前迭代次数和最优适应度 fprintf('迭代次数:%d,最优适应度:%f\n', t, min(best_fit)); end % 显示最终结果 [~,index] = min(best_fit); fprintf('最优解:\n'); disp(best_x(index,:)); fprintf('最优适应度:%f\n', best_fit(index)); ``` 请注意,这只是一个简单的示例代码,您可能需要根据您的具体问题进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值