GWO灰狼优化算法以及Matlab代码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


GWO灰狼算法原理

灰狼算法:种群个体的位置更新主要是跟随alpha、beta、delta三只头狼的所在位置进行迭代更新。
灰狼种群结构:
在这里插入图片描述

进化更新

Xp为猎物的位置,A和C属于系数向量,a是随迭代过程线性减少的数值从2→0
在这里插入图片描述
在这里插入图片描述

位置更新(紧随3只头狼)

X(t+1)为狼个体紧随头狼更新后的位置。
在这里插入图片描述

GWO灰狼算法流程图

在这里插入图片描述

GWO优化算法matlab代码

main函数

close all;
clear all;
clc;

% N种群大小
% Dim个体维度
% T最大迭代次数
% ub上界
% lb下界
% X_prey最好的个体
% G_best存储每次迭代后的最好个体的适应度值

N=300;
Dim=30;
T=500;
ub=30;
lb=-30;
[X_prey,G_best]=GWO(Dim,ub,lb,N,T);
figure,
plot(G_best,'Color','blue');
xlim([1,500]);

适应度函数

function my_fitness=my_function(X)
%F1测试问题[-100,100] min=0
% o=sum(X.^2);
% my_fitness=o;

%F2测试问题[-10,10] min=0;
% o=sum(abs(X))+prod(abs(X));
% my_fitness=o;


%F3测试问题——结果极差 min=0
% dim=size(X,2);
% o=0;
% for i=1:dim
%     o=o+sum(X(1:i))^2;
% end
% my_fitness=o;

%F4测试问题——结果极差[-100,100] min=0
% o=max(abs(X));
% my_fitness=o;

%F5测试问题[-30,30] min=0
% dim=size(X,2);
% my_fitness=sum(100*(X(2:dim)-(X(1:dim-1).^2)).^2+(X(1:dim-1)-1).^2);

%F6测试问题[-100,100] min=0
o=sum(abs((X+.5)).^2);
my_fitness=o;
end

GWO主体代码

function [X_prey,G_best]=GWO(Dim,ub,lb,N,T)
%% 初始化种群
Pop=zeros(N,Dim);
for i=1:N
    for j=1:Dim
    Pop(i,j)=lb+rand().*(ub-lb);
    end
end
X_prey=zeros(T,Dim);
%% 初始化
% 计算所有个体的适应度
for i=1:N
    fitness(i)=my_function(Pop(i));
end
    % 种群进行分等级排序
    [sort_fitness,sort_index]=sort(fitness);
    % 更新alpha、beta、delta狼个体
    X_alpha=Pop(sort_index(1),:);
    X_beta=Pop(sort_index(2),:);
    X_delta=Pop(sort_index(3),:); 
%% 进化操作
for t=1:T
    a=2-t*(2/T);
    for i=1:N
        for j=1:Dim
            % 跟随alpha、beta、delta
            r1=rand();
            r2=rand();
            A1=2.*a.*r1-a;
            C1=2.*r2;
            D_alpha=abs(C1.*X_alpha(j)-Pop(i,j));
            X_one(i,j)=X_alpha(j)-A1.*D_alpha;
            
            r1=rand();
            r2=rand();
            A2=2.*a.*r1-a;
            C2=2.*r2;
            D_beta=abs(C2.*X_beta(j)-Pop(i,j));
            X_two(i,j)=X_delta(j)-A2.*D_beta;

            r1=rand();
            r2=rand();
            A3=2.*a.*r1-a;
            C3=2.*r2;
            D_delta=abs(C3.*X_delta(j)-Pop(i,j));
            X_three(i,j)=X_delta(j)-A3.*D_delta;

            % 跟随3只头狼,新的个体位置
            X_new(i,j)=(X_one(i,j)+X_two(i,j)+X_three(i,j))./3;
        end
    end
    % 计算所有个体的适应度值
    for i=1:N
        Flag4Up=X_new(i,:)>ub;
        Flag4Lp=X_new(i,:)<lb;
        X_new(i,:)=(X_new(i,:).*(~(Flag4Up+Flag4Lp)))+Flag4Up.*ub+Flag4Lp.*lb;%修正
        y=my_function(X_new(i,:));
        if y<my_function(Pop(i,:))
            fitness(i)=y;
            Pop(i,:)=X_new(i,:);%替换个体
        end
    end   
    % 种群进行分等级排序
    [sort_fitness,sort_index]=sort(fitness);
    % 更新alpha、beta、delta狼个体
    X_alpha=Pop(sort_index(1),:);
    X_beta=Pop(sort_index(2),:);
    X_delta=Pop(sort_index(3),:);
    X_prey(t,:)=X_alpha;
    G_best(t)=my_function(X_alpha);%每次迭代最好的个体的适应度值
