Bootstrap

2025年SCI一区智能优化算法:混沌进化优化算法(Chaotic Evolution Optimization, CEO),提供MATLAB代码

一、混沌进化优化算法

https://github.com/ITyuanshou/MATLABCode

1. 算法简介

混沌进化优化算法(Chaotic Evolution Optimization, CEO)是2025年提出的一种受混沌动力学启发的新型元启发式算法。该算法的主要灵感来源于二维离散忆阻映射的混沌进化过程,通过利用忆阻映射的超混沌特性,为进化过程引入随机搜索方向,增强了算法的全局搜索能力和收敛速度。CEO算法在2025年3月发表在中科院1区SCI期刊《Chaos, Solitons & Fractals》。

2. 算法原理
2.1 混沌映射

CEO算法采用二维离散忆阻超混沌映射来生成混沌候选个体,具体公式如下:

{ x n + 1 = a 1 x n ( 1 − x n ) + b 1 y n y n + 1 = a 2 y n ( 1 − y n ) + b 2 x n \begin{cases} x_{n+1} = a_1 x_n (1 - x_n) + b_1 y_n \\ y_{n+1} = a_2 y_n (1 - y_n) + b_2 x_n \end{cases} {xn+1=a1xn(1xn)+b1ynyn+1=a2yn(1yn)+b2xn

其中, a 1 , a 2 , b 1 , b 2 a_1, a_2, b_1, b_2 a1,a2,b1,b2 是控制参数,通常取值为 a 1 = 3.8 , a 2 = 3.8 , b 1 = 0.5 , b 2 = 0.5 a_1 = 3.8, a_2 = 3.8, b_1 = 0.5, b_2 = 0.5 a1=3.8,a2=3.8,b1=0.5,b2=0.5

2.2 变异操作
  1. 映射个体到混沌空间

    • 从当前种群中随机选择两个个体 x t x_t xt y t y_t yt
    • x t x_t xt y t y_t yt 映射到 [ − 0.5 , 0.5 ] [-0.5, 0.5] [0.5,0.5] [ − 0.25 , 0.25 ] [-0.25, 0.25] [0.25,0.25] 范围内,分别记为 x ′ x' x y ′ y' y
      x ′ = x t − l b u b − l b − 0.5 x' = \frac{x_t - lb}{ub - lb} - 0.5 x=ublbxtlb0.5
      y ′ = y t − l b u b − l b − 0.25 y' = \frac{y_t - lb}{ub - lb} - 0.25 y=ublbytlb0.25
      其中, l b lb lb u b ub ub 分别是当前种群变量的下界和上界。
  2. 生成混沌候选个体

    • 使用混沌映射生成 N N N 个混沌候选个体 x chaos x_{\text{chaos}} xchaos y chaos y_{\text{chaos}} ychaos
      x chaos ( n ) = k ⋅ e − cos ⁡ ( n π ) − 1 ⋅ x t x_{\text{chaos}}(n) = k \cdot e^{-\cos(n\pi)} - 1 \cdot x_t xchaos(n)=kecos()1xt
      y chaos ( n ) = y t ′ + x t y_{\text{chaos}}(n) = y'_t + x_t ychaos(n)=yt+xt
      其中, k k k 是一个常数,通常取值为 k = 1 k = 1 k=1
  3. 映射回实际位置

    • 将混沌候选个体映射回实际位置:
      x chaos ′ = x chaos ⋅ 0.5 ⋅ ( u b − l b ) + l b x_{\text{chaos}'} = x_{\text{chaos}} \cdot 0.5 \cdot (ub - lb) + lb xchaos=xchaos0.5(ublb)+lb
      y chaos ′ = y chaos ⋅ 0.25 ⋅ 2 ⋅ ( u b − l b ) + l b y_{\text{chaos}'} = y_{\text{chaos}} \cdot 0.25 \cdot 2 \cdot (ub - lb) + lb ychaos=ychaos0.252(ublb)+lb
  4. 生成进化方向

    • 计算进化方向 d x t n d_{x_t}^n dxtn d y t n d_{y_t}^n dytn
      d x t n = x chaos ′ n − x t d_{x_t}^n = x_{\text{chaos}'}^n - x_t dxtn=xchaosnxt
      d y t n = y chaos ′ n − y t d_{y_t}^n = y_{\text{chaos}'}^n - y_t dytn=ychaosnyt
  5. 变异操作

    • 使用进化方向更新个体:
      x t + 1 = x t + a ⋅ d x t n x_{t+1} = x_t + a \cdot d_{x_t}^n xt+1=xt+adxtn
      y t + 1 = y t + a ⋅ d y t n y_{t+1} = y_t + a \cdot d_{y_t}^n yt+1=yt+adytn
      其中, a a a 是搜索步长,通常取值为 a = 0.5 a = 0.5 a=0.5
2.3 交叉操作
  1. 生成试验向量
    • 对于每个维度 j j j,生成一个随机数 r j r_j rj,如果 r j < C R r_j < CR rj<CR j = j rand j = j_{\text{rand}} j=jrand,则试验向量 x trial n x_{\text{trial}}^n xtrialn 为变异个体 x t + 1 n x_{t+1}^n xt+1n,否则为当前个体 x t n x_t^n xtn
      x trial n = { x t + 1 n , if  r j < C R  or  j = j rand x t n , otherwise x_{\text{trial}}^n = \begin{cases} x_{t+1}^n, & \text{if } r_j < CR \text{ or } j = j_{\text{rand}} \\ x_t^n, & \text{otherwise} \end{cases} xtrialn={xt+1n,xtn,if rj<CR or j=jrandotherwise
      其中, C R CR CR 是交叉概率,通常取值为 C R = 0.7 CR = 0.7 CR=0.7 j rand j_{\text{rand}} jrand 是随机选择的一个维度。
2.4 选择操作
  1. 选择操作
    • 计算当前个体 x t x_t xt 和试验向量 x trial n x_{\text{trial}}^n xtrialn 的适应度值。
    • 如果 f ( x trial n ) < f ( x t ) f(x_{\text{trial}}^n) < f(x_t) f(xtrialn)<f(xt),则用 x trial n x_{\text{trial}}^n xtrialn 替换 x t x_t xt,否则保持 x t x_t xt 不变:
      x t + 1 = { x trial n , if  f ( x trial n ) < f ( x t ) x t , otherwise x_{t+1} = \begin{cases} x_{\text{trial}}^n, & \text{if } f(x_{\text{trial}}^n) < f(x_t) \\ x_t, & \text{otherwise} \end{cases} xt+1={xtrialn,xt,if f(xtrialn)<f(xt)otherwise
3. 算法特点
  1. 混沌特性:利用二维离散忆阻映射的超混沌特性,增强全局搜索能力。
  2. 快速收敛:通过在最优解附近进行局部搜索,加快算法的收敛速度。
  3. 简单易实现:算法结构简单,参数较少,易于实现和应用。
4.算法描述

在这里插入图片描述

输入
  • func:目标函数。
  • N:混沌采样数量。
  • Np:种群大小。
  • MaxFES:最大函数评估次数。
输出
  • Best:最优变量。
  • fBest:最优函数值。
算法步骤
  1. 初始化迭代计数器

    • t = 1 t = 1 t=1
  2. 初始化种群并评估种群

    • [Population, fit, fBest, Best] = Initialization(func, Np, Dim)
    • F E v a l s = N p FEvals = Np FEvals=Np
  3. 主循环

    • F E v a l s < M a x F E S FEvals < MaxFES FEvals<MaxFES 时,执行以下步骤:

      1. 重复

        • 从种群中选择两个不同的个体 [ x t , y t ] [x_t, y_t] [xt,yt]
        • x t x_t xt y t y_t yt 进行区间映射,得到 [ x t ′ , y t ′ ] [x_t', y_t'] [xt,yt],执行公式 (4)。
        • 通过执行公式 (2) 生成 N N N 个混沌个体 [ x chaos , y chaos ] [x_{\text{chaos}}, y_{\text{chaos}}] [xchaos,ychaos]
        • 通过执行公式 (5) 得到实际位置 [ x chaos ′ , y chaos ′ ] [x_{\text{chaos}}', y_{\text{chaos}}'] [xchaos,ychaos]
        • 如果 r a n d < 0.5 rand < 0.5 rand<0.5,则执行公式 (7) 进行变异操作,得到 [ x ˉ t + 1 n , y ˉ t + 1 n ] [\bar{x}_{t+1}^n, \bar{y}_{t+1}^n] [xˉt+1n,yˉt+1n]
        • 否则,执行公式 (8) 进行变异操作,得到 [ x ˉ t + 1 n , y ˉ t + 1 n ] [\bar{x}_{t+1}^n, \bar{y}_{t+1}^n] [xˉt+1n,yˉt+1n]
        • 生成随机数 C r = rand ( 0 , 1 ) C_r = \text{rand}(0, 1) Cr=rand(0,1)
        • 通过执行公式 (9) 进行交叉操作,得到 [ x trial n , y trial n ] [x_{\text{trial}}^n, y_{\text{trial}}^n] [xtrialn,ytrialn]
        • 通过执行公式 (10) 和 (11) 进行选择操作,得到 [ x t + 1 , y t + 1 ] [x_{t+1}, y_{t+1}] [xt+1,yt+1]
        • 更新种群和适应度值 [ P o p u l a t i o n , f i t ] [Population, fit] [Population,fit]
        • F E v a l s = F E v a l s + 2 ⋅ N FEvals = FEvals + 2 \cdot N FEvals=FEvals+2N
      2. 直到

        • 种群中的所有个体都被选择一次。
      3. 更新迭代计数器

        • t = t + 1 t = t + 1 t=t+1
  4. 结束主循环

  5. 返回结果

    • 返回最优变量 B e s t Best Best 和最优函数值 f B e s t fBest fBest
5.详细步骤说明
  1. 初始化

    • 初始化种群并评估每个个体的适应度值,确定当前最优解 B e s t Best Best 和最优函数值 f B e s t fBest fBest
  2. 主循环

    • 在主循环中,通过混沌映射生成混沌个体,并进行变异、交叉和选择操作,逐步更新种群,直到达到最大函数评估次数 M a x F E S MaxFES MaxFES
  3. 变异操作

    • 根据随机数 r a n d rand rand 的值,选择执行公式 (7) 或公式 (8) 进行变异操作,生成新的变异个体。
  4. 交叉操作

    • 通过公式 (9) 进行交叉操作,生成试验向量。
  5. 选择操作

    • 通过公式 (10) 和 (11) 进行选择操作,更新种群中的个体。
  6. 更新种群

    • 更新种群和适应度值,继续下一次迭代。
6. 参考文献

[1]Yingchao Dong, Shaohua Zhang, Hongli Zhang, Xiaojun Zhou, Jiading Jiang, Chaotic evolution optimization: A novel metaheuristic algorithm inspired by chaotic dynamics, Chaos, Solitons & Fractals, Volume 192, 2025, 116049, https://doi.org/10.1016/j.chaos.2025.116049.
[2]https://github.com/ITyuanshou/MATLABCode/blob/main/MATLABcode

二、核心MATLAB代码

https://github.com/ITyuanshou/MATLABCode

function [Best, fBest, history] = CEO(func, Np, Dim, Varmin, Varmax, N)
rand('state', sum(100*clock));

if mod(Np,2)~=0
    error('Np must be set to an even number greater than 2!')
end

% Search Range
if length(Varmin)== 1
    lu = repmat([Varmin; Varmax], 1, Dim);
else
    lu = [Varmin; Varmax];
end

% Initialize the main population
[Population,fit,fBest,Best] = Initialization(func,lu, Np, Dim);
history(1) = fBest;

% chaotic initial search domain
low_chacos = [-0.5 -0.25]; 
up_chacos = [0.5 0.25];

t = 1; % Initialization iteration number
counter = 0;
while 1
    oldfBest = fBest;
    rand_num = randperm(Np);
    ub = max(Population); % Upper limit of population per iteration
    lb = min(Population); % Lower limit of population per iteration
    
    for i = 1:2:Np
        index = rand_num(i:i+1);
        xy = Population(index,:); % Randomly select two individuals
        
        % Perform interval mapping on xt and yt by executing Eq. (4).
        xy_dot = ((xy -  lb)./(ub - lb)).*(repmat(up_chacos',1,Dim) - repmat(low_chacos',1,Dim)) + repmat(low_chacos',1,Dim);
        
        % N chaotic individuals are obtained by executing Eq. (2)
        [x_chaos,y_chaos] = EDM(xy_dot(1,:),xy_dot(2,:),N);
        
        chaos_total = [x_chaos;y_chaos]; % Merging particles created by chaos
        
        for k = 1 : 2 % Evaluate each chaotic sequence
            xy_chaos = chaos_total((k-1)*N+1 : k*N,:);
            % Executing Eq. (5) yields the actual position of the corresponding optimization problem.
            xy_chaos_dot = (( xy_chaos -  repmat(low_chacos(:,k),1,Dim) )./(repmat(up_chacos(:,k),1,Dim) - repmat(low_chacos(:,k),1,Dim) )).*(ub - lb) + lb; 
            
            if rand < 0.5 % 
                xy_hat = xy(k,:) + rand(N,1).*( xy_chaos_dot - xy(k,:) ); % Mutation Eq. (7)
            else
                xy_hat = Best + rand(N,1).*( xy_chaos_dot - xy(k,:) ); % Mutation Eq. (8)
            end
            
            CR = rand ;
            xy_trial = Binomial_crossover(xy(k,:), xy_hat, CR); % Crossover Eq. (9)
            xy_trial = boundConstraint (xy_trial, lu);
            fit_xy_trial = fitness(func,xy_trial);
            [fBest_xy_trial,index_best] = min(fit_xy_trial);
            xy_trial_star = xy_trial(index_best,:);
            if  fBest_xy_trial < fit(index(k)) % Selection Eq. (10)
                Population(index(k),:) = xy_trial_star;
                fit(index(k)) = fBest_xy_trial;
            end
        end
        
    end
    
    [fBest,index_best] = min(fit);
    Best = Population(index_best,:);
    
    t = t + 1;
    
    %  termination conditions
    if norm(oldfBest-fBest) < 1e-8 % can be changed
        counter = counter + 1;
        if counter > 50 % can be changed
            disp('满足停止条件');
            break;
        end
    else
        counter = 0;
    end
    
    if mod(t,100)==0
        fprintf('iter=%d  ObjVal=%g\n',t,fBest);
    end
    history(t) = fBest;
    
end

end

function [X,Y] = EDM(x0,y0,itermax)
% exponential discrete memristor (E-DM) map
k = 2.66;
x = x0; % trajectory domain [-1,1]
y = y0;% trajectory domain [-0.5,0.5]
xo = x;
yo = y;
% System iteration
for j = 1:itermax
    xn = k*(exp(-cos(pi.*yo))-1).*xo;
    yn = yo + xo;
    % Stored iteration value
    x =[x; xn];
    y =[y; yn];
    % Update the initial value of each iteration
    xo = xn;
    yo = yn;
end
X =x(2:end,:);
Y =y(2:end,:);
end

function u = Binomial_crossover(p, v, CR)
% Binomial crossover
[N,dim] = size(v);
j_rand = floor(rand(N,1) * dim) + 1;
t = rand(N, dim) < CR;
t(N, j_rand) = 1;
u = t .* v + (1 - t) .* p;
end

function fit = fitness(func,x)
% calculate fitness
SE = size(x,1);
fit = zeros(SE,1);
for i = 1:SE
    fit(i) = feval(func,x(i,:));
end
end






;