2025年受自适应差分进化-无人机路径规划的统一元启发式框架-附Matlab完整代码

发布于:2025-08-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

1.简介

与通常从单一生物或集体行为中汲取灵感的传统元启发式算法不同,本文从整体自然角度引入了一种新颖的元启发式方法。借鉴生物进化、种群内集体行为和生态系统自我调节机制的原理,所提出的算法被称为自然启发自适应差分进化(NIADE)。通过整合多种策略和全局优化概念,NIADE有效地解决了以众多相互作用变量为特征的复杂问题,从而克服了现有算法固有的限制,这些限制主要依赖于单一策略或局部优化方法。这种集成为解决复杂的优化挑战提供了创新途径。
该算法的性能使用CEC2017和CEC2022的基准函数进行评估,并与七种主要算法进行比较。通过Wilcoxon秩和检验和Friedman检验统计的统计分析证实了NIADE的优越性。此外,NIADE在解决多约束现实世界工程问题方面的有效性通过CEC2020现实世界约束问题集得到验证。此外,通过建模和实际实验证明了其在无人机(UAV)路径规划中的适用性,在该领域提出了一个有希望的新解决方案。最后,本文讨论了NIADE算法的潜在改进和未来研究方向。

2. 提出的NiADE算法

本节阐述NiADE算法的数学模型,分析其探索与开发机制,并提供伪代码及计算复杂度分析。

2.1.1 种群初始化

NiADE算法通过随机生成候选解初始化种群,每个解代表个体。如公式(1)所示,单个解的结构为:
X=[x1,x2,⋯ ,xD](1) X = [x_1, x_2, \cdots, x_D] \tag{1} X=[x1,x2,,xD](1)
其中DDD为解空间维度。对于NNN个个体求解DDD维问题,解空间表示为公式(2):
XS=[x1,1x1,2…x1,D−1x1,Dx2,1x2,2…x2,D−1x2,D⋮⋮…⋮⋮xN−1,1xN−1,2…xN−1,D−1xN−1,DxN,1xN,2…xN,D−1xN,D](2) X_S = \left[\begin{array}{ccccc} x_{1,1} & x_{1,2} & \ldots & x_{1,D-1} & x_{1,D} \\ x_{2,1} & x_{2,2} & \ldots & x_{2,D-1} & x_{2,D} \\ \vdots & \vdots & \ldots & \vdots & \vdots \\ x_{N-1,1} & x_{N-1,2} & \ldots & x_{N-1,D-1} & x_{N-1,D} \\ x_{N,1} & x_{N,2} & \ldots & x_{N,D-1} & x_{N,D} \end{array}\right] \tag{2} XS= x1,1x2,1xN1,1xN,1x1,2x2,2xN1,2xN,2x1,D1x2,D1xN1,D1xN,D1x1,Dx2,DxN1,DxN,D (2)
XSX_SXS为解空间矩阵,xN,Dx_{N,D}xN,D表示第NNN个个体在第DDD维的解。每个解按公式(3)生成:
xi=lb+rand(0,1)×(ub−lb),i=1,2,…,N(3) x_i = lb + \text{rand}(0,1) \times (ub - lb), \quad i=1,2,\ldots,N \tag{3} xi=lb+rand(0,1)×(ublb),i=1,2,,N(3)
其中lblblbububub分别为解空间下界和上界,rand(0,1)\text{rand}(0,1)rand(0,1)为[0,1]区间的随机数。

2.1.2 差分进化策略

差分进化通过变异和交叉操作更新个体,NiADE采用该策略增强种群多样性和全局搜索能力。

(1)变异
为每个个体随机选择三个不同个体,生成变异向量ViV_iVi
Vi=Xr1+F×(Xr2−Xr3)(4) V_i = X_{r1} + F \times (X_{r2} - X_{r3}) \tag{4} Vi=Xr1+F×(Xr2Xr3)(4)
其中FFF为缩放因子,Xr1,Xr2,Xr3X_{r1}, X_{r2}, X_{r3}Xr1,Xr2,Xr3为随机选择的个体。

