提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- GWO灰狼算法原理
- 进化更新
- 位置更新(紧随3只头狼)
- GWO灰狼算法流程图
- GWO优化算法matlab代码
- main函数
- 适应度函数
- GWO主体代码
- 测试结果F1~ F6测试问题
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