智能优化算法--灰狼算法

简介

灰狼优化算法(GWO)模拟了自然界灰狼的领导和狩猎层级,在狼群中存在四种角色, α \alpha α狼负责领导是最具有智慧的在狩猎当中可以敏锐的知道猎物的位置, β \beta β狼可以认为是军师比较具有智慧比较能知道猎物的位置, δ \delta δ狼负责协助前两个层级的狼,最后是 ω \omega ω狼负责跟从。
在这里插入图片描述
在狩猎(寻优)的过程中,狼群的这三种层级并不是一成不变的,也会根据各个狼的适应度(fitness)进行调整,适应度最强的狼将会成为新的 α \alpha α狼,其次是 β \beta β狼,依次类推。通过很多次的寻找猎物(寻优)中三个层级逐渐趋于稳定,这个时候我们取 α \alpha α狼的位置作为猎物(最优解)所处的位置。

注意:注意智能优化算法都是在优化函数光滑性较差,容易落入局部最优时才使用的,不要乱用。智能优化算法的收敛是一种概率意义的收敛,所以得到的解并不一定绝对最优,并且往往收敛较慢。

算法

  • Step1: 根据优化的问题,设计fitness函数(目标函数,默认的是极小化问题),设置可行域
  • Step2: 初始化狼群的个数N,每头狼的位置 X i ( i = 1 , . . . , N ) X_i(i=1,...,N) Xi(i=1,...,N),并指定 α , β , δ \alpha,\beta,\delta α,β,δ狼的位置 X α , X β , X δ X_\alpha,X_\beta,X_\delta Xα,Xβ,Xδ, 以及它们对应的适应度 f α , f β , f δ = f_\alpha,f_\beta,f_\delta= fα,fβ,fδ=inf.
  • Step3: 依次更新每头狼的位置。对于第 i i i头狼,计算其与 α , β , δ \alpha,\beta,\delta α,β,δ狼的距离
    D α = ∣ C 1 ∘ X α − X i ∣ , D β = ∣ C 2 ∘ X β − X i ∣ , D δ = ∣ C 3 ∘ X δ − X i ∣ , \begin{aligned} D_\alpha=|C_1\circ X_\alpha-X_i|,\\ D_\beta=|C_2\circ X_\beta-X_i|,\\ D_\delta=|C_3\circ X_\delta-X_i|,\\ \end{aligned} Dα=C1XαXi,Dβ=C2XβXi,Dδ=C3XδXi,
    并产生向三头狼移动的趋势项
    Q 1 = X α − A 1 ∘ D α , Q 2 = X β − A 2 ∘ D β , Q 3 = X δ − A 3 ∘ D δ , \begin{aligned} Q_1=X_\alpha-A_1\circ D_\alpha,\\ Q_2=X_\beta-A_2\circ D_\beta,\\ Q_3=X_\delta-A_3\circ D_\delta,\\ \end{aligned} Q1=XαA1Dα,Q2=XβA2Dβ,Q3=XδA3Dδ,
    其中, ∘ \circ 表示hardmard乘积, r 1 , r 2 ∼ r_1,r_2\sim r1,r2 Unif([0,1]), A i = a ( 2 r 1 − 1 ) , C i = 2 r 2 ( i = 1 , 2 , 3 ) A_i=a(2r_1-1),C_i=2r_2(i=1,2,3) Ai=a(2r11),Ci=2r2(i=1,2,3) a = 2 ( 1 − t / T ) a=2(1-t/T) a=2(1t/T)(t是当前迭代次数,T是最大迭代次数)。如果 A i , C i A_i,C_i Ai,Ci是分量,则每个分量都独立生成,以上运算按照广播规则。最后可以得到第 i i i头狼的位置更新为
    X i ← 1 3 ( Q 1 + Q 2 + Q 3 ) . \begin{aligned} X_i\leftarrow \frac{1}{3}(Q_1+Q_2+Q_3). \end{aligned} Xi31(Q1+Q2+Q3).
  • Step4:不断重复Step3直至 α \alpha α狼群的位置稳定。