(2)交叉
变异向量ViV_iVi与当前个体XiX_iXi交叉生成试验向量UiU_iUi
Ui[j]={Vi[j],if rand(0,1)≤CR or j=jrandXi[j],otherwise(5) U_i[j] = \begin{cases} V_i[j], & \text{if } \text{rand}(0,1) \leq CR \text{ or } j=j_{\text{rand}} \\ X_i[j], & \text{otherwise} \end{cases} \tag{5} Ui[j]={Vi[j],Xi[j],if rand(0,1)CR or j=jrandotherwise(5)
CRCRCR为交叉概率,jrandj_{\text{rand}}jrand为随机维度以确保至少一个维度来自变异向量。

2.1.3 黄金比例策略

该策略利用黄金比例ggg的数学特性更新惯性权重WWW,平衡探索与开发能力。位置更新公式为:
Xnew,j=W×Ui+(1−W)×Xi(6) X_{\text{new},j} = W \times U_i + (1-W) \times X_i \tag{6} Xnew,j=W×Ui+(1W)×Xi(6)
其中W=(0.5×rand/2)∼gW = (0.5 \times \text{rand}/2) \sim gW=(0.5×rand/2)gggg为黄金比例值(未完全显示)。

2.1.4多样性保持策略

多样性保持策略的主要目标是通过维持搜索空间的全局多样性,防止算法过早收敛至局部最优。具体实现方式为每10次迭代重新初始化10%的种群个体。这种周期性重启机制通过引入随机搜索成分,既保持了多样性又拓展了全局搜索范围。整体上,该策略通过持续维护种群多样性和适应性,降低陷入局部最优的风险,提升算法处理复杂多峰优化问题的性能。

2.1.5 精英保留策略

精英策略通过在迭代过程中保留历史最优解,增强算法的稳定性和适应性。其核心原理如公式(7)所示,从当前种群筛选适应度最高的个体单独存储,并在每代迭代结束时将其重新注入种群,确保优质解不被淘汰:

Positions[end−EliteCount+1:end]=ElitePositions(7) \text{Positions}[\text{end} - \text{EliteCount} + 1 : \text{end}] = \text{ElitePositions} \tag{7} Positions[endEliteCount+1:end]=ElitePositions(7)

其中ElitePositions\text{ElitePositions}ElitePositions为当代最优解集合,EliteCount\text{EliteCount}EliteCount为精英解数量,end\text{end}end表示当前种群末尾序号。该策略显著提升了算法收敛的可靠性。

2.1.6 局部搜索策略

对当前最优个体执行局部搜索以提升解的质量,如公式(8)所示通过自适应扰动实现精细探索:

Xnew,d=Xd′+(rand×2−1)×0.1×(ubd−lbd)(8) X_{\text{new},d} = X_d' + (\text{rand} \times 2 - 1) \times 0.1 \times (ub_d - lb_d) \tag{8} Xnew,d=Xd+(rand×21)×0.1×(ubdlbd)(8)

其中:

  • Xnew,dX_{\text{new},d}Xnew,d:第ddd维局部搜索生成的新解坐标
  • Xd′X_d'Xd:当前全局最优解在第ddd维的坐标
  • rand\text{rand}rand:[0,1]均匀分布的随机数,(rand×2−1)(rand \times 2 - 1)(rand×21)将扰动扩展至[-1,1]区间
  • 0.10.10.1:扰动比例因子(可调),限制扰动范围为搜索空间长度的10%
  • ubdub_dubd/lbdlb_dlbd:第ddd维上下界,定义扰动绝对幅度
2.2.7突变因子F

根据表9和图1(a)中的敏感性分析结果,突变因子F显著影响NIADE算法的性能。该算法在F=0.4时实现了最佳性能,排名第一。它还与分别排名第二和第三的F=0.3和F=0.2竞争,表明在该范围内有效优化。然而,当F超过0.4时,平均排名逐渐恶化,表明性能下降。这一趋势归因于突变向量Vi的幅度增加,导致每次迭代的位置变化更大。因此,全局搜索变得过于稀疏,导致探索不足。
相反,当F=0.1时,算法的排名与F=0.2相比急剧下降,反映了较差的性能。较小的F值产生较弱的突变效应和不充分的位置调整,从而降低全局搜索效率并增加过早收敛到局部最优的风险。因此,选择合适的F值至关重要。不合适的值会显着损害算法有效性。在这项研究中,F=0.4被确定为最优,提供了有利于有效探索解空间的平衡权衡。

2.2.8交叉概率CR

引入交叉概率CR以增强解的多样性并降低算法陷入局部最优的风险。该参数的灵敏度分析结果如表10所示,相应的平均排名结果如图1(b)所示。实验结果表明,当CR=0.9时,NIADE算法表现最好,排名第一。这表明较高的CR值有助于更多样化的解空间,这反过来又降低了过早收敛的可能性并维持了算法的搜索有效性。此外,图1(b)表明,其他CR值之间的性能变化相对较小,表明算法对该参数不高度敏感。这种稳定性增强了算法对广泛问题的适用性,降低了由于参数波动导致性能下降的风险。总之,选择合适的CR参数。值对于保持算法的稳定性和鲁棒性很重要。精心选择的CR促进了解的多样性并加强了整体性能。基于这些发现,本研究采用CR=0.9来确保最佳算法行为图2,图3,图4,图5。
在这里插入图片描述

function [best_score, best_pos, Convergence_curve] = NIADE(N, Max_iter, lb, ub, dim, fobj)
% NIADE: Differential Evolution + 少量局部搜索 + 精英保留
% 适用于最小化问题;若要最大化,可传入 @(x)-f(x)

    % ---- 边界向量化(支持标量或向量) ----
    if numel(lb) == 1, lb = repmat(lb, 1, dim); else, lb = lb(:)'; end
    if numel(ub) == 1, ub = repmat(ub, 1, dim); else, ub = ub(:)'; end

    % ---- 参数 ----
    F = 0.4;                % 变异因子
    CR = 0.9;               % 交叉概率
    golden_ratio = (1 + sqrt(5)) / 2;

    % ---- 初始化 ----
    Positions = initialization(N, dim, lb, ub);  % 种群
    Fit       = inf(1, N);                       % 适应度(最小化)
    X_NEW     = Positions;
    Fit_NEW   = Fit;

    best_pos   = zeros(1, dim);
    best_score = inf;
    Convergence_curve = zeros(1, Max_iter);

    % ---- 主循环 ----
    iter = 1;
    while iter <= Max_iter

        % 1) 评估与全局最优更新
        for i = 1:N
            Fit_NEW(i) = fobj(X_NEW(i, :));

            if Fit_NEW(i) < Fit(i)
                Fit(i)        = Fit_NEW(i);
                Positions(i,:)= X_NEW(i, :);
            end

            if Fit(i) < best_score
                best_score = Fit(i);
                best_pos   = Positions(i, :);
            end
        end

        % 2) DE 生成下一代
        for i = 1:N
            % 任选三个不同个体
            idx = randperm(N, 3);
            while any(idx == i)
                idx = randperm(N, 3);
            end
            X1 = Positions(idx(1), :);
            X2 = Positions(idx(2), :);
            X3 = Positions(idx(3), :);

            % 变异
            V = X1 + F * (X2 - X3);
            V = boundConstraint(V, Positions(i, :), lb, ub);

            % 交叉(binomial)
            j_rand = randi(dim);
            U = Positions(i, :);
            for j = 1:dim
                if rand <= CR || j == j_rand
                    U(j) = V(j);
                end
            end

            % 引入 golden-ratio 惯性权重
            w = (0.5 + rand / 2) * golden_ratio;
            X_NEW(i, :) = w * U + (1 - w) * Positions(i, :);

            % 范围约束
            X_NEW(i, :) = boundConstraint(X_NEW(i, :), Positions(i, :), lb, ub);
        end

        % 3) 多样性维护:每 10 代重启 10%
        if mod(iter, 10) == 0
            num_to_restart = ceil(N * 0.1);
            restart_idx = randperm(N, num_to_restart);
            Positions(restart_idx, :) = initialization(num_to_restart, dim, lb, ub);
            Fit(restart_idx) = inf;
        end

        % 4) 精英保留(1 个)
        elite_count = 1;
        [~, sort_idx] = sort(Fit);
        elite_positions = Positions(sort_idx(1:elite_count), :);
        elite_fitness   = Fit(sort_idx(1:elite_count));
        Positions(end-elite_count+1:end, :) = elite_positions;
        Fit(end-elite_count+1:end)          = elite_fitness;

        % 5) 最优解的坐标邻域局部搜索(逐维扰动)
        for d = 1:dim
            local_pos = best_pos;
            perturb = 0.1 * (ub(d) - lb(d));                 % 10% 扰动
            local_pos(d) = local_pos(d) + (2*rand - 1)*perturb;
            local_pos = boundConstraint(local_pos, best_pos, lb, ub);

            local_fit = fobj(local_pos);
            if local_fit < best_score
                best_score = local_fit;
                best_pos   = local_pos;
            end
        end

        % 记录收敛曲线
        Convergence_curve(iter) = best_score;

        % 控制台日志
        fprintf('NIADE: t=%d  best=%.6g\n', iter, best_score);

        iter = iter + 1;
    end
