仿生智能优化算法MATLAB实现详解

一、常见仿生优化算法分类

算法名称 核心思想 适用场景 特点
HHO 模拟哈里斯鹰捕食策略 复杂多维优化问题 全局搜索能力强
SSA 模仿樽海鞘群体链式运动 单目标连续优化 收敛速度快
AFSA 模拟鱼类觅食、聚群、追尾行为 动态环境优化 鲁棒性强
CS 基于布谷鸟寄生行为 多模态优化 避免局部最优
GWO 模拟灰狼社会等级制度 高维参数优化 参数少易实现

二、典型算法MATLAB实现

1. 哈里斯鹰算法(HHO)

核心步骤

① 初始化种群与猎物位置

② 计算适应度并更新最优解

③ 基于能量方程切换探索/开发模式

④ 执行软围攻/硬围攻策略更新位置

MATLAB代码(基于改进):

function [Best_pos, Best_score] = HHO(nPop, dim, lb, ub, maxIter, fobj)
    % 参数初始化
    E0 = 2*rand() - 1;  % 初始能量
    Rabbit = mean(rand(nPop,dim) .* (ub-lb) + lb);  % 初始猎物位置
    
    for t = 1:maxIter
        E = 2*E0*(1 - t/maxIter);  % 能量衰减
        
        % 更新所有个体位置
        for i = 1:nPop
            if abs(E) >= 1
                % 全局探索阶段
                q = rand();
                X_rand = rand(1,dim) .* (ub-lb) + lb;
                if q < 0.5
                    newPos = X_rand - rand()*abs(X_rand - 2*rand()*Positions(i,:));
                else
                    newPos = (Rabbit - mean(Positions)) - rand()*((ub-lb)*rand() + lb);
                end
            else
                % 局部开发阶段
                r = rand();
                if r >= 0.5 && abs(E) < 0.5
                    % 硬围攻
                    newPos = Rabbit - E*abs(Rabbit - Positions(i,:));
                else
                    % 软围攻(Levy飞行)
                    beta = 1.5;
                    sigma = (gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
                    u = randn(1,dim)*sigma;
                    v = randn(1,dim);
                    step = u./abs(v).^(1/beta);
                    newPos = Rabbit - E*abs(Jump_strength*Positions(i,:) - Rabbit) + 0.01*step;
                end
            end
            
            % 边界处理
            newPos = max(newPos, lb);
            newPos = min(newPos, ub);
            
            % 更新最优解
            if fobj(newPos) < fitness(i)
                Positions(i,:) = newPos;
                fitness(i) = fobj(newPos);
            end
        end
    end
end
2. 樽海鞘群算法(SSA)

核心步骤

① 初始化领导者和追随者位置

② 领导者向食物源移动

③ 追随者跟随领导者链式移动

④ 动态调整搜索方向

MATLAB代码(基于优化):

function [Leader_pos, Leader_score] = SSA(nPop, dim, lb, ub, maxIter, fobj)
    % 参数设置
    c1 = 1.5;  % 控制探索/开发平衡
    
    % 初始化种群
    Positions = lb + (ub-lb).*rand(nPop,dim);
    Fitness = arrayfun(@(i)fobj(Positions(i,:)), 1:nPop);
    
    % 找到初始最优解
    [Leader_score, Leader_idx] = min(Fitness);
    Leader_pos = Positions(Leader_idx,:);
    
    for t = 1:maxIter
        c1 = 2*exp(-(4*t/maxIter)^2);  % 动态参数
        
        for i = 1:nPop
            if i == 1  % 领导者更新
                newPos = Leader_pos + c1*(ub-lb).*...
                    (2*rand(1,dim) - 1) + c2*(Leader_pos - mean(Positions));
            else        % 追随者更新
                newPos = (Positions(i,:) + Positions(i-1,:))/2;
            end
            
            % 边界处理
            newPos = max(newPos, lb);
            newPos = min(newPos, ub);
            
            % 更新最优解
            newFit = fobj(newPos);
            if newFit < Fitness(i)
                Positions(i,:) = newPos;
                Fitness(i) = newFit;
                if newFit < Leader_score
                    Leader_score = newFit;
                    Leader_pos = newPos;
                end
            end
        end
    end
end
3. 人工鱼群算法(AFSA)

核心步骤

① 觅食行为(局部搜索)

② 聚群行为(群体协作)

③ 追尾行为(最优跟随)

④ 随机行为(避免早熟)

MATLAB代码(基于扩展):

function [Best_pos, Best_score] = AFSA(nFish, lb, ub, maxIter, fobj)
    % 参数设置
    visual = 0.5;  % 视野范围
    step = 0.1;    % 移动步长
    try_num = 5;   % 最大尝试次数
    
    % 初始化鱼群
    Fish = lb + (ub-lb).*rand(nFish,dim);
    Fitness = arrayfun(@(i)fobj(Fish(i,:)), 1:nFish);
    
    for t = 1:maxIter
        for i = 1:nFish
            % 觅食行为
            for j = 1:try_num
                newX = Fish(i,:) + (2*rand(1,dim)-1)*visual;
                newX = max(min(newX, ub), lb);
                if fobj(newX) < Fitness(i)
                    Fish(i,:) = newX;
                    Fitness(i) = fobj(newX);
                    break;
                end
            end
            
            % 聚群行为
            center = mean(Fish);
            if fobj(center) < Fitness(i)
                Fish(i,:) = Fish(i,:) + step*(center - Fish(i,:))/norm(center - Fish(i,:));
            end
            
            % 追尾行为
            [~, bestIdx] = min(Fitness);
            if fobj(bestIdx) < Fitness(i)
                Fish(i,:) = Fish(i,:) + step*(Fish(bestIdx,:) - Fish(i,:))/norm(Fish(bestIdx,:) - Fish(i,:));
            end
        end
    end
end

三、算法性能对比

算法 收敛速度 全局搜索能力 适用维度 参数敏感性
HHO 中等 高维
SSA 中等 中低维 中等
AFSA 低维
GWO 中等 高维

参考代码 仿生智能优化算法matlab程序 www.youwenfan.com/contentcnr/99980.html

四、应用案例:函数优化

测试函数:Rastrigin函数(多峰函数)

fobj = @(x) sum(x.^2 - 10*cos(2*pi*x) + 10);

对比实验

nPop = 30; maxIter = 500; dim = 10;

% HHO
tic; [HHO_pos, HHO_fit] = HHO(nPop,dim,-5.12,5.12,maxIter,fobj); HHO_time = toc;

% SSA
tic; [SSA_pos, SSA_fit] = SSA(nPop,dim,-5.12,5.12,maxIter,fobj); SSA_time = toc;

% AFSA
tic; [AFSA_pos, AFSA_fit] = AFSA(nPop,dim,-5.12,5.12,maxIter,fobj); AFSA_time = toc;

disp(['HHO: ', num2str(HHO_fit), ' (', num2str(HHO_time), 's)']);
disp(['SSA: ', num2str(SSA_fit), ' (', num2str(SSA_time), 's)']);
disp(['AFSA: ', num2str(AFSA_fit), ' (', num2str(AFSA_time), 's)']);

五、参考文献

  1. Heidari A A, et al. Harris Hawks Optimization: Algorithm and Applications[J]. Applied Soft Computing, 2020.

  2. Yang X S. Nature-Inspired Optimization Algorithms[M]. Elsevier, 2014.

  3. 李晓磊. 人工鱼群算法研究与应用[J]. 计算机学报, 2005.

posted @ 2026-02-13 12:22  晃悠人生  阅读(6)  评论(0)    收藏  举报