智能优化算法——均衡优化算法(EO) MATLAB代码实现

智能优化算法——均衡优化算法(EO)

文献:https://doi.org/10.1016/j.knosys.2019.105190

Main

%_________________________________________________________________________
% --- 智能优化算法 ---                                                     
% 编码格式:UTF-8                                                          
%                                                                         
% 算法名称:                                                               
%   Equilibrium-Optimizer (均衡优化算法)                                   
%                                                                         
% 调用函数:                                                                
%   EO_fitness.m                                                          
%_________________________________________________________________________

%% 清空环境
clc;clear;
close all;

%% 参数设置
MaxIter = 500;                                              % 最大迭代次数
VarNum = 1;                                                 % 变量个数
lb = [0];                                                   % 变量下限
ub = [13.1];                                                % 变量上限
SearchAgents = 30;                                          % 粒子规模
m1 = 2;                                                     % 全局探索权重
m2 = 1;                                                     % 局部开发权重
V = 1;                                                      % 单位容积
GP = 0.5;                                                   % 生成率

% 粒子初始化
for i = 1:VarNum
    ub_i = ub(i);
    lb_i = lb(i);
    Cin(:,i) = rand(SearchAgents,1).*(ub_i-lb_i)+lb_i;
end
clear i;
Ceq1 = zeros(1,VarNum);     Ceq1_fit = -inf;                % 候选粒子1
Ceq2 = zeros(1,VarNum);     Ceq2_fit = -inf;                % 候选粒子2
Ceq3 = zeros(1,VarNum);     Ceq3_fit = -inf;                % 候选粒子3
Ceq4 = zeros(1,VarNum);     Ceq4_fit = -inf;                % 候选粒子4
Convergence_curve = zeros(MaxIter,VarNum+1);                % 收敛曲线

Iter = 0;  % 迭代计算器

%% 循环
while Iter < MaxIter
    for i = 1:size(Cin,1)
                
        % 边界控制
        Flagub = Cin(i,:) > ub;
        Flaglb = Cin(i,:) < lb;
        Cin(i,:) = (Cin(i,:).*(~(Flagub+Flaglb)))+ub.*Flagub+lb.*Flaglb;
        
        % 计算适应度
        Fitness(i) = EO_fitness(Cin(i,1));      % 单/多变量需更改
        
%% 均衡池和候选解
        % 获取候选粒子
        if Fitness(i) > Ceq1_fit
            Ceq1_fit = Fitness(i);  Ceq1 = Cin(i,:);
        elseif Fitness(i) < Ceq1_fit && Fitness(i) > Ceq2_fit
            Ceq2_fit = Fitness(i);  Ceq2 = Cin(i,:);
        elseif Fitness(i) < Ceq1_fit && Fitness(i) < Ceq2_fit && Fitness(i) > Ceq3_fit
            Ceq3_fit = Fitness(i);  Ceq3 = Cin(i,:);
        elseif Fitness(i) < Ceq1_fit && Fitness(i) < Ceq2_fit && Fitness(i) < Ceq3_fit && Fitness(i) > Ceq4_fit
            Ceq4_fit = Fitness(i);  Ceq4 = Cin(i,:);
        end
    end
    clear i;
    
% --------------------- 保存内存 ---------------------
    if Iter == 0
        FitnessOld = Fitness;   CinOld = Cin;
    end
    for i = 1:SearchAgents
        if FitnessOld(i) > Fitness(i)
            Fitness(i) = FitnessOld(i); Cin(i,:) = CinOld(i,:);
        end
    end
    clear i;
% ----------------------------------------------------

    CeqAve = (Ceq1+Ceq2+Ceq3+Ceq4)./4;          % 平均候选粒子
    CeqPool = [Ceq1;Ceq2;Ceq3;Ceq4;CeqAve];     % 均衡池

%% 指数项函数
    t = (1-Iter./MaxIter).^(m2.*Iter./MaxIter);
    
    for i = 1:SearchAgents
        lambda = rand(1,VarNum);
        r = rand(1,VarNum);
        Ceq = CeqPool(randi(size(CeqPool,1)),:);    % 从均衡池中随机选取候选粒子
        F = m1.*sign(r-0.5).*(exp(-lambda.*t)-1);
        
%% 生成率
        r1 = rand();    r2 = rand();
        GCP = 0.5.*r1.*ones(1,VarNum).*(r2>=GP);
        G0 = GCP.*(Ceq-lambda.*Cin(i,:));
        G = G0.*F;
        Cin(i,:) = Ceq+(Cin(i,:)-Ceq).*F+(G./lambda.*V).*(1-F);
    end
    
%% 更新迭代并记录
    Iter = Iter+1;
    for k = 1:VarNum
        Convergence_curve(Iter,k) = Ceq1(k);
    end
    clear k;
    Convergence_curve(Iter,size(Convergence_curve,2)) = Ceq1_fit;
        
end

Function

function fit = EO_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]
  • 多变量情况下,计算适应度时需要更改为多个输入量;
  • EO_fitness()函数可以自行修改。
posted @   Mr_Wuuu5  阅读(474)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示