end


% ----------------- 工具函数 -----------------

function newPos = boundConstraint(newPos, oldPos, lb, ub)
% 将越界维度回退到 oldPos 的对应分量
% 支持行向量或矩阵输入(每行一个个体)

    rows = size(newPos, 1);
    xl = repmat(lb, rows, 1);
    xu = repmat(ub, rows, 1);

    if isvector(oldPos)
        oldRep = repmat(oldPos, rows, 1);
    else
        oldRep = oldPos;
    end

    lowMask  = newPos < xl;
    highMask = newPos > xu;

    newPos(lowMask)  = oldRep(lowMask);
    newPos(highMask) = oldRep(highMask);
end


function Positions = initialization(SearchAgents_no, dim, lb, ub)
% 在 [lb, ub] 区间均匀随机初始化
    if numel(lb) == 1, lb = repmat(lb, 1, dim); end
    if numel(ub) == 1, ub = repmat(ub, 1, dim); end
    delta = repmat(ub - lb, SearchAgents_no, 1);
    LBmat = repmat(lb, SearchAgents_no, 1);
    Positions = rand(SearchAgents_no, dim) .* delta + LBmat;
end

Fan S, Wang R, Song Y, Crosbee D, Su K. Nature-Inspired Adaptive Differential Evolution: A Unified Meta-Heuristic Framework for Complex Engineering Optimisation and UAV Path Planning[J]. Results in Engineering, 2025, 106530. https://doi.org/10.1016/j.rineng.2025.106530


网站公告

今日签到

点亮在社区的每一天
去签到