end
end

测试结果F1~ F6测试问题

F1
在这里插入图片描述
F2
在这里插入图片描述
F3
在这里插入图片描述
F4
在这里插入图片描述
F5
在这里插入图片描述
F6
在这里插入图片描述

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是灰狼算法Matlab 代码实现: ```matlab function [bestSol, bestFit] = grey_wolf_optimizer(objFunc, dim, lb, ub, maxIter, numPack, alpha, beta, delta) % 参数说明: % objFunc:目标函数句柄 % dim:变量维度 % lb:变量下界 % ub:变量上界 % maxIter:最大迭代次数 % numPack:狼群数量 % alpha、beta、delta:灰狼算法参数 % 初始化狼群位置 positions = repmat(lb, numPack, dim) + rand(numPack, dim) .* repmat((ub-lb), numPack, 1); % 初始化最优解和最优适应度值 bestSol = zeros(1, dim); bestFit = inf; % 迭代 for iter = 1:maxIter % 计算适应度值 fitness = arrayfun(objFunc, positions); % 更新最优解 [minFit, minIdx] = min(fitness); if minFit < bestFit bestSol = positions(minIdx, :); bestFit = minFit; end % 计算每只狼的适应度排名 [sortedFit, rank] = sort(fitness); % 确定 alpha、beta、delta 狼的位置 alphaPos = positions(rank(1), :); betaPos = positions(rank(2), :); deltaPos = positions(rank(3), :); % 更新每只狼的位置 a = 2 - iter * (2 / maxIter); % 衰减系数 for i = 1:numPack x = positions(i, :); r1 = rand(); % 随机向量 r2 = rand(); % 随机向量 A1 = 2 * a * r1 - a; % alpha 狼成分 C1 = 2 * r2; % alpha 狼成分 D_alpha = abs(C1 * alphaPos - x); % alpha 狼距离向量 X1 = alphaPos - A1 * D_alpha; % alpha 狼位置更新 r1 = rand(); % 随机向量 r2 = rand(); % 随机向量 A2 = 2 * a * r1 - a; % beta 狼成分 C2 = 2 * r2; % beta 狼成分 D_beta = abs(C2 * betaPos - x); % beta 狼距离向量 X2 = betaPos - A2 * D_beta; % beta 狼位置更新 r1 = rand(); % 随机向量 r2 = rand(); % 随机向量 A3 = 2 * a * r1 - a; % delta 狼成分 C3 = 2 * r2; % delta 狼成分 D_delta = abs(C3 * deltaPos - x); % delta 狼距离向量 X3 = deltaPos - A3 * D_delta; % delta 狼位置更新 % 更新当前狼的位置 positions(i, :) = (X1 + X2 + X3) / 3; % 边界处理 positions(i, :) = max(positions(i, :), lb); positions(i, :) = min(positions(i, :), ub); end % 输出当前迭代结果 disp(['Iteration ', num2str(iter), ': Best Cost = ', num2str(bestFit)]); end end ``` 使用方法: 定义目标函数句柄,例如 Rosenbrock 函数: ```matlab objFunc = @(x) sum(100 * (x(2:end) - x(1:end-1).^2).^2 + (1 - x(1:end-1)).^2); ``` 调用灰狼算法函数: ```matlab dim = 2; % 变量维度 lb = [-5, -5]; % 下界 ub = [5, 5]; % 上界 maxIter = 100; % 最大迭代次数 numPack = 20; % 狼群数量 alpha = 2; % 灰狼算法参数 beta = 1.5; % 灰狼算法参数 delta = 0.5; % 灰狼算法参数 [bestSol, bestFit] = grey_wolf_optimizer(objFunc, dim, lb, ub, maxIter, numPack, alpha, beta, delta); ``` 其中,`bestSol` 是最优解,`bestFit` 是最优适应度值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JiAngTxone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值