二进制灰狼算法

  • Step1: 根据优化的问题,设计fitness函数(目标函数,默认的是极小化问题),设置可行域
  • Step2: 初始化狼群的个数N,每头狼的位置 X i ( i = 1 , . . . , N ) X_i(i=1,...,N) Xi(i=1,...,N),并指定 α , β , δ \alpha,\beta,\delta α,β,δ狼的位置 X α , X β , X δ X_\alpha,X_\beta,X_\delta Xα,Xβ,Xδ, 以及它们对应的适应度 f α , f β , f δ = f_\alpha,f_\beta,f_\delta= fα,fβ,fδ=inf.
  • Step3: 依次更新每头狼的位置。对于第 i i i头狼,计算其与 α , β , δ \alpha,\beta,\delta α,β,δ狼的距离
    D α = ∣ C 1 ∘ X α − X i ∣ , D β = ∣ C 2 ∘ X β − X i ∣ , D δ = ∣ C 3 ∘ X δ − X i ∣ , \begin{aligned} D_\alpha=|C_1\circ X_\alpha-X_i|,\\ D_\beta=|C_2\circ X_\beta-X_i|,\\ D_\delta=|C_3\circ X_\delta-X_i|,\\ \end{aligned} Dα=C1XαXi,Dβ=C2XβXi,Dδ=C3XδXi,
    并产生向三头狼移动的趋势项
    Q 1 = X α − A 1 ∘ D α , Q 2 = X β − A 2 ∘ D β , Q 3 = X δ − A 3 ∘ D δ , \begin{aligned} Q_1=X_\alpha-A_1\circ D_\alpha,\\ Q_2=X_\beta-A_2\circ D_\beta,\\ Q_3=X_\delta-A_3\circ D_\delta,\\ \end{aligned} Q1=XαA1Dα,Q2=XβA2Dβ,Q3=XδA3Dδ,
    其中, ∘ \circ 表示hardmard乘积, r 1 , r 2 ∼ r_1,r_2\sim r1,r2 Unif([0,1]), A i = a ( 2 r 1 − 1 ) , C i = 2 r 2 ( i = 1 , 2 , 3 ) A_i=a(2r_1-1),C_i=2r_2(i=1,2,3) Ai=a(2r11),Ci=2r2(i=1,2,3) a = 2 ( 1 − t / T ) a=2(1-t/T) a=2(1t/T)(t是当前迭代次数,T是最大迭代次数)。如果 A i , C i A_i,C_i Ai,Ci是分量,则每个分量都独立生成,以上运算按照广播规则。最后可以得到第 i i i头狼的位置更新为
    X i ← { 1 , i f s i g m o i d { 1 3 ( Q 1 + Q 2 + Q 3 ) } ≥ z 0 , o t h e r w i s e . \begin{aligned} X_i\leftarrow \begin{cases} 1,\quad if\quad sigmoid\left\{\frac{1}{3}(Q_1+Q_2+Q_3)\right\}\geq z\\ 0,\quad otherwise. \end{cases} \end{aligned} Xi{1,ifsigmoid{31(Q1+Q2+Q3)}z0,otherwise.
    其中, z ∼ z\sim zunif([0,1]), sigmoid(x)= 1 1 + e − 10 ( x − 0.5 ) \frac{1}{1+e^{-10(x-0.5)}} 1+e10(x0.5)1.
  • Step4:不断重复Step3直至 α \alpha α狼群的位置稳定。
  • 在这里插入图片描述

代码

clear;clc;
% 狼群数量
SearchAgents_no = 30;
% 最大迭代次数
Max_iter = 200;
% 变量维度
dim = 2;
% 上限
ub = 10 * ones(1, dim);
% 下限
lb = -10 * ones(1, dim);
%%%%% 初始化
Alpha_pos = zeros(1, dim);
Alpha_score = inf;
Beta_pos = zeros(1, dim);
Beta_score = inf;
Delta_pos = zeros(1, dim);
Delta_score = inf;
% 初始化位置
Positions = rand(SearchAgents_no, dim) .* repmat(ub - lb, SearchAgents_no, 1) + repmat(lb, SearchAgents_no, 1);
Convergence_curve = zeros(1, Max_iter);
% 主循环
for l = 1 : Max_iter
    for i = 1:SearchAgents_no
        % 边界处理:越界赋值为边界值
        Flag4ub = Positions(i, :) > ub;
        Flag4lb = Positions(i, :) < lb;
        Positions(i, :) = (Positions(i, :) .* (~(Flag4ub + Flag4lb))) + ub .* Flag4ub + lb .* Flag4lb;      
        % 计算目标函数
        fitness = ObjFun(Positions(i, :));        
        % 更新 Alpha、Beta 和 Delta
        if fitness < Alpha_score
            Alpha_score = fitness;
            Alpha_pos = Positions(i, :);
        end 
        if fitness > Alpha_score && fitness < Beta_score
            Beta_score = fitness;
            Beta_pos = Positions(i, :);
        end
        if fitness > Alpha_score && fitness > Beta_score && fitness < Delta_score
            Delta_score = fitness;
            Delta_pos = Positions(i, :);
        end
    end
    % 线性递减
    a = 2 - l * 2 / Max_iter;  
    % 更新位置
    for i = 1 : SearchAgents_no
        for j = 1: dim
            %%%%% 更新策略
            r1 = rand();
            r2 = rand();
            A1 = 2*a*r1 - a;
            C1 = 2*r2;
            D_alpha = abs(C1*Alpha_pos(j) - Positions(i, j));
            X1 = Alpha_pos(j) - A1*D_alpha;

            r1 = rand();
            r2 = rand();            
            A2 = 2*a*r1 - a;
            C2 = 2*r2;
            D_beta = abs(C2*Beta_pos(j) - Positions(i, j));
            X2 = Beta_pos(j) - A2*D_beta;
            
            r1 = rand();
            r2 = rand();
            A3 = 2*a*r1 - a;
            C3 = 2*r2;
            D_delta = abs(C3*Delta_pos(j) - Positions(i, j));
            X3 = Delta_pos(j) - A3*D_delta;
            
            Positions(i, j) = (X1 + X2 + X3) / 3;
        end
    end
    Convergence_curve(l) = Alpha_score;
end
disp(['最优值:' num2str(Alpha_pos)]);
disp(['最优值对应目标函数:' num2str(Convergence_curve(end))]);
subplot(1, 2, 1)
plot(Convergence_curve, 'LineWidth', 2);
xlabel('迭代次数');
ylabel('适应度值');
title('适应度曲线');
len = 50;
xRange = linspace(lb(1), ub(1), len);
yRange = linspace(lb(2), ub(2), len);
[xMap, yMap] = meshgrid(xRange, yRange);
zMap = zeros(len);
for i = 1 : len
    for j = 1 : len
        zMap(i, j) = ObjFun([xMap(i, j), yMap(i, j)]);
    end
end
subplot(1, 2, 2)
surf(xRange, yRange, zMap);
view(-45, -45);
shading interp
hold on
plot3(Alpha_pos(1), Alpha_pos(2), ObjFun(Alpha_pos), 'o', 'MarkerFaceColor', 'r', 'MarkerSize', 10);
hold off
set(gcf, 'Position', [400, 200, 900, 400]);

function result = ObjFun(x)
x1 = x(1);
x2 = x(2);
t = x1^2 + x2^2;
result = 0.5 + (sin(sqrt(t))^2 - 0.5) / (1 + 0.001 * t)^2;
end

在这里插入图片描述

参考文献

https://zhuanlan.zhihu.com/p/416365776
https://zhuanlan.zhihu.com/p/361705758
张晓凤, 王秀英. 灰狼优化算法研究综述[J]. 计算机科学, 2019, 046(003):30-38.
Mirjalili S, Mirjalili SM, Lewis A. Grey wolf optimizer. Adv Eng Software 2014;69:46–61

  • 5